Amazon オーディブル2ヶ月無料キャンペーン中 5/9まで

【Python】macOS13.1でCore MLのStable Diffusionを試す(爆速なのか?!)

10 min

こんにちは。ナミレリです。みなさん、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を試したいが環境は分けておきたい
この記事のMac環境
  • 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)
Parallels 19 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。
NEW Parallels Desktop 19 for Mac

Parallels Desktop 19 for Macは、M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

14日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

結論

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の試し方を書いていきます。

Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

Amazon オーディブル:2ヶ月無料キャンペーン中(5/9まで)→ 詳しくはこちら

はじめに

そもそもCore MLってなに?

Core MLのMLはMachine Learningの略で公式サイトに下記の記載があります。
https://developer.apple.com/jp/machine-learning/core-ml/

Stable Diffusionの設定ステップ概要

大枠としては下のような流れでセットアップしていきます。pyenvminiforge3をインストールしてPython 3.9.15を使います。

  1. STEP

    事前準備:brew、pyenv、miniforge3

  2. STEP

    Stable Diffusion用のconda仮想環境を準備する

    conda createで仮想環境を構築します

  3. STEP

    CoreMLに最適化されたStable Diffusionを取得する

    gitでソースコードを取得します

  4. STEP

    pyenv localを設定する

    pyenv localを設定してnumpypytorchcondaでインストールしておきます。

  5. STEP

    Stable Diffusionのセットアップ

    Stable Diffusionに必要なライブラリをインストールします。

  6. STEP

    アカウント登録とアクセストークンの取得(https://huggingface.co

    APIにアクセスするためのトークンを取得します

  7. STEP

     Core ML modelへの変換

    PyTorchからCore MLのモデルに変換するか、gitで取得します。

  8. STEP

    コマンドラインで画像生成

  9. 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)"

brewの詳しい使い方は下の記事をぜひ参考にしてください。

pyenvのインストール

次に、M1/M2のMacにpyenvをインストールします。まだの方は下記のコマンドでインストールしてください。


brew install pyenv

pyenvの詳しい使い方は下の記事をぜひ参考にしてください。

miniforge3のインストール

先程インストールしたpyenvminiforge3をインストールします。


pyenv install miniforge3-4.10.3-10

下記のコマンドでminiforge3を有効にし、conda自体をアップデートします。


pyenv global miniforge3-4.10.3-10
conda init zsh
source ~/.zshrc
conda update conda

condaコマンドをzshで補完する方法を紹介しています。

【STEP2】Stable Diffusion用のconda仮想環境を準備する

それではインストールしたminiforge3condaコマンドで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.9conda仮想環境を構築します。

次に、conda activateコマンドで仮想環境をアクティブにします。


conda activate coreml_sd2

condaのコマンドをzshで補完したい方は下記の記事も合わせてご覧ください。
Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

Amazon オーディブル:2ヶ月無料キャンペーン中(5/9まで)→ 詳しくはこちら

【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

numpypytorchcondaでインストールしておく

numpypytorchcondaでインストールしますが、condaでインストールしなくても後ほどpipでインストールされますので飛ばしていただいても問題ありません。

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 .は依存関係にあるライブラリをインストールしてくれます。

続いて、必要によりdiffuserstransformersscipyをアップグレードします。


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)に変換する必要がありましたが、公式gitcloneするやり方の記載が加わったので、今回はgitで取得してみます。

ローカルでCore ML(.mlpackage)に変換する必要がなくなりますね

git-lfsのインストール

まずはgit-lfsが必要なのでbrewでインストールします。


brew install git-lfs

git-lfsGit Large File Storageの略で、サイズの大きなデータをgitで扱うための拡張モジュールです。

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_sd2oreml-stable-diffusion-2-basecloneされました。


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

初回は16個の合計数GBのファイルをダウンロードします。

初回実行時のダウンロード
初回実行時のダウンロード

prompt"a_high_quality_photo_of_an_astronaut_riding_a_horse_in_space"

モデル:stabilityai/stable-diffusion-2-base
オプション説明
-i.mlpackageを保存したディレクトリを指定する。
-o画像を保存するディレクトリを指定する。
--model-versionデフォルトはCompVis/stable-diffusion-v1-4
これ以外のモデルを使い場合に指定する。
--compute-unitCPU_AND_GPUALLCPU_AND_NEから指定する。
CPU_AND_GPUが私の環境では一番高速。
--num-inference-stepsデフォルトは50
数値を上げると精細な画像が生成される。
--scheduler実行に使用するスケジューラを指定します。デフォルトはthe diffusers pipeline
指定するスケジュールは下記から指定する。
DDIM,
DPMSolverMultistep,
EulerAncestralDiscrete,
EulerDiscrete,
LMSDiscrete,
PNDM
python_coreml_stable_diffusion.pipelineのオプション

compute-unitの比較

CPU_AND_GPUALLCPU_AND_NEを上記のコマンドラインでの画像生成時間を比較してみます。

macOSバージョンCPU_AND_GPUALLCPU_AND_NE
M1 MAX(macOS13.1)45.972:27.214:59.88
M2 Air(macOS13.1) 1:15.521:46.842: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-base28.55
M2 Air(macOS13.1)stable-diffusion-2-base1:14.06
M1 MAX(macOS13.0.1)stable-diffusion-v1-433.78
上記スクリプトの画像生成時間

最後に

最後まで読んでいただきありがとうございます。今回の【Python】macOS13.1でCore MLのStable Diffusionを試す(爆速なのか?!)はいかがでしたでしょうか。結論、私の環境ではmacOS13.0.1の時とあまりパフォーマンスは変わらず爆速というわけではありませんでした(それでも十分速いです)が、M1/M2のGPUをゴリゴリ使えて楽しいので今後に期待します。

MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。

初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。

定番おすすめ記事

M1、M2のMacでPythonの開発環境を構築することや、分野別のライブラリのインストール方法を下記の記事でまとめています。ぜひご覧ください。

関連記事