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

【Python】M1/M2のCore MLに最適化されたStable Diffusionを試す

10 min

こんにちは。ナミレリです。みなさん、MacでPythonは使っていますか?

2022年12月1日にAppleからCore MLへ最適化されたStable Diffusionが発表されました。この記事ではM1/M2のCore MLに最適化されたStable Diffusionで画像生成するまでを詳しく説明します。下記のリンクはAppleの発表です。

Core MLの最適化が適用されたmacOS 13.1(とiOS 16.2)なので注意が必要です。2022年12月6日現在でmacOS 13.1は開発者向けのbeta版です。私の環境は現時点でのリリース最新版であるmac OSは13.0.1です。(ほとんどの方がそうだと思います)この記事ではM1/M2のCore MLに最適化されたStable Diffusionを試してみたいと思います。真のパフォーマンスが発揮されるのはmacOS 13.1やiOS 16.2からですが、その前の準備としてmacOS 13.0で試してみます。

この記事はこんな人にオススメ

  • Appleが発表したStable Diffusionをとりあえず使ってみたい
  • 話題のStable Diffusionを試してみたい
  • Stable Diffusionを試したいが環境は分けておきたい
この記事のMac環境
  • M2 MacBook Air 13.6 インチMacBook Pro 14インチ M1Max
  • macOS Ventura 13.0.1
  • pyenv 2.3.7
  • 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日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

はじめに

そもそもCore MLってなに?

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

Appleのハードウェアを活用し、メモリ占有量と電力消費量を最小限にしながらも、幅広い種類のモデルがオンデバイスでパフォーマンスを発揮できるように最適化されています。

Core MLは、Accelerate、BNNS、およびMetal Performance Shadersの上に構築されたAppleの基本的な機械学習フレームワークです。iOSアプリケーションに統合できる機械学習モデルを提供し、画像分析、自然言語処理、オーディオからテキストへの変換、および音声分析をサポートします。Core MLフレームワークはオンデバイスコンピューティングを使用して機能するため、アプリケーションはネットワーク接続やAPI呼び出しを必要とせずにCore MLを利用できます。

Python仮想環境のイメージ(Core MLに最適化されたStable Diffusion用)

今回は下のイメージ図のようにpyenvcondavenvでCoreMLに最適化されたStable Diffusion用の環境を構築します。

今回のPython環境イメージ
pyenvとvenvの関係イメージ
pyenvとvenvの関係イメージ

(Core MLに最適化された)Stable Diffusionの設定ステップ概要

大枠としては下のような流れでセットアップしていきます。

  1. STEP

    事前準備:brew、pyenv、miniforge3

  2. STEP

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

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

  3. STEP

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

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

  4. STEP

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

    今回用にライブラリの独立した環境を構築します

  5. STEP

    Stable Diffusionのセットアップ

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

  6. STEP

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

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

  7. STEP

     Core ML modelの作成

    PyTorchからCore MLのモデルに変換します

  8. STEP

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

  9. STEP

    画像生成のプログラム例

Amazonの読み放題・聴き放題

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

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

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

【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

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

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

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

それではインストールしたminiforge3condaコマンドでCore MLのStable Diffusion用の仮想環境を構築します。仮想環境の名前はcoreml_stable_diffusionとしています。その後、conda activateコマンドでアクティブにするとプロンプトにアクティブにした仮想環境名が表示されたと思います。


conda create -n coreml_stable_diffusion
conda activate coreml_stable_diffusion

condaの使い方についても下記の記事で紹介していますのでぜひ参考にしてください。

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

gitでCoreMLに最適化されたStable Diffusionのソースコードをクローンします。以下のコマンドでカレントディレクトリにml-stable-diffusionがクローンされます。


git clone https://github.com/apple/ml-stable-diffusion.git

Amazonの読み放題・聴き放題

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

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

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

【STEP4】Stable Diffusion用のvenv仮想環境を準備する

先程、Stable Diffusionのソースコードをクローンしました。そのディレクトリで.venvという名前の仮想環境を準備します。


cd ml-stable-diffusion
python -m venv .venv

下記のコマンドでvenv仮想環境を有効にします。プロンプトにアクティブにしたvenv仮想環境名が表示されます。


source .venv/bin/activate

この段階でプロンプトには
(.venv) (coreml_stable_diffusion)と表示されているはずです。

ここまでがベースとなる環境構築です。以降、Stable Diffusionのセットアップをしていきます。

aliasに登録しておくと便利です

毎回、conda activate.venv/bin/activateが面倒だし忘れる場合

そんな時は.zshrcaliasの登録をしておくと便利だと思います。下記はsdというコマンドのエイリアスを登録しています。


alias sd='conda activate coreml_stable_diffusion && source ~/ml-stable-diffusion/.venv/bin/activate && cd ~/ml-stable-diffusion'

【STEP5】Stable Diffusionのセットアップ

それではStable Diffusionのセットアップをしていきます。プロンプトに
(.venv) (coreml_stable_diffusion)と表示されていることを確認しつつ、今いるクローンしたディレクトリでpipコマンドをアップデートして、必要なライブラリを下記のコマンドでインストールします。


pwd
ml-stable-diffusion
pip install --upgrade pip
pip install -e .

上のpip install -e .は依存関係にあるライブラリをインストールしてくれます。

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


pip install --upgrade diffusers transformers scipy

これでライブラリのインストールは終わりです。pip listは以下の通りです。


pip list
Package                        Version    Editable project location
------------------------------ ---------- --------------------------------
accelerate                     0.15.0
certifi                        2022.9.24
charset-normalizer             2.1.1
coremltools                    6.1
diffusers                      0.9.0
filelock                       3.8.1
huggingface-hub                0.11.1
idna                           3.4
importlib-metadata             5.1.0
mpmath                         1.2.1
numpy                          1.23.5
packaging                      21.3
Pillow                         9.3.0
pip                            22.3.1
protobuf                       3.20.3
psutil                         5.9.4
pyparsing                      3.0.9
python-coreml-stable-diffusion 0.1.0      /Users/user/ml-stable-diffusion
PyYAML                         6.0
regex                          2022.10.31
requests                       2.28.1
scipy                          1.9.3
setuptools                     58.1.0
sympy                          1.11.1
tokenizers                     0.13.2
torch                          1.13.0
tqdm                           4.64.1
transformers                   4.25.1
typing_extensions              4.4.0
urllib3                        1.26.13
zipp                           3.11.0

【STEP6】アカウント作成とアクセストークンの取得

huggingfaceのサイトでアカウントを作成し、HuggingFaceプロファイルでAPIにアクセスするためのトークンを取得します。それではやってみましょう。

huggingfaceでアカウントを作成する

  1. STEP

    huggingfaceにアクセスし右上の「Sign Up」をクリックする

  2. STEP

    登録するアカウントのメールアドレス、パスワードを入力し、Nextをクリック。

  3. STEP

    ユーザー情報を入力しアカウントを作成する

    上部に名前を入力し、Terms of ServiceCode of Conductを確認・同意し、チェックボックスにチェックしてCreate Accountをクリック

  4. STEP

    最後に登録したメールにURLが届くのでクリックし登録を完了させます。

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

  1. STEP

    ログインし[settings]→[Access Tokens]をクリックし、[New token]をクリック。

  2. STEP

    [Create a new access token]の画面で[Name]でトークンにつける名前を入力し、[Generate a token]をクリック。

  3. STEP

    後ほど使うので生成されたトークンをコピーします

  4. STEP

    huggingface-cli login

    トークンを取得したらターミナルで次のコマンドを実行しトークンをペーストします。

    
    huggingface-cli login
    
    

    トークンは、~/.huggingface/tokenに保存されます。

【STEP7】 Core ML modelの作成

以下のコマンドで、Hugging Faceから数GBのPyTorch チェックポイントをダウンロードし、PyTorchからCore ML(.mlpackage)に変換します。(15分程度かかりました)

コマンド最後の-oは、変換した.mlpackageを保存するディレクトリを指定します。今回はtestとしています。


python -m python_coreml_stable_diffusion.torch2coreml --convert-unet --convert-text-encoder --convert-vae-decoder --convert-safety-checker -o test

【STEP8】コマンドラインで画像生成

いよいよ初の画像生成です。-i.mlpackageを保存するディレクトリを指定します。また-oで画像を保存するディレクトリを指定します。(今回は~/sd_img/にしました)

prompt"Futuristic beautiful winter Mt.Fuji, Realistic"


python -m python_coreml_stable_diffusion.pipeline --prompt "Futuristic beautiful winter Mt.Fuji, Realistic" -i test -o ~/sd_img/ --compute-unit ALL

待つこと数分。。。macOS 13.1ではないのでそれなりに時間かかります。

モデル:CompVis/stable-diffusion-v1-4

いくつか言葉を足してみて再度画像生成にチャレンジ。

prompt"Futuristic beautiful winter Mt.Fuji, Realistic, rim light, greg rutkowski"


python -m python_coreml_stable_diffusion.pipeline --prompt "Futuristic beautiful winter Mt.Fuji, Realistic, rim light, greg rutkowski" -i test -o ~/sd_img/ --compute-unit ALL --seed 333

モデル:CompVis/stable-diffusion-v1-4

今度は温かくルノワール風な富士山にしてみたくテストしてみます。

prompt"Mount Fuji in the city of the future. PierreAuguste Renoir,"


python -m python_coreml_stable_diffusion.pipeline --prompt "Mount Fuji in the city of the future. PierreAuguste Renoir," -i test -o ~/sd_img/ --compute-unit ALL

モデル:CompVis/stable-diffusion-v1-4
モデル:stabilityai/stable-diffusion-2
モデル:stabilityai/stable-diffusion-2-1

【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("CompVis/stable-diffusion-v1-4")
pipe = pipe.to("mps")

# Recommended if your computer has < 64 GB of RAM
pipe.enable_attention_slicing()

#どんな画像にするか
prompt = "a photo of an astronaut riding a horse on mars"

# 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")

参考までにtimeでM1 MAXとM2 Airで生成時間を比べてみました。画像が生成され保存されるまでの時間です。

画像生成時間(秒)
M1 MAX MacBook Pro33.78
M2 MacBook Air2:00.77
画像生成時間

最後に

最後まで読んでいただきありがとうございます。今回の【Python】M1/M2のCore MLに最適化されたStable Diffusionを試すはいかがでしたでしょうか。真のパフォーマンスが発揮されるのはmacOS 13.1やiOS 16.2からですが準備万端です。

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

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

定番おすすめ記事

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

関連記事