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にアプリをリリースし、他のプロジェクトがそれを使用できるようにソースコードも公開しました。

この投稿の残りの部分では、変換された重みを自分自身のコードで使用する方法や、追加の重みを変換する方法について説明します。

利用可能なチェックポイント

公式の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は推論に使用するハードウェアを示します。次のオプションのいずれかである必要があります:ALLCPU_AND_GPUCPU_ONLYCPU_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の値は、以下のいずれかである必要があります:allcpuOnlycpuAndGPUcpuAndNeuralEngine

詳細については、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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

ピーター・マッキー、Sonarの開発者担当責任者-インタビューシリーズ

ピーター・マッキーはSonarのDeveloper Relationsの責任者です Sonarは、悪いコードの1兆ドルの課題を解決するプラットフォー...

人工知能

「クリス・サレンス氏、CentralReachのCEO - インタビューシリーズ」

クリス・サレンズはCentralReachの最高経営責任者であり、同社を率いて、自閉症や関連する障害を持つ人々のために優れたクラ...

人工知能

ベイリー・カクスマー、ウォータールー大学の博士課程候補 - インタビューシリーズ

カツマー・ベイリーは、ウォータールー大学のコンピュータ科学学部の博士課程の候補者であり、アルバータ大学の新入教員です...

データサイエンス

「Seerの最高データオフィサーであるDr. Serafim Batzoglouによるインタビューシリーズ」

セラフィム・バツォグルはSeerのチーフデータオフィサーですSeerに加わる前は、セラフィムはInsitroのチーフデータオフィサー...

人工知能

「ElaiのCEO&共同創業者、Vitalii Romanchenkoについてのインタビューシリーズ」

ヴィタリー・ロマンチェンコは、ElaiのCEO兼共同創設者であり、マイク、カメラ、俳優、スタジオの必要なく、個人が一流のビデ...

人工知能

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

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