「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への自動変換を説明しました。