Apple SiliconでのCore MLを使用した安定した拡散を利用する
使用するApple SiliconのCore MLを使って、安定した拡散を実現する
Appleのエンジニアのおかげで、Core MLを使用してApple SiliconでStable Diffusionを実行できるようになりました!
このAppleのレポジトリは、🧨 Diffusersを基にした変換スクリプトと推論コードを提供しており、私たちはそれが大好きです!できるだけ簡単にするために、私たちは重みを変換し、モデルのCore MLバージョンをHugging Face Hubに保存しました。
更新:この投稿が書かれてから数週間後、私たちはネイティブのSwiftアプリを作成しました。これを使用して、自分自身のハードウェアでStable Diffusionを簡単に実行できます。私たちはMac App Storeにアプリをリリースし、他のプロジェクトがそれを使用できるようにソースコードも公開しました。
この投稿の残りの部分では、変換された重みを自分自身のコードで使用する方法や、追加の重みを変換する方法について説明します。
- GPT2からStable Diffusionへ:Hugging FaceがElixirコミュニティに参入します
- 高速なトレーニングと推論 Habana Gaudi®2 vs Nvidia A100 80GB
- モデルカード
利用可能なチェックポイント
公式のStable Diffusionのチェックポイントはすでに変換されて使用できる状態です:
- Stable Diffusion v1.4:変換されたオリジナル
- Stable Diffusion v1.5:変換されたオリジナル
- Stable Diffusion v2 base:変換されたオリジナル
- Stable Diffusion v2.1 base:変換されたオリジナル
Core MLは、デバイスで利用可能なすべての計算ユニット(CPU、GPU、Appleのニューラルエンジン(NE))をサポートしています。また、Core MLはモデルの異なる部分を異なるデバイスで実行してパフォーマンスを最大化することも可能です。
ハードウェアによって異なるパフォーマンスを発揮する可能性がある各モデルのいくつかのバリアントがあります。おすすめは、それらを試して自分のシステムで最もうまく動作するものを選択することです。詳細は以下をご覧ください。
パフォーマンスに関する注意事項
各モデルには次のようないくつかのバリアントがあります:
- 「Original」のアテンション vs 「split_einsum」。これらはクリティカルなアテンションブロックの二つの代替実装です。「split_einsum」は以前にAppleによって導入されたもので、すべての計算ユニット(CPU、GPU、Appleのニューラルエンジン)と互換性があります。「original」はCPUとGPUとのみ互換性があります。ただし、一部のデバイスでは「original」の方が「split_einsum」よりも高速に動作する場合もあるので、試してみてください!
- 「ML Packages」 vs 「Compiled」モデル。前者はPythonの推論に適しており、
compiled
バージョンはSwiftのコードに必要です。ハブのcompiled
モデルは、iOSおよびiPadOSデバイスとの互換性のために大規模なUNetモデルの重みを複数のファイルに分割しています。これは--chunk-unet
変換オプションに対応しています。
この時点での私たちのMacBook Pro(M1 Max、32 GPUコア、64 GB)での最良の結果は、次の組み合わせを使用した場合でした:
original
attention。all
compute units(詳細は次のセクションを参照)。- macOS Ventura 13.1 Beta 4(22C5059b)。
これらの組み合わせでは、Core MLバージョンのStable Diffusion v1.4の生成に18秒かかりました 🤯。
⚠️ 注意
macOS Ventura 13.1でCore MLにいくつかの改善が導入され、Appleの実装に必要です。以前のバージョンのmacOSを使用すると、黒い画像や遅い時間が発生する場合があります。
各モデルのレポジトリは、次のようなツリー構造で整理されています:
coreml-stable-diffusion-v1-4
├── README.md
├── original
│ ├── compiled
│ └── packages
└── split_einsum
├── compiled
└── packages
以下のように、必要なバリアントをダウンロードして使用できます。
PythonでのCore ML推論
前提条件
pip install huggingface_hub
pip install git+https://github.com/apple/ml-stable-diffusion
モデルのチェックポイントをダウンロードする
Pythonで推論を実行するには、コンパイル済みのバージョンはSwiftとの互換性がないため、packages
フォルダに保存されているバージョンを使用する必要があります。また、original
またはsplit_einsum
のアテンションスタイルを選択することもできます。
以下は、Hubからoriginal
アテンションのバリアントをダウンロードする方法です:
from huggingface_hub import snapshot_download
from pathlib import Path
repo_id = "apple/coreml-stable-diffusion-v1-4"
variant = "original/packages"
model_path = Path("./models") / (repo_id.split("/")[-1] + "_" + variant.replace("/", "_"))
snapshot_download(repo_id, allow_patterns=f"{variant}/*", local_dir=model_path, local_dir_use_symlinks=False)
print(f"モデルは{model_path}にダウンロードされました")
上記のコードは、ダウンロードしたモデルのスナップショットをmodels
というディレクトリ内に配置します。
推論
モデルのスナップショットをダウンロードしたら、推論を実行する最も簡単な方法は、AppleのPythonスクリプトを使用することです。
python -m python_coreml_stable_diffusion.pipeline --prompt "a photo of an astronaut riding a horse on mars" -i models/coreml-stable-diffusion-v1-4_original_packages -o </path/to/output/image> --compute-unit ALL --seed 93
<output-mlpackages-directory>
は、上記の手順でダウンロードしたチェックポイントを指す必要があり、--compute-unit
は推論に使用するハードウェアを示します。次のオプションのいずれかである必要があります:ALL
、CPU_AND_GPU
、CPU_ONLY
、CPU_AND_NE
。オプションとして出力パスと再現性のためのシードを指定することもできます。
推論スクリプトでは、HubにCompVis/stable-diffusion-v1-4
として保存されているStable Diffusionモデルのオリジナルバージョンを想定しています。別のモデルを使用する場合は、推論のコマンドラインでモデルのHub IDを--model-version
オプションを使用して指定する必要があります。これは、すでにサポートされているモデルや、独自にトレーニングまたはファインチューニングしたカスタムモデルの両方に対して機能します。
Stable Diffusion 1.5の場合(Hub ID:runwayml/stable-diffusion-v1-5
):
python -m python_coreml_stable_diffusion.pipeline --prompt "a photo of an astronaut riding a horse on mars" --compute-unit ALL -o output --seed 93 -i models/coreml-stable-diffusion-v1-5_original_packages --model-version runwayml/stable-diffusion-v1-5
Stable Diffusion 2 baseの場合(Hub ID:stabilityai/stable-diffusion-2-base
):
python -m python_coreml_stable_diffusion.pipeline --prompt "a photo of an astronaut riding a horse on mars" --compute-unit ALL -o output --seed 93 -i models/coreml-stable-diffusion-2-base_original_packages --model-version stabilityai/stable-diffusion-2-base
SwiftでのCore ML推論
Swiftでの推論はPythonでの推論よりもやや高速です。これは、モデルがすでにmlmodelc
形式でコンパイルされているためです。アプリの起動時にモデルが読み込まれるため、アプリの起動時には noticeable な違いがありますが、その後の複数の世代では noticeable な違いはありません。
ダウンロード
MacでSwiftでの推論を実行するには、compiled
のチェックポイントバージョンのいずれかが必要です。Pythonコードを使用して、上記で示したものと似た方法でそれらをローカルにダウンロードすることをお勧めしますが、compiled
のバリアントのいずれかを使用します:
from huggingface_hub import snapshot_download
from pathlib import Path
repo_id = "apple/coreml-stable-diffusion-v1-4"
variant = "original/compiled"
model_path = Path("./models") / (repo_id.split("/")[-1] + "_" + variant.replace("/", "_"))
snapshot_download(repo_id, allow_patterns=f"{variant}/*", local_dir=model_path, local_dir_use_symlinks=False)
print(f"モデルは{model_path}にダウンロードされました")
推論
推論を実行するために、まずAppleのリポジトリをクローンしてください:
git clone https://github.com/apple/ml-stable-diffusion
cd ml-stable-diffusion
そして、Swift Package Managerの機能を使ってAppleのコマンドラインツールを使用してください:
swift run StableDiffusionSample --resource-path models/coreml-stable-diffusion-v1-4_original_compiled --compute-units all "火星で馬に乗っている宇宙飛行士の写真"
前のステップでダウンロードしたチェックポイントのうち、--resource-path
で指定する必要がありますので、コンパイルされたCore MLバンドル(拡張子が.mlmodelc
)が含まれていることを確認してください。 --compute-units
の値は、以下のいずれかである必要があります:all
、cpuOnly
、cpuAndGPU
、cpuAndNeuralEngine
。
詳細については、Appleのリポジトリ内の手順を参照してください。
独自のモデルの使用方法
Stable Diffusionと互換性のある独自のモデルを作成した場合(Dreambooth、Textual Inversion、ファインチューニングなどを使用した場合など)、モデルを自分で変換する必要があります。幸いにも、Appleは変換スクリプトを提供しています。
このタスクでは、以下の手順に従うことをお勧めします。
次のステップ
この新機能がもたらす可能性について非常に興奮しており、コミュニティがここから何を作り出すのかを楽しみにしています。いくつかの潜在的なアイデアは次のとおりです:
- Mac、iPhone、iPad向けのネイティブで高品質なアプリ。
- さらに高速な推論のためのSwift向けの追加のスケジューラ。
- 追加のパイプラインとタスク。
- 量子化技術とさらなる最適化の探求。
皆さんが作り出すものを楽しみにしています!
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