導入:venvstacks:レイヤードPython仮想環境

2024-10-31

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

本日、このユーティリティをオープンソース化できることを嬉しく思います。venvstacksの紹介です! [Githubリポジトリ]

venvstacksを使用することで、エンドユーザーがPythonの依存関係をインストールすることなく、PythonアプリケーションであるMLXエンジンをLM Studio内に組み込んで提供することができました。

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環境(基本ランタイム環境、または定義されたランタイム環境のいずれかに基づくレイヤード仮想環境)に変換するステップを実行します。環境が明示的にロックされていない場合、ビルドステップは必要に応じてそれらをロックします。

このコマンドは「ビルドパイプライン」コマンドでもあり、ロック、ビルド、公開を単一のステップで実行できます(詳細はコマンドラインヘルプを参照)。

環境層アーカイブの公開

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

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

層の定義および公開されたアーティファクトに関するメタデータは、公開されたアーカイブとともに公開されます(与えられた例では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の開発に貢献する最も簡単な方法は、実際に試してみて、その結果を私たちにお知らせいただくことです。何が気に入りましたか、何が気に入らなかったですか、何が完全に壊れましたか?

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

また、venvstacks改善できる方法はすでにたくさんあります。

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

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


Python Packaging Discordサーバーの新しい#venvstacksチャンネルで、venvstacks全般について議論してください。

LM Studio Discordサーバー#dev-chatチャンネルで、LM Studioでのmlx-enginevenvstacksの使用について議論してください。

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