🕌

ライブラリ依存関係で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チャンネル、全依存関係

大まかな流れ

  1. 必要なライブラリをまとめたrequirements.inを作成
  2. 依存関係を解決したrequirements.txtを更新
  3. 環境内にrequirements.txtをインストール

Conda環境利用時の具体例

requirements.inの準備

まずは必要なライブラリをまとめた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

namenew_env_nameenv_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
https://qiita.com/ryu22e/items/ad3f8f3df30886d23661

Discussion