こんにちは。ナミレリです。みなさん、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を試したいが環境は分けておきたい
- 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)
目次
はじめに
そもそも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用)
今回は下のイメージ図のようにpyenv、conda、venvでCoreMLに最適化されたStable Diffusion用の環境を構築します。
(Core MLに最適化された)Stable Diffusionの設定ステップ概要
大枠としては下のような流れでセットアップしていきます。
- STEP
事前準備:brew、pyenv、miniforge3
- STEP
Stable Diffusion用のconda仮想環境を準備する
conda createで仮想環境を構築します
- STEP
CoreMLに最適化されたStable Diffusionを取得する
gitでソースコードを取得します
- STEP
Stable Diffusion用のvenv仮想環境を準備する
今回用にライブラリの独立した環境を構築します
- STEP
Stable Diffusionのセットアップ
Stable Diffusionに必要なライブラリをインストールします。
- STEP
アカウント登録とアクセストークンの取得(https://huggingface.co)
APIにアクセスするためのトークンを取得します
- STEP
Core ML modelの作成
PyTorchからCore MLのモデルに変換します
- 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)"
brewの詳しい使い方は下の記事をぜひ参考にしてください。
pyenvのインストール
次に、M1/M2のMacにpyenvをインストールします。まだの方は下記のコマンドでインストールしてください。
brew install pyenv
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
pyenvの詳しい使い方は下の記事をぜひ参考にしてください。
【STEP2】Stable Diffusion用のconda仮想環境を準備する
それではインストールしたminiforge3のcondaコマンドで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
【STEP4】Stable Diffusion用のvenv仮想環境を準備する
先程、Stable Diffusionのソースコードをクローンしました。そのディレクトリで.venvという名前の仮想環境を準備します。
cd ml-stable-diffusion
python -m venv .venv
下記のコマンドでvenv仮想環境を有効にします。プロンプトにアクティブにしたvenv仮想環境名が表示されます。
source .venv/bin/activate
ここまでがベースとなる環境構築です。以降、Stable Diffusionのセットアップをしていきます。
aliasに登録しておくと便利です
そんな時は.zshrcにaliasの登録をしておくと便利だと思います。下記は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 .は依存関係にあるライブラリをインストールしてくれます。
続いて、必要によりdiffusers、transformers、scipyをアップグレードします。
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でアカウントを作成する
- STEP
huggingfaceにアクセスし右上の「Sign Up」をクリックする
- STEP
登録するアカウントのメールアドレス、パスワードを入力し、Nextをクリック。
- STEP
ユーザー情報を入力しアカウントを作成する
上部に名前を入力し、Terms of ServiceとCode of Conductを確認・同意し、チェックボックスにチェックしてCreate Accountをクリック。
- STEP
最後に登録したメールにURLが届くのでクリックし登録を完了させます。
APIにアクセスするためのトークンを取得する
- STEP
ログインし[settings]→[Access Tokens]をクリックし、[New token]をクリック。
- STEP
[Create a new access token]の画面で[Name]でトークンにつける名前を入力し、[Generate a token]をクリック。
- STEP
後ほど使うので生成されたトークンをコピーします
- 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ではないのでそれなりに時間かかります。
いくつか言葉を足してみて再度画像生成にチャレンジ。
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
今度は温かくルノワール風な富士山にしてみたくテストしてみます。
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
【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 Pro | 33.78 |
M2 MacBook Air | 2:00.77 |
最後に
最後まで読んでいただきありがとうございます。今回の【Python】M1/M2のCore MLに最適化されたStable Diffusionを試すはいかがでしたでしょうか。真のパフォーマンスが発揮されるのはmacOS 13.1やiOS 16.2からですが準備万端です。
MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。
Amazonの電子書籍読み放題サービス「Kindle Unlimited」でプライム会員を対象に、最初の3か月間を無料体験できるキャンペーンを実施中。マンガ、小説、ビジネス書、雑誌など500万冊から、好きな本を何冊でも読めるキャンペーンです。
初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。