Apple Silicon Macで画像生成AI Stable Diffusionを動かす

stable diffusionはNVIDIA GPUのCUDA向けのtext-to-imageモデルであるが、AppleがCoreML向けにカスタマイズしたml-stable-diffusionを公開している。

ここではml-stable-diffusionをApple Silicon Macで動作させる手順を記載する。このテキストの想定レベルはITエンジニア初級。以下のスキルを持っていることが望ましい。

  • ターミナルでのCLI操作ができる
  • gitを使える
  • homebrewをセットアップできる
  • pythonが何か知っている(hello worldレベルでもコードが書けるとなお良い)
  • anacondaというライブラリの名前を聞いたことがあり、なんとなくどういうものか知っている

ただしml-stable-diffusionは画像生成時にサイズが選べないなど制限も多く、本格的に画像生成するならやはりRTX 3000以上のGPUを搭載したゲーミングPCの利用をお勧めする

環境構築

homebrewのインストール

省略、ここを自力でクリアできないようでは想定レベルに達していないので諦めた方がいいです。やり方はBing AIかChatGPTにでも聞いてください。

anaconda のインストール

condaコマンドを使えるようにする

brew install anaconda

conda init zsh 

gitとgit-lfs インストール

lfsはgitで巨大なバイナリを扱えるようにするものらしい。ギガバイトサイズのデータを扱うために必要になるらしい

brew install git git-lfs

git lfs install

ml-stable-diffusionのインストール

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

cd ml-stable-diffusion

以後の作業は ml-stable-diffusion ディレクトリで行います

condaでpython環境の作成と切り替え

OSプリインストールのpythonを使うと苦労するので、condaで仮想環境を作るのがセオリーらしい

環境の作成(python3.8推奨らしい)

conda create -n ml python=3.8

環境の切り替え(ターミナルを新しく開いた時はこのコマンドで環境の切り替えを忘れずに)

conda activate ml

pythonライブラリをインストール

ml-stable-diffusionが使用するライブラリをインストールする。

pip install -r requirements.txt

Hugging Face のアカウントを作成

huggingface.coから学習済みのモデルをgit cloneできるようにする。

まず、Hugging Face のアカウントが無ければ作成、次にアクセストークンを作成してコピーしておく。

CLIツールでログイン。アクセストークンを聞かれるのでペーストする。

huggingface-cli login

モデルの取得

Hugging Faceで配布されている学習済みモデルはCUDA用なので、これをCoreML用に変換する必要がある。

まず、デフォルトのモデル CompVis/stable-diffusion-v1-4を取得する。

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

取得するモデル名は --model-version=<huggingface.coのリポジトリ名> で指定する、何も指定しないと CompVis/stable-diffusion-v1-4 となる。

なお、この手順で変換できるのは model_index.jsonというファイルが置かれているモデルのみ。.safetensors.ckpt という拡張子で配布されているモデルは少々面倒な別の手順で変換しなければならない。

画像の生成

ネコの兵隊を描かせてみよう

python -m python_coreml_stable_diffusion.pipeline --prompt "1 cartoon cat soldier, wearing combat helmet" -i ./models/ -o ./images/ --compute-unit ALL --seed 2723450664

こんなのができた、草

オプションについて

  • --prompt: プロンプトの指定
  • --seed: シード値(0以上4294967296未満)を指定
  • -i: モデルが置かれている場所、モデル変換時に-oで指定したディレクト
  • -o: 画像の出力先
  • --compute-unit: 生成に使う演算ユニット、とりあえずALLでいいと思う
  • --num-inference-steps: デフォルト50、ノイズ除去の回数らしい。回数を増やすとより精細な画像が生成されるらしいがあまり変わらない気がする
  • --guidance-scale: デフォルトは7.5。プロンプトの再現度らしい。大きいほど呪文に忠実に生成されるらしい

一旦ここまで、次回は

  • ckptで配布されているモデルを使用してアニメ風画像を生成
  • 長いプロンプトを入れるとエラーになる問題に対処
  • 黒画像が生成される問題に対処