ライブラリ依存関係でConda環境の更新にハマったのでその対策を残しておく
前書き
頼れる人がいると頼って楽をしてしまいがちなMLエンジニアです。
MLエンジニア1人目として転職したことで、泣きつく相手がいなくなりました。
多分、このような環境の方が自分の潜在能力は解放される気がします。
今回は何かとハマったConda環境の更新に関して書いていきます。
起きた事象
ライブラリのバージョンをrequirements.txt
で管理していました。
新規でライブラリを入れた時に依存関係の衝突が生じ無理矢理改善した結果、環境が壊れて再現出来なくなりました。
対策
必要なライブラリだけを事前にまとめておき、依存関係はpip-toolsに任せる方針にします。
環境の再現性を保ちつつ、依存関係の管理をpip-toolsに委譲しています。
Conda環境を管理するenvironment.yml
ではpip
でインストールするrequirements.txt
の内容も考慮し環境全体を再現できる状態にします。
参考_environment.ymlとrequirements.txtの役割分担
ファイル | 役割 | 内容 |
---|---|---|
requirements.in | 必須ライブラリの定義 | 必要なライブラリのリスト(手動管理) |
requirements.txt | 依存関係の詳細管理 | 全ライブラリの正確なバージョン(自動生成) |
environment.yml | 環境の完全な再現 | 環境名、Pythonバージョン、condaチャンネル、全依存関係 |
大まかな流れ
- 必要なライブラリをまとめた
requirements.in
を作成 - 依存関係を解決した
requirements.txt
を更新 - 環境内に
requirements.txt
をインストール
Conda環境利用時の具体例
requirements.inの準備
まずは必要なライブラリをまとめたrequirements.in
を作成します。
開発中に新規でライブラリを追加する場合もライブラリ名をrequirements.in
に追加していきます。
# テスト関連
pytest
# データ処理・分析
pandas
polars
pyyaml
# 可視化
matplotlib
seaborn
tabulate
# システム・環境
psutil
python-dotenv
# 機械学習
scikit-learn
# 開発環境
jupyterlab
pip-tools
Conda環境の準備
次にConda環境を準備します。
environment.yml
がない場合
conda create -n env_name python=3.10
conda activate env_name
pip-tools
のinstall
pip install pip-tools
environment.yml
がある場合
conda env create -f environment.yml -y
conda activate env_name
requirements.txtの更新
状況に応じて、以下のコマンドを実行し依存関係を解決し、ライブラリのバージョンをrequirements.txt
にまとめます。
日々の開発時(ライブラリのバージョンを更新しなくて良い場合)
pip-compile requirements.in
セキュリティアップデートや定期的なメンテナンス(ライブラリのバージョンを更新したい場合)
pip-compile requirements.in --upgrade
動作確認
現状のConda環境を停止し、
conda deactivate
動作確認用に新規のConda環境を作成し、requirements.txt
からインストールします。
conda create -n new_env_name python=3.10 -y
conda activate new_env_name
pip install -r requirements.txt
この状態で動作確認を実施します。
environment.ymlの更新
次にenvironment.yml
を更新します。
conda env export --no-builds | grep -v "^prefix:" > environment.yml
name
のnew_env_name
をenv_name
に更新して保存します。
git管理している場合は、
requirements.in
requirements.txt
environment.yml
をコミットします。
動作確認用のConda環境の削除
動作確認用のConda環境を停止して削除します。
conda deactivate
conda remove -n new_env_name --all -y
Conda環境の更新
最後に最新のenvironment.yml
を利用して、Conda環境を復元します。
conda env create -f environment.yml -y
conda activate env_name
参考
・pip-tools
Discussion