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