こんにちは。ナミレリです。みなさん、MacでPythonは使っていますか?
2022/12/1にAppleからCore MLへ最適化されたStable Diffusionが発表され、以前の記事ではmacOS13.0.1でM1/M2のCore MLに最適化されたStable Diffusionを試しました。
Core MLの最適化が適用されたOSはmacOSは13.1(とiOS 16.2)からでしたので、以前の記事では取り急ぎ真のパフォーマンスが発揮される前の準備としてmacOS 13.0.1で試しました。
さて、今回は2022/12/14にリリースされたmacOS13.1でCore MLに最適化されたStable Diffusionを試し爆速になっているのか確認したいと思います。

この記事はこんな人にオススメ
- Appleが発表したStable Diffusionをとりあえず使ってみたい
- Appleが発表したStable Diffusionは本当に爆速なのか?
- 話題のStable Diffusionを試してみたい
- Stable Diffusionを試したいが環境は分けておきたい
- M2 MacBook Air 13.6 インチ(メモリ16GB)
- MacBook Pro 14インチ M1Max(メモリ32GB)
- macOS Ventura 13.1
- pyenv 2.3.8
- Miniforge3-4.10.3-10(Python 3.9.15)

目次
結論
macOS13.1でワクワクしながら試しましたが、結論、私の環境ではmacOS13.0.1の時とあまりパフォーマンスは変わらず爆速というわけではありませんでした。(それでも十分速いです)
ただ、ますますApple siliconのM1やM2に最適化されていくとは思いますし、Apple siliconのM1やM2のGUIから画像生成できるアプリも数多く登場すると思いますので、今後に期待です。
とはいえ、十分速いですしM1/M2のGPUをゴリゴリ使えて楽しいので、以下にmacOS13.1でM1/M2のCore MLに最適化されたStable Diffusionの試し方を書いていきます。
はじめに
そもそもCore MLってなに?
Core MLのMLはMachine Learningの略で公式サイトに下記の記載があります。
https://developer.apple.com/jp/machine-learning/core-ml/
Stable Diffusionの設定ステップ概要
大枠としては下のような流れでセットアップしていきます。pyenvでminiforge3をインストールしてPython 3.9.15を使います。
- STEP
事前準備:brew、pyenv、miniforge3
- STEP
Stable Diffusion用のconda仮想環境を準備する
conda createで仮想環境を構築します
- STEP
CoreMLに最適化されたStable Diffusionを取得する
gitでソースコードを取得します
- STEP
pyenv localを設定する
pyenv localを設定してnumpyとpytorchをcondaでインストールしておきます。
- STEP
Stable Diffusionのセットアップ
Stable Diffusionに必要なライブラリをインストールします。
- STEP
アカウント登録とアクセストークンの取得(https://huggingface.co)
APIにアクセスするためのトークンを取得します
- STEP
Core ML modelへの変換
PyTorchからCore MLのモデルに変換するか、gitで取得します。
- STEP
コマンドラインで画像生成
- STEP
画像生成のプログラム例
【STEP1】事前準備:brew、pyenv、miniforge3
brewのインストール
M1/M2のMacにbrewをインストールしていない方は下記のコマンドでインストールしましょう。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
下記のコマンドを実行して反映させます。YOUR NAMEは環境に合わせて読み替えてください。
echo '# Set PATH, MANPATH, etc., for Homebrew.' >> /Users/YOUR NAME/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/YOUR NAME/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
pyenvのインストール
次に、M1/M2のMacにpyenvをインストールします。まだの方は下記のコマンドでインストールしてください。
brew install pyenv
miniforge3のインストール
先程インストールしたpyenvでminiforge3をインストールします。
pyenv install miniforge3-4.10.3-10
下記のコマンドでminiforge3を有効にし、conda自体をアップデートします。
pyenv global miniforge3-4.10.3-10
conda init zsh
source ~/.zshrc
conda update conda
【STEP2】Stable Diffusion用のconda仮想環境を準備する
それではインストールしたminiforge3のcondaコマンドでCore MLのStable Diffusion用の仮想環境を構築します。仮想環境の名前はcoreml_sd2としています。(以前の記事ではcoreml_stable_diffusionとしました)
conda create -n coreml_sd2 python=3.9 -y
なお、Pythonのバージョンですが公式ではpython=3.8を指定しています。ただpython=3.8とするとRust compilerが必要となり、またPython 3.9.15で問題なく動作するので今回はpython=3.9でconda仮想環境を構築します。
次に、conda activateコマンドで仮想環境をアクティブにします。
conda activate coreml_sd2
【STEP3】CoreMLに最適化されたStable Diffusionを取得する
gitでCoreMLに最適化されたStable Diffusionのソースコードをクローンします。今回はcoreml_sd2というディレクトリを作成してml-stable-diffusionをクローンします。
mkdir ~/coreml_sd2
cd ~/coreml_sd2
git clone https://github.com/apple/ml-stable-diffusion.git
【STEP4】pyenv localを設定する
先程作成したディレクトリcoreml_sd2配下に対してpyenv localでPython環境を設定します。
coreml_sd2配下に対してpyenv localを設定する
pyenv local miniforge3-4.10.3-10/envs/coreml_sd2
pyenv versionsで適用されているか確認します。
pyenv versions
system
3.9.15
3.10.6
3.11.0
* miniforge3-4.10.3-10/envs/coreml_sd2 (set by /Users/u/coreml_sd2/.python-version)
python --versionでpython自体のバージョンを確認します。
python --version
Python 3.9.15
numpyとpytorchをcondaでインストールしておく
numpyは“libblas=*=*accelerate”でインストールしておきたいので、今回はcondaで先にインストールします。numpyのバージョンは1.23.5以下が必要となるので次のコマンドでcondaでインストールします。
conda install numpy==1.23.5 "libblas=*=*accelerate"
pytorchも次のコマンドでcondaでインストールしておきます。
conda install pytorch torchvision torchaudio -c pytorch
ここまでがベースとなる環境構築です。以降、Stable Diffusionのセットアップをしていきます。
【STEP5】Stable Diffusionのセットアップ
それではStable Diffusionのセットアップをしていきます。今いるクローンしたディレクトリでpipコマンドをアップデートして、必要なライブラリを次のコマンドでインストールします。
cd ml-stable-diffusion
pwd
/Users/u/coreml_sd2/ml-stable-diffusion
pip install --upgrade pip
pip install -e .
pip install -e .は依存関係にあるライブラリをインストールしてくれます。
続いて、必要によりdiffusers、transformers、scipyをアップグレードします。
pip install --upgrade diffusers transformers scipy
【STEP6】アカウント作成とアクセストークンの取得
huggingfaceのサイトでアカウントを作成し、HuggingFaceプロファイルでAPIにアクセスするためのトークンを取得します。以前の記事で詳しく書いてますので参照してください。
【STEP7】 Core ML modelへの変換
Core ML modelへの変換について、以前まではHugging Faceから数GBのPyTorch チェックポイントをダウンロードし、さらにPyTorchからCore ML(.mlpackage
)に変換する必要がありましたが、公式にgitでcloneするやり方の記載が加わったので、今回はgitで取得してみます。
ローカルでCore ML(.mlpackage
)に変換する必要がなくなりますね。
git-lfsのインストール
まずはgit-lfsが必要なのでbrewでインストールします。
brew install git-lfs
git-lfsのインストールが無事にされたか確認します。
git lfs install
Updated Git hooks.
Git LFS initialized.
.mlpackage
の取得
git-lfsを使って.mlpackage
を取得します。下記の3つのバージョンが取得できますが、今回はstabilityai/stable-diffusion-2-baseを取得します。作成したcoreml_sd2ディレクトリに取得します。
cd ~/coreml_sd2
pwd
/Users/u/coreml_sd2
stabilityai/stable-diffusion-2-baseを取得
git clone https://huggingface.co/apple/coreml-stable-diffusion-2-base
Cloning into 'coreml-stable-diffusion-2-base'...
remote: Enumerating objects: 143, done.
remote: Counting objects: 100% (143/143), done.
remote: Compressing objects: 100% (95/95), done.
remote: Total 143 (delta 26), reused 126 (delta 19), pack-reused 0
Receiving objects: 100% (143/143), 547.08 KiB | 1.06 MiB/s, done.
Resolving deltas: 100% (26/26), done.
ちなみに、他の2つのバージョンは下のように取得します。今回は上のようにバージョン2でやってみます。
git clone https://huggingface.co/apple/coreml-stable-diffusion-v1-4
# CompVis/stable-diffusion-v1-4
git clone https://huggingface.co/apple/coreml-stable-diffusion-v1-5
# runwayml/stable-diffusion-v1-5
作成したcoreml_sd2にoreml-stable-diffusion-2-baseがcloneされました。
tree -L 1
.
├── coreml-stable-diffusion-2-base
└── ml-stable-diffusion
2 directories, 0 files
下記の4種類がgit cloneされるので、今回はoriginal/packegesを使います。
less README.md
(省略)
coreml-stable-diffusion-2-base
├── original
│ ├── compiled # Swift inference, "original" attention
│ └── packages # Python inference, "original" attention
└── split_einsum
├── compiled # Swift inference, "split_einsum" attention
└── packages # Python inference, "split_einsum" attention
(省略)
【STEP8】コマンドラインで画像生成
いよいよ初の画像生成です。-iで.mlpackageを保存したディレクトリを指定します。また-oで画像を保存するディレクトリを指定します。(今回の保存するディレクトリは~/sd_img/にしました)
cd ml-stable-diffusion
pwd
/Users/u/coreml_sd2/ml-stable-diffusion
promptは"a_high_quality_photo_of_an_astronaut_riding_a_horse_in_space"
python -m python_coreml_stable_diffusion.pipeline --prompt \
"a_high_quality_photo_of_an_astronaut_riding_a_horse_in_space" \
-i ../coreml-stable-diffusion-2-base/original/packages \
-o ~/sd_img --compute-unit CPU_AND_GPU --seed 11 \
--model-version stabilityai/stable-diffusion-2-base

promptは"a_high_quality_photo_of_an_astronaut_riding_a_horse_in_space"

オプション | 説明 |
---|---|
-i | .mlpackageを保存したディレクトリを指定する。 |
-o | 画像を保存するディレクトリを指定する。 |
--model-version | デフォルトはCompVis/stable-diffusion-v1-4 これ以外のモデルを使い場合に指定する。 |
--compute-unit | CPU_AND_GPU、ALL、CPU_AND_NEから指定する。 CPU_AND_GPUが私の環境では一番高速。 |
--num-inference-steps | デフォルトは50 数値を上げると精細な画像が生成される。 |
--scheduler | 実行に使用するスケジューラを指定します。デフォルトはthe diffusers pipeline。 指定するスケジュールは下記から指定する。 DDIM, DPMSolverMultistep, EulerAncestralDiscrete, EulerDiscrete, LMSDiscrete, PNDM |
compute-unitの比較
CPU_AND_GPU、ALL、CPU_AND_NEを上記のコマンドラインでの画像生成時間を比較してみます。
macOSバージョン | CPU_AND_GPU | ALL | CPU_AND_NE |
---|---|---|---|
M1 MAX(macOS13.1) | 45.97 | 2:27.21 | 4:59.88 |
M2 Air(macOS13.1) | 1:15.52 | 1:46.84 | 2:11.82 |
【STEP9】画像生成のプログラム例
https://huggingface.co/docs/diffusers/optimization/mpsを参考にすると便利です。
# make sure you're logged in with `huggingface-cli login`
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-base")
pipe = pipe.to("mps")
# Recommended if your computer has < 64 GB of RAM
pipe.enable_attention_slicing()
#どんな画像にするか
prompt = "a_high_quality_photo_of_an_astronaut_riding_a_horse_in_space"
# First-time "warmup" pass (see explanation above)
_ = pipe(prompt, num_inference_steps=1)
# Results match those from the CPU device after the warmup pass.
image = pipe(prompt).images[0]
#保存するファイル名
image.save(f"test0001.png")
--num-inference-stepsのデフォルトは50ですが上記のスクリプトはnum_inference_steps=1としています。(画像生成のスピードは速いでが画像は粗いです)
参考までに上記スクリプトをtimeでM1 MAXとM2 Airで生成時間を比べてみました。画像が生成され保存されるまでの時間です。
macOSバージョン | 画像生成(秒) |
---|---|
M1 MAX(macOS13.1) stable-diffusion-2-base | 28.55 |
M2 Air(macOS13.1)stable-diffusion-2-base | 1:14.06 |
M1 MAX(macOS13.0.1)stable-diffusion-v1-4 | 33.78 |
最後に
最後まで読んでいただきありがとうございます。今回の【Python】macOS13.1でCore MLのStable Diffusionを試す(爆速なのか?!)はいかがでしたでしょうか。結論、私の環境ではmacOS13.0.1の時とあまりパフォーマンスは変わらず爆速というわけではありませんでした(それでも十分速いです)が、M1/M2のGPUをゴリゴリ使えて楽しいので今後に期待します。
MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。
Amazonの電子書籍読み放題サービス「Kindle Unlimited」でプライム会員を対象に、最初の3か月間を無料体験できるキャンペーンを実施中。マンガ、小説、ビジネス書、雑誌など500万冊から、好きな本を何冊でも読めるキャンペーンです。
初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。
