「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 ライブラリコマンドを実行すると、以下のことが起こります:

  1. 仮想環境が既にアクティブになっている既存のプロジェクト内でPoetryを初期化した場合、libraryはその環境にインストールされます(Conda、venvなどの任意の環境マネージャーである場合があります)。
  2. 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.tomlpoetry.lockファイルをGitの下に配置します。

ステップ4:コードとモデルを開発します。Pythonスクリプトを実行するには、poetry run python script.pyを使用してPoetryの仮想環境が使用されるようにします。

ステップ5:コードをテストし、必要な調整を行います。データ分析や機械学習アルゴリズムを反復し、さまざまなテクニックを試し、必要に応じてコードを洗練させます。

オプションの手順:

  1. すでにインストールされている依存関係を更新するには、poetry update libraryコマンドを使用します。 updatepyproject.toml内の制約条件内でのみ機能するため、ここで注意事項を確認してください。
  2. requirements.txtを使用してプロジェクトを開始する場合は、poetry add cat requirements.txtを使用して依存関係を自動的に追加およびインストールします。
  3. poetry.lockファイルをエクスポートする場合は、poetry export --output requirements.txtを使用できます。
  4. プロジェクトのパッケージ構造を選択した場合(poetry add)、poetry buildでパッケージをビルドし、PyPIにプッシュする準備ができます。
  5. 仮想環境を切り替えるには、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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

「リオール・ハキム、Hour Oneの共同創設者兼CTO - インタビューシリーズ」

「Hour Oneの共同創設者兼最高技術責任者であるリオール・ハキムは、専門的なビデオコミュニケーションのためのバーチャルヒ...

人工知能

Aaron Lee、Smith.aiの共同設立者兼CEO - インタビューシリーズ

アーロン・リーさんは、Smith.aiの共同創業者兼CEOであり、AIと人間の知性を組み合わせて、24時間365日の顧客エンゲージメン...

人工知能

「15Rockの共同創業者兼CEO、ガウタム・バクシ氏によるインタビューシリーズ」

「ガウタム・バクシは、気候リスク管理とアドバイザリーサービスのグローバルリーダーである15Rockの共同創設者兼CEOですガウ...

機械学習

もし芸術が私たちの人間性を表現する方法であるなら、人工知能はどこに適合するのでしょうか?

MITのポストドクターであるジヴ・エプスタイン氏(SM '19、PhD '23)は、芸術やその他のメディアを作成するために生成的AIを...

人工知能

「コマンドバーの創設者兼CEO、ジェームズ・エバンスによるインタビューシリーズ」

ジェームズ・エバンズは、CommandBarの創設者兼CEOであり、製品、マーケティング、顧客チームを支援するために設計されたAIパ...

人工知能

「Ntropyの共同創設者兼CEO、ナレ・ヴァルダニアンについて - インタビューシリーズ」

「Ntropyの共同創設者兼CEOであるナレ・ヴァルダニアンは、超人的な精度で100ミリ秒以下で金融取引を解析することを可能にす...