Skip to content

CondaとPoetryの併用:機械学習プロジェクトへの実践的アプローチ

問題概要

機械学習プロジェクトにおいて、CondaとPoetryを併用する意義について疑問を持つ開発者が多いです。Condaは環境管理とパッケージ管理の両方を担い、PoetryはPythonパッケージ管理に特化していますが、これらを組み合わせることで以下のメリットが得られます:

  • Conda:CUDAツールキットなどの非Pythonパッケージやシステムレベルの依存関係の管理
  • Poetry:Pythonパッケージの依存関係解決とバージョン管理の高度な機能

推奨される解決策

ハイブリッドアプローチ(Conda環境 + Poetryパッケージ管理)

最も実践的な方法は、Condaを環境マネージャーとして、PoetryをPythonパッケージマネージャーとして使用する方法です。

yaml
name: ml-project
channels:
  - pytorch
  - conda-forge
  - nodefaults  # 再現性確保のため

dependencies:
  - python=3.10.*
  - mamba  # 高速な依存関係解決のため
  - pip
  - cudatoolkit=11.8
  - cudnn
  - poetry=1.*  # バージョン固定で再現性確保
toml
[tool.poetry]
name = "ml-project"
version = "0.1.0"
description = "Machine Learning Project with Conda + Poetry"

[tool.poetry.dependencies]
python = "~3.10"
torch = "2.0.1"  # Condaでインストール済みのバージョンに合わせる
transformers = "^4.30.0"
pandas = "^1.5.0"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

環境構築のワークフロー

bash
# ブートストラップ環境の作成
conda create -p /tmp/bootstrap -c conda-forge mamba conda-lock poetry=1.*
conda activate /tmp/bootstrap

# Condaロックファイルの生成
conda-lock -k explicit --conda mamba

# Poetryの初期化
poetry init --python=~3.10

# CondaでインストールしたパッケージをPoetryに登録
poetry add --lock torch=2.0.1

# ブートストラップ環境の削除
conda deactivate
rm -rf /tmp/bootstrap
bash
# Conda環境の作成
conda create --name ml-project --file conda-linux-64.lock
conda activate ml-project

# Poetryパッケージのインストール
poetry install

代替ソリューション

Pixiを使用する場合(新しい選択肢)

2024年更新

PixiはCondaとPoetryの機能を統合した新しいツールで、以下の利点があります:

  • CondaチャネルとPyPIの両方からのパッケージインストール
  • ロックファイルによる再現性の確保
  • 高速な依存関係解決
  • 複数環境(prod, devなど)の管理
bash
# Pixiのインストール
curl -fsSL https://pixi.sh/install.sh | bash

# プロジェクトの初期化
pixi init ml-project
pixi add python=3.10
pixi add pytorch torchvision torchaudio cudatoolkit=11.8
pixi add --pypi transformers pandas
toml
[project]
name = "ml-project"
version = "0.1.0"
description = "Machine Learning project with Pixi"
channels = ["conda-forge", "pytorch"]
platforms = ["linux-64"]

[dependencies]
python = "3.10.*"
pytorch = "2.0.1"
torchvision = "0.15.2"
torchaudio = "2.0.2"
cudatoolkit = "11.8"

[pypi-dependencies]
transformers = "4.30.0"
pandas = "1.5.3"

ベストプラクティスと注意点

✅ 推奨事項

  1. 環境変数の設定

    bash
    # ユーザーサイトパッケージの影響を排除
    export PYTHONNOUSERSITE=True
  2. バージョン固定

    • CondaとPoetryの両方で同じバージョンを指定
    • ビルド済みパッケージはConda、純PythonパッケージはPoetryで管理
  3. ロックファイルの活用

    • conda-lockでConda環境の再現性を確保
    • poetry.lockでPython依存関係の固定

⚠️ 注意事項

WARNING

  • Poetry 1.2以上はconda-forgeでサポートされていないため、pip経由でのインストールが必要
  • チャネル優先順位の競合を避けるため、nodefaultsを指定
  • 異なるチャネルから同じパッケージが提供される場合、明示的にチャネルを指定

非推奨なアプローチ

以下の方法は問題を引き起こす可能性があります:

  • Conda環境内でpoetry shellpoetry runを使用
  • 同じパッケージをCondaとPoetryの両方で管理
  • チャネル優先順位の設定なしでのデフォルトチャネル使用

パフォーマンス比較

ツール依存関係解決速度非Pythonパッケージロックファイル学習コスト
Condaのみ遅い低め
Poetryのみ速い×中程度
Conda+Poetry中程度高め
Pixi高速中程度

結論

機械学習プロジェクトでは、CondaとPoetryの併用が効果的なソリューションとなります。特に以下のような場合に有効です:

  1. CUDAやシステムライブラリが必要な場合
  2. 再現性の高い環境構築が要求される場合
  3. 複数のプラットフォームに対応する必要がある場合

新しいプロジェクトではPixiの使用を検討する価値がありますが、現時点ではまだ発展途上のツールである点に注意が必要です。

既存のConda環境にPoetryを統合する場合は、ロックファイルの活用とバージョンの一貫性維持に重点を置くことで、安定した開発環境を構築できます。