venvstacksの紹介:レイヤードPython仮想環境

2024-10-31

LM Studio 0.3.4でのApple MLXサポートの最近の発表では、「独立してダウンロード可能なPythonアプリケーション環境の統合セット」を作成するためのPythonユーティリティについて言及しました。

本日、このユーティリティをオープンソース化することを発表します:venvstacksです![GitHubリポジトリ]

venvstacksにより、私たちはMLXエンジン(Pythonアプリケーションです)をLM Studioにバンドルすることができました。これは、エンドユーザーにPythonの依存関係をインストールさせる必要はありません。

venvstacks on pypi

venvstacksはPyPiで公開されています:$ pip install --user venvstacks


venvstacksに会う

Pythonの機械学習およびAIライブラリは大きいです。非常に大きいです。

— ダグラス・アダムスではない

venvstacksは、Pythonのsitecustomize.py環境セットアップ機能を使用して、3つのレイヤーのPython仮想環境を連鎖させる、venvベースの新しいPythonプロジェクトです。

  • 「ランタイム」レイヤー:特定のPythonインタプリタの望ましいバージョンを含む環境
  • 「フレームワーク」レイヤー:望ましいバージョンの主要なPythonフレームワークを含む環境
  • 「アプリケーション」レイヤー:直接起動されるコンポーネントを含む環境

レイヤーは個別にアーカイブおよび公開されますが、それらの依存関係のロックは統合されており、アプリケーションレイヤーはフレームワークレイヤーにインストールされた依存関係を共有でき、フレームワークレイヤーはランタイムレイヤーにインストールされた依存関係を共有できます。

Python環境の構築と公開にvenvstacksを使用する

環境スタックの定義

公開される環境レイヤーは、venvstacks.tomlスタック仕様で定義され、各レイヤー定義の種類ごとに個別のテーブル配列が用意されています。

例えば、以下の仕様は、scikit-learnを共有フレームワークレイヤーとして使用し、ランタイムレイヤーにnumpyをプリインストールした一対のアプリケーションを定義しています。これらはすべて、管理されたPython 3.11ベースのランタイムで実行されます。

[[runtimes]]
name = "[email protected]"
fully_versioned_name = "[email protected]"
requirements = [
    "numpy",
]

[[frameworks]]
name = "sklearn"
runtime = "[email protected]"
requirements = [
    "scikit-learn",
]

[[applications]]
name = "classification-demo"
launch_module = "launch_modules/sklearn_classification.py"
frameworks = ["sklearn"]
requirements = [
    "scikit-learn",
]

[[applications]]
name = "clustering-demo"
launch_module = "launch_modules/sklearn_clustering.py"
frameworks = ["sklearn"]
requirements = [
    "scikit-learn",
]

環境スタックのロック

$ venvstacks lock sklearn_demo/venvstacks.toml

lockサブコマンドは、仕様から定義されたレイヤー要件を取得し、それらを使用して、さまざまなレイヤーが個別に公開でき、ターゲットシステムにデプロイされたときに期待どおりに機能することを保証する、環境スタック全体の完全な解決を行います。ロッキングメカニズムは、下位レイヤーで使用されているモジュールの変更のみが影響を受けるように定義されています。上位レイヤーが下位レイヤーのすべての変更に対して再構築される必要はありません。

環境スタックの構築

$ venvstacks build sklearn_demo/venvstacks.toml

buildサブコマンドは、レイヤースペックとそのロックされた要件を、動作するPython環境(ベースランタイム環境、または定義されたランタイム環境のいずれかに基づくレイヤード仮想環境)に変換するステップを実行します。環境がまだ明示的にロックされていない場合、ビルドステップは必要に応じてロックを実行します。

このコマンドは「ビルドパイプライン」コマンドでもあり、ロック、ビルド、公開を1つのステップで実行できます(詳細についてはコマンドラインヘルプを参照してください)。

環境レイヤーアーカイブの公開

$ venvstacks publish --tag-outputs --output-dir demo_artifacts sklearn_demo/venvstacks.toml

環境が正常にビルドされたら、publishコマンドを使用すると、各レイヤーを別の再現可能なバイナリアーカイブに変換できます。これは、別のシステムに転送し、展開し、展開された環境を使用して含まれるアプリケーションを実行するのに適しています(ターゲットシステム上の展開された場所に環境を正しく再リンクするために、ビルドされたレイヤーアーカイブに埋め込まれたPythonスクリプトを使用する小さな post-installation ステップのみが必要です)。

レイヤー定義と公開された成果物に関するメタデータは、公開されたアーカイブとともに公開されます(提供された例ではdemo_artifacts/__venvstacks__/に)。このメタデータは、入力詳細(ロックされた要件のハッシュや含まれる起動モジュールなど)と出力詳細(ビルドされたレイヤーアーカイブの正確なサイズや正確なハッシュなど)の両方をキャプチャします。

環境スタックのローカルエクスポート

$ venvstacks local-export --output-dir demo_export sklearn_demo/venvstacks.toml

venvstacksの使用を考慮しても、一部のレイヤーアーカイブはかなりのサイズになる可能性があることを考えると(たとえば、完全にビルドされたPyTorchアーカイブは数ギガバイトになります)、レイヤーアーカイブのパックとアンパックにはかなりの時間がかかる場合があります。

レイヤー定義と起動モジュールの詳細の反復処理中にそのオーバーヘッドを回避するために、local-exportサブコマンドを使用すると、ビルドされた環境を同じシステム上の別の場所にコピーできます。アーカイブのパックとアンパックのステップで適用されるものと同じフィルタリングステップのほとんどが適用されます(省略されるのは、再現可能なビルドに関連する詳細であり、最大ファイル変更時間を既知の値にクランプするなど)。

環境をローカルにエクスポートすると、レイヤーアーカイブを公開する場合とほぼ同じメタデータが生成されますが、公開されたアーカイブ(そのサイズや期待されるコンテンツハッシュなど)に固有の詳細は、必然的に省略されます。

LM Studioのvenvstacks

オープンソースのmlx-engineは、LM Studioデスクトップアプリケーションに、アプリケーションレイヤー環境の起動モジュールとしてデプロイされています。これは、必要なランタイムパッケージ依存関係を宣言し、MLXフレームワークレイヤーとCPython 3.11ベースのランタイムレイヤーの上に実行されます。

venvstacksの使用により、LM StudioはMLXフレームワークレイヤーを複製することなく追加のMLXベースの機能、およびPythonランタイムレイヤーを複製することなく追加のPythonベースの機能を紹介できます。

時間の経過とともに、複数のアプリケーション、フレームワーク、さらにはベースランタイムレイヤーを並行して配布できる機能により、LM Studioユーザーに中断を与えることなく、新しいコンポーネントバージョンへのスムーズな移行が可能になります。

自分でvenvstacksを試す

venvstacksの最初のリリースは、Python Package Indexから入手でき、pipx(および同様のツール)でインストールできます。

$ pipx install venvstacks

追加の使用情報については、venvstacksのプロジェクトドキュメントとコマンドラインヘルプを参照してください。

$ venvstacks --help

 Usage: venvstacks [OPTIONS] COMMAND [ARGS]...

 Lock, build, and publish Python virtual environment stacks.

╭─ Options ───────────────────────────────────────────────────────────────────────╮
│ --help          Show this message and exit.                                     │
╰─────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ──────────────────────────────────────────────────────────────────────╮
│ build          Build (/lock/publish) Python virtual environment stacks.         │
│ local-export   Export layer environments for Python virtual environment stacks. │
│ lock           Lock layer requirements for Python virtual environment stacks.   │
│ publish        Publish layer archives for Python virtual environment stacks.    │
╰─────────────────────────────────────────────────────────────────────────────────╯

venvstacks開発への貢献

venvstacksはMITライセンスで提供されており、GitHubで開発されています。

適切なユースケースがある場合、venvstacks開発に貢献する最も簡単な方法は、それを試してみて、その結果を知らせることです。何が気に入りましたか、何が気に入らなかったですか、何がうまくいかなかったですか?

もし何かがうまくいかない場合は、issueをオープンしてください(問題がすでに報告されていない場合)。何かがバグかどうかわからない場合、または単に特定のissueや提案を提出するのではなく、一般的なフィードバックを提供したいだけであれば、以下で言及されているDiscordチャンネルが開発者に直接連絡するための最良の方法です。https://discuss.python.org/「Packaging」カテゴリもフィードバックを提供するのに適した場所です。

また、venvstacksを改善できる多くのアイデアがすでにあります。

それらのアイデアの多くは、私たちが自分で実装する予定であるため記録していますが、興味深いと考えており、含めることに前向きであり、すぐには必要としていないものもあります。

追加情報については、venvstacksの開発者向けドキュメントを参照してください。


Python Packaging Discord Serverの新しい#venvstacksチャンネルでvenvstacksについて一般的に議論してください。

LM Studio Discord Server#dev-chatチャンネルで、LM Studioにおけるmlx-engineおよびvenvstacksの使用について議論してください。

LM Studio for Mac / Windows / Linuxをhttps://lmstudio.dokyumento.jp/downloadからダウンロードしてください。