Anacondaをインストールせずにpipコマンドだけで頑張る

Anacondaをインストールせずにpipコマンドだけで頑張る プログラミング

「Anacondaをインストールしたくない・・・」
「pipコマンドだけで環境を構築したい」
「environment.yamlをrequirements.txtに変換したい」

このような場合には、この記事の内容が参考になります。
この記事では、YAMLファイルをrequirements.txtに変換する方法を解説しています。

本記事の内容

  • Anaconda仮想環境を利用したくない
  • environment.yamlをrequirements.txtに置き換える
  • environment.yamlからequirements.txtへの自動変換

それでは、上記に沿って解説していきます。

Anaconda仮想環境を利用したくない

Anaconda仮想環境とは、condaコマンドで構築された環境です。
conda環境とも呼ばれます。

現在、Anacondaは利用していません。
Pythonを学び始めた当初は、ありがたく利用させてもらいました。

しかし、Pythonに慣れるうちにAnacondaを利用しなくなっていきました。
もともと、conda・pipコマンドの併用は気持ち悪かったです。

それに、なるべくサーバーには不要なモノは入れたくありません。
そのため、デフォルトで利用できるvenvにシフトしていきました。

したがって、次のような手順がGitHubで出てきたらブルーになります。

conda env create -f environment.yaml
conda activate ldm

なぜなら、condaコマンドを利用できませんから。
だからと言って、Anacondaをインストールしようとは思いません。

では、どのように環境を構築しましょうか?
次に、その方法を説明します。

environment.yamlをrequirements.txtに置き換える

例えば、次のようなYAMLファイルがあるとします。

environment.yaml

name: test
channels:
- anaconda
- pytorch
dependencies:
- python=3.6
- pytorch=0.4
- numpy
- scipy
- pip:
  - torchvision
  - dominate
  - visdom
  - Pillow==5.0.0

ここから、不要な記述をカットしていきます。
基本的には、「dependencies」以下が必要になります。

ただし、以下のモノは除外します。

  • python
  • pip
  • setuptools

残ったモノをrequirements.txtに書き込みます。

requirements.txt

pytorch==0.4
numpy
scipy
torchvision
dominate
visdom
Pillow==5.0.0

ここまで用意できれば、pipコマンドでインストール可能になります。
その前に、仮想環境をvenvで構築しておきます。

$ python3 -m venv test
$ source test/bin/activate
(test) $

この状態において、先ほど作成したrequirements.txtを利用します。

(test) $ pip install -r requirements.txt

Anacondaを利用せずに、環境を構築できました。
もちろん、これで問題はありません。

しかし、YAMLファイルの内容が長くなってくると面倒です。
それに、ルールのある記述であれば置き換えの自動化は可能と言えます。

ということで、置き換え処理を自動化するプログラムを作成しました。

environment.yamlからequirements.txtへの自動変換

長めのenvironment.yamlとして、次のファイルを用意します。
これは、実際にGitHubで公開されているファイルです。

environment.yaml

name: ldm
channels:
  - pytorch
  - defaults
dependencies:
  - python=3.8.5
  - pip=20.3
  - cudatoolkit=11.3
  - pytorch=1.11.0
  - torchvision=0.12.0
  - numpy=1.19.2
  - pip:
    - albumentations==0.4.3
    - diffusers
    - opencv-python==4.1.2.30
    - pudb==2019.2
    - invisible-watermark
    - imageio==2.9.0
    - imageio-ffmpeg==0.4.2
    - pytorch-lightning==1.4.2
    - omegaconf==2.1.1
    - test-tube>=0.7.5
    - streamlit>=0.73.1
    - einops==0.3.0
    - torch-fidelity==0.3.0
    - transformers==4.19.2
    - torchmetrics==0.6.0
    - kornia==0.6
    - -e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers
    - -e git+https://github.com/openai/CLIP.git@main#egg=clip
    - -e .

YAMLファイルの読み込みには、次のライブラリを利用します。

準備が出来たら、次のコードを動かしてみましょう。
environment.yamlは、スクリプトを同じディレクトリに配置しておきます。

import yaml
import re

# バージョン指定の有無
version = True
# yamlファイル
yaml_path = "environment.yaml"

with open(yaml_path) as data:
    yaml_obj = yaml.safe_load(data)

    requirements = []
    for dep in yaml_obj['dependencies']:
        if isinstance(dep, str):
            dep_l = re.split('=', dep)
            # 除外対象
            res = re.match('python|pip|setuptools', dep)
            if res is None:
                if version and len(dep_l) == 2:
                    requirements.append(dep_l[0] + '==' + dep_l[1])
                else:
                    requirements.append(dep_l[0])
        else:
            for preq in dep.get('pip', []):
                preq_s = re.sub('>=|<=|>|<|==', '#', preq)
                preq_s_l = re.split('#', preq_s)

                if preq_s_l[0]:
                    res = re.match('-e', preq_s_l[0])
                    if res is None:
                        new_string = preq_s_l[0]
                    else:
                        new_string = preq.lstrip("-e | -e .")
                        new_string = new_string.strip()

                if version:
                    new_string = preq.lstrip("-e | -e .")
                    requirements.append(new_string)
                else:
                    requirements.append(new_string)

with open('requirements.txt', 'w') as fp:
    for requirement in requirements:
        print(requirement, file=fp)

PyYAMLが正常にインストールされていれば、コードは動くはずです。
コードを実行した結果、同じディレクトリ上に次のファイルが作成されています。

requirements.txt

cudatoolkit==11.3
pytorch==1.11.0
torchvision==0.12.0
numpy==1.19.2
albumentations==0.4.3
diffusers
opencv-python==4.1.2.30
pudb==2019.2
invisible-watermark
imageio==2.9.0
imageio-ffmpeg==0.4.2
pytorch-lightning==1.4.2
omegaconf==2.1.1
test-tube>=0.7.5
streamlit>=0.73.1
inops==0.3.0
torch-fidelity==0.3.0
transformers==4.19.2
torchmetrics==0.6.0
kornia==0.6
git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers
git+https://github.com/openai/CLIP.git@main#egg=clip

バージョン指定の不要な場合があります。
その場合は、コード上で次の部分を変更します。
「True」から「False」への変更です。

# バージョン指定の有無
version = False

コードを変更して実行した結果、次のファイルが作成されます。

requirements.txt

cudatoolkit
pytorch
torchvision
numpy
albumentations
diffusers
opencv-python
pudb
invisible-watermark
imageio
imageio-ffmpeg
pytorch-lightning
omegaconf
test-tube
streamlit
einops
torch-fidelity
transformers
torchmetrics
kornia
git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers
git+https://github.com/openai/CLIP.git@main#egg=clip

以上、environment.yamlからequirements.txtへの自動変換を説明しました。

タイトルとURLをコピーしました