😺

MacでStable Diffusion(2)

2022/12/27に公開

AppleからリリースされたCore ML Stable Diffusionも試してみました。
https://github.com/apple/ml-stable-diffusion

テスト環境
Model Macbook Pro 14 2021
Chip Apple M1 MaxCPU(高性能コア×8 + 高効率コア×2) GPU(32コア)
Memory 64GB
Storage 4TB
OS macOS Ventura 13.1

インストール

rustを使うらしいのでインストールの確認

% source "$HOME/.cargo/env"
% rustup toolchain list
stable-aarch64-apple-darwin (default)

既にインストールされた環境でしたが、もしrustがインストールされていない場合は

% brew install rust

一応、専用のPython環境を作成しておきます。

% conda create -n coreml_stable_diffusion
% conda activate coreml_stable_diffusion
(coreml_stable_diffusion) % git clone https://github.com/apple/ml-stable-diffusion.git
(coreml_stable_diffusion) % cd ml-stable-diffusion
(coreml_stable_diffusion) % pip install -r requirements.txt
(coreml_stable_diffusion) % pip install -e .

Hugging Faceでユーザー登録を行いトークンを発行してからhuggingface-cliでloginしておきます。
https://huggingface.co/settings/tokens

(coreml_stable_diffusion) % pip install huggingface_hub
(coreml_stable_diffusion) % huggingface-cli login

    _|    _|  _|    _|    _|_|_|    _|_|_|  _|_|_|  _|      _|    _|_|_|      _|_|_|_|    _|_|      _|_|_|  _|_|_|_|
    _|    _|  _|    _|  _|        _|          _|    _|_|    _|  _|            _|        _|    _|  _|        _|
    _|_|_|_|  _|    _|  _|  _|_|  _|  _|_|    _|    _|  _|  _|  _|  _|_|      _|_|_|    _|_|_|_|  _|        _|_|_|
    _|    _|  _|    _|  _|    _|  _|    _|    _|    _|    _|_|  _|    _|      _|        _|    _|  _|        _|
    _|    _|    _|_|      _|_|_|    _|_|_|  _|_|_|  _|      _|    _|_|_|      _|        _|    _|    _|_|_|  _|_|_|_|

    To login, `huggingface_hub` now requires a token generated from https://huggingface.co/settings/tokens .
    
Token: 
Add token as git credential? (Y/n) Y
Token is valid.
Your token has been saved in your configured git credential helpers (osxkeychain).
Your token has been saved to /Users/satoy11/.huggingface/token
Login successful

Tokenのところで発行されたトークンを入力します。

モデル

学習モデルはCoreML形式に変換する必要がありました。

(coreml_stable_diffusion) % python -m python_coreml_stable_diffusion.torch2coreml --convert-unet --convert-text-encoder --convert-vae-decoder --convert-safety-checker -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --chunk-unet

これが一番のデメリットな気がしますが、変換するのにそれほど時間はかかりませんでした。
そのかわり複数のフォルダーとファイルに分割されていて、ファイルサイズがかなり増えてしまいました。

Appleが事前に変換済みの学習モデルの場合だと元素材の5倍ほど容量が増えています。

  • coreml-stable-diffusion-v1-4 21.28GB
  • coreml-stable-diffusion-v1-5 26.46GB
  • coreml-stable-diffusion-2-base 25.56GB

iOSやSwiftで利用しないでpythonで利用するだけであれば、次の2つのオプションを外すことでファイルサイズは削減できるみたいです。
--bundle-resources-for-swift-cli
--chunk-unet

Appleが事前に変換済みのモデルはこちらで提供されています。
https://huggingface.co/apple/coreml-stable-diffusion-v1-4
https://huggingface.co/apple/coreml-stable-diffusion-v1-5
https://huggingface.co/apple/coreml-stable-diffusion-2-base
今のところ2.1は用意されてない模様

CoreML用に変換された学習モデルは用途別にフォルダーが分かれていますが、split_einsumを使用するとMacの計算能力を最大限に引き出せるという事らしい

  • packages Pythonでの利用
  • compiled Swiftからの利用
  • original CPUとGPUに対応
  • split_einsum CPUとGPUに加えてNeural Engineに対応

動作確認

(coreml_stable_diffusion) % python -m python_coreml_stable_diffusion.pipeline --prompt "beautiful night sky, a lot of stars, beautiful, fantancy, vivid, colorful, meteor"  -i ./models/coreml-stable-diffusion-v1-4/split_einsum/packages -o ./output  --compute-unit ALL  --seed 93 --model-version CompVis/stable-diffusion-v1-4

--compute-unit {ALL,CPU_AND_GPU,CPU_ONLY,CPU_AND_NE}
このオプションで計算に使用するリソースをオプションで選べたのでベンチマークしてみました。

--compute-unit ALLだとCPUとGPUだけでなくANE(Apple Neural Engine)も使用されていることがわかりましたが、残念ながら計算速度はCPUとGPUで計算するのが一番早いみたいです。

専用チップなんだからもっと凄い高速に処理できると期待していたので残念… 😅

参考情報

https://qiita.com/MaShunzhe/items/63950679bf54b966ffc4
https://namileriblog.com/python/coreml-stable-diffusion/
https://thwork.net/2022/12/03/coreml_stable_diffusion/
YouTubeのvideoIDが不正ですhttps://youtu.be/2HeMYMZksoY?list=PLBZfUTKSXAFeJF4GWLnxa4twQ6zlrvVbz

Discussion