導入:venvstacks
:レイヤードPython仮想環境
LM Studio 0.3.4でのApple MLXサポートに関する最近の発表で、私たちは「...個別にダウンロード可能なPythonアプリケーション環境の統合セット」を作成するためのPythonユーティリティについて言及しました。
本日、このユーティリティをオープンソース化できることを嬉しく思います。venvstacks
の紹介です! [Githubリポジトリ]
venvstacks
を使用することで、エンドユーザーがPythonの依存関係をインストールすることなく、PythonアプリケーションであるMLXエンジンをLM Studio内に組み込んで提供することができました。
venvstacksはPyPiで公開されています。$ pip install --user venvstacks
venvstacks
の概要Python向けの機械学習およびAIライブラリは巨大です。本当に巨大です。
— ダグラス・アダムスではない
venvstacks
は、Pythonのsitecustomize.py
環境設定機能を利用して3つの層のPython仮想環境を連結する、新しいvenv
ベースの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
サブコマンドを使用すると、構築された環境を同じシステム上の別の場所にコピーできます。この際、アーカイブの圧縮・展開ステップで適用されるのとほぼ同じフィルタリングステップが適用されます(省略されるのは、最大ファイル変更時間を既知の値に固定するなど、再現可能なビルドに関連する詳細です)。
環境をローカルにエクスポートすると、層アーカイブを公開する場合とほぼ同じメタデータが生成されますが、公開されたアーカイブに特に関連する詳細(サイズや期待されるコンテンツのハッシュなど)は必然的に省略されます。
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-engine
とvenvstacks
の使用について議論してください。
Mac / Windows / Linux版のLM Studioはhttps://lmstudio.dokyumento.jp/downloadからダウンロードしてください。