「PIP、Conda、requirements.txtを忘れましょう!代わりにPoetryを使って、私に感謝してください」
Forget PIP, Conda, and requirements.txt! Instead, use Poetry and thank me.
ライブラリAはPython 3.6を必要とします。ライブラリBはライブラリAに依存していますが、Python 3.9が必要であり、ライブラリCはライブラリBに依存していますが、Python 3.6と互換性のある特定のバージョンのライブラリAが必要です。
依存関係地獄へようこそ!
データサイエンスにおいては、外部パッケージなしではネイティブのPythonは使い物にならないため、データサイエンティストは上記のようなジレンマに陥ることがよくあります。
PIPやConda、または笑えるほどのrequirements.txtファイルなどのツールでは、この問題を解決できません。実際には、依存関係の悪夢はそれらの存在のために大いに生じています。そこで、Pythonのオープンソースコミュニティは、Poetryという魅力的なツールを開発しました。
Poetryは、GitHubで25,000以上のスターを獲得したオールインワンのプロジェクトおよび依存関係管理フレームワークです。この記事では、Poetryを紹介し、データサイエンティストにとって解決する問題をリストアップします。
さあ、始めましょう。
インストール
PoetryはライブラリとしてPIPでインストールすることもできますが、システム全体にインストールすることを推奨します。これにより、いつでもCLIでpoetry
を呼び出すことができます。以下は、Unix系システムおよびWindows WSL2を含むインストールスクリプトを実行するコマンドです。
curl -sSL https://install.python-poetry.org | python3 -
もし、何らかの奇妙な理由でWindows Powershellを使用している場合は、次の適切なコマンドです。
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
Poetryが正しくインストールされたかどうかを確認するには、次のコマンドを実行できます。
$ poetry -v
Poetry (version 1.5.1)
Poetryは、Bash、Fish、Zshなどのさまざまなシェルに対してタブ補完もサポートしています。詳細については、こちらをご覧ください。
1. すべてのプロジェクトに一貫した構造
Poetryはオールインワンのツールであるため、プロジェクトの最初から最後まで使用することができます。
新しいプロジェクトを開始する場合、poetry new プロジェクト名
を実行できます。これにより、ほぼPythonパッケージとしてビルドしてPyPIに公開する準備が整ったデフォルトのディレクトリ構造が作成されます。
$ poetry new binary_classification
Created package binary_classification in binary_classification
$ ls binary_classification
README.md binary_classification pyproject.toml tests
$ tree binary_classification/
binary_classification
├── pyproject.toml
├── README.md
├── binary_classification
│ └── __init__.py
└── tests
└── __init__.py
しかし、データサイエンティストはめったにPythonパッケージを作成しないため、自分でプロジェクトを開始し、poetry init
を呼び出すことをお勧めします。
$ mkdir binary_classification
$ poetry init
CLIはセットアップのためにいくつかの質問をしますが、ほとんどの質問は後で更新できるため、空白のままにしておくことができます。
init
コマンドは、Poetryの最も重要なファイルであるpyproject.toml
を作成します。このファイルにはプロジェクトのメタデータが含まれていますが、最も重要なのは依存関係のリストです。
$ cat pyproject.toml
[tool.poetry]
name = "binary-classification"
version = "0.1.0"
description = "A binary classification project with scikit-learn."
authors = ["Bex Tuychiev "]
readme = "README.md"
packages = [{include = "binary_classification"}]
[tool.poetry.dependencies]
python = "^3.9"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
現在、tool.poetry.dependencies
の下にはPython 3.9のみの依存関係があります(^
は後で学びます)。さらにライブラリを追加しましょう。
pyproject.toml
ファイル内のすべてのフィールドの詳細を知りたい場合は、こちらに移動してください。
2. 依存関係の指定
プロジェクトの依存関係をインストールするために、直接的にはPIPやCondaを使う必要はもうありません。代わりに、poetry add ライブラリ名
コマンドを使用し始めます。
以下に例を示します:
$ poetry add scikit-learn@latest
@latest
フラグを追加すると、PyPIからSklearnの最新バージョンがインストールされます。また、フラグ(制約)なしで複数の依存関係を追加することも可能です:
$ poetry add requests pandas numpy plotly seaborn
add
の美しいところは、指定したパッケージにバージョンの制約がない場合、インストール時にエラーが発生しないすべてのパッケージのバージョンを解決し、すでにpyproject.toml
で指定されている依存関係と照合することです。
$ cat pyproject.toml
[tool.poetry]
...
[tool.poetry.dependencies]
python = "^3.9"
numpy = "^1.25.0"
scikit-learn = "^1.2.2"
requests = "^2.31.0"
pandas = "^2.0.2"
plotly = "^5.15.0"
seaborn = "^0.12.2"
numpy
をv1.24にダウングレードしてみましょう:
$ poetry add numpy==1.24
...
Because seaborn (0.12.2) depends on numpy (>=1.17,<1.24.0 || >1.24.0) ...
version solving failed.
Seabornと衝突するため、Poetryはそれを許しません。これがPIPやcondaだった場合、彼らは喜んでNumpy 1.24をインストールし、私たちに悪夢が始まると微笑みかけるでしょう。
標準のインストールに加えて、Poetryはバージョン制約を定義するための柔軟な構文を提供しています。この構文を使用すると、正確なバージョンを指定したり、バージョン範囲(より大きい、より小さい、またはその間の範囲)を設定したり、メジャー、マイナー、パッチバージョンを固定したりできます。以下の表は、Poetryのドキュメント(MITライセンス)からの例です。
Caret要件:
Tilde要件:
ワイルドカード要件:
さらに高度な制約の指定については、Poetryドキュメントのこのページを参照してください。
3. 環境管理
Poetryの主要な機能の1つは、プロジェクトの環境をグローバルな名前空間から最も効率的な方法で分離することです。
poetry add ライブラリ
コマンドを実行すると、以下のことが起こります:
- 仮想環境が既にアクティブになっている既存のプロジェクト内でPoetryを初期化した場合、
library
はその環境にインストールされます(Conda、venvなどの任意の環境マネージャーである場合があります)。 poetry new
で空のプロジェクトを作成したか、仮想環境がアクティブ化されていない状態でinit
でPoetryを初期化した場合、Poetryは新しい仮想環境を作成します。
2番目のケースが発生すると、結果の環境は/home/user/.cache/pypoetry/virtualenvs/
フォルダー内になります。Pythonの実行ファイルもどこかに存在します。
Poetryで作成された環境がアクティブかどうかを確認するには、poetry env list
を実行します:
$ poetry env list
test-O3eWbxRl-py3.6
binary_classification-O3eWbxRl-py3.9 (アクティブ)
Poetryで作成された環境を切り替えるには、poetry env use
コマンドを実行します:
$ poetry env use other_env
環境管理について詳しくは、こちらを参照してください。
4. 完全に再現可能なプロジェクト
add
コマンドを実行すると、Poetryはpoetry.lock
ファイルを生成します。バージョン制約ではなく、使用しているライブラリの正確なバージョンを指定します。たとえば、1.2.*
ではなく、1.2.11
などです。その後のpoetry add
またはpoetry update
の実行では、変更を反映するためにロックファイルが修正されます。
このようなロックファイルを使用することで、プロジェクトを使用する人々が環境を完全に再現できるようになります。
人々は従来、requirements.txt
などの代替手段を使用してきましたが、その形式は非常に緩くエラーが発生しやすいです。典型的な人間が作成したrequirements.txt
は、使用しているライブラリの正確なバージョンをリストアップすることは滅多になく、バージョン範囲を指定したり、さらにはライブラリ名だけを記述したりします。
それから他の人がpip install -r requirements.txt
で環境を再現しようとすると、PIP自体がバージョン制約を解決しようとするため、静かに依存関係の地獄に陥ることになります。
Poetryとロックファイルを使用すると、そうしたことは一切起こりません。したがって、既にrequirements.txt
が存在するプロジェクトでPoetryを初期化する場合は、次のコマンドを使用して依存関係を追加できます:
$ poetry add `cat requirements.txt`
そして、requirements.txt
を削除します。
ただし、StreamlitやHerokuなどの一部のサービスでは、古いrequirements.txt
ファイルがデプロイに必要です。それらを使用する場合は、次のコマンドを使用してpoetry.lock
ファイルをテキスト形式にエクスポートできます:
$ poetry export --output requirements.txt
実行するワークフロー
この記事では、Poetryをデータプロジェクトに統合するためのステップバイステップのワークフローを紹介します。
ステップ0:システムにPoetryをインストールします。
ステップ1:新しいプロジェクトを作成し、poetry init
を呼び出してPoetryを初期化します。後でプロジェクトをPythonパッケージに変換する場合は、poetry new project_name
でプロジェクトを作成します。
ステップ2:依存関係をインストールして追加します。 poetry add lib_name
で手動でpyproject.toml
を編集し、[tool.poetry.dependencies]
セクションの下に依存関係を追加することも可能です。この場合は、バージョン制約を解決し、ライブラリをインストールするためにpoetry install
を実行する必要があります。
このステップの後、Poetryはプロジェクトのために仮想環境を作成し、poetry.lock
ファイルを生成します。
ステップ3:GitやDVCなどの他のツールを初期化し、適切なファイルをトラックします。 pyproject.toml
とpoetry.lock
ファイルをGitの下に配置します。
ステップ4:コードとモデルを開発します。Pythonスクリプトを実行するには、poetry run python script.py
を使用してPoetryの仮想環境が使用されるようにします。
ステップ5:コードをテストし、必要な調整を行います。データ分析や機械学習アルゴリズムを反復し、さまざまなテクニックを試し、必要に応じてコードを洗練させます。
オプションの手順:
- すでにインストールされている依存関係を更新するには、
poetry update library
コマンドを使用します。update
はpyproject.toml
内の制約条件内でのみ機能するため、ここで注意事項を確認してください。 - requirements.txtを使用してプロジェクトを開始する場合は、
poetry add cat requirements.txt
を使用して依存関係を自動的に追加およびインストールします。 - poetry.lockファイルをエクスポートする場合は、
poetry export --output requirements.txt
を使用できます。 - プロジェクトのパッケージ構造を選択した場合(
poetry add
)、poetry build
でパッケージをビルドし、PyPIにプッシュする準備ができます。 - 仮想環境を切り替えるには、
poetry env use other_env
を使用します。
これらの手順により、依存関係の地獄に陥ることはありません。
お読みいただきありがとうございます!
Bex Tuychievは、VoAGIのトップ10 AIライターであり、15,000人以上のフォロワーを持つKaggleマスターです。彼は、辛辣なスタイルを持った複雑なデータサイエンスや機械学習のトピックに関する詳細なガイド、チュートリアル、ノートブックを執筆することが大好きです。
オリジナル記事。許可を得て再投稿しました。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles