この記事は古くなったので新しい記事へどうぞ 【9/6加筆】
- 参考ページとしていた magnusviri氏による一時的なapple-silicon-mps-supportブランチはメイン(?)の方にマージされました。
- 2022年9月時点でのインストール方法については以下の記事をどうぞ
長いのでまとめると
- 試行錯誤しながら書いたメモをコピペ。読みづらいのはご容赦ください。
- Macbook Air M2(メモリ16GB)、(おそらく)GPUを使用、学習モデルはsd-v1-4.ckptを使用。
- 初めての実行で以下のコマンドを入力後、だいたい1時間(57分くらい)で6つの画像が出力されました。
- % python scripts/txt2img.py --prompt "a photograph of an cat into a bottle" --plms
参考ページ
- Stable-Diffusion公式Git
-
Stable-Diffusionのapple-silicon-mps-supportブランチ - 学習データの配布サイト
gitは必須。コンパイル用にRustも必要
% brew install git rust
minicondaでやってみた
% brew install miniconda
% conda -V
4.12.0
% conda init zsh
% source ~/.zshrc
% conda install -c conda-forge onnx
- sourceで読み込んだ後、現在minicondaの(base)環境にいることを確認してください。シェルのプロンプトに(base)と書かれているはずです。
- anacondaを使用すればこんなに苦労しない可能性があります。(要検討)
- base環境のときに、onnxをcondaパッケージでインストールしておくこと。pipでonnxをソースからインストールしようとするとこけます(バージョン依存関係と思われますが面倒なので追ってません)。
stable-diffusionのM1/M2Macbook用ブランチをクローン
% git clone https://github.com/magnusviri/stable-diffusion.git
% cd stable-diffusion
% git checkout apple-silicon-mps-support
設定ファイル確認。書き換え(imwatermarkエラー対策)
- 「environment-mac.yaml」の内容を確認して、「- pip: 」エントリーに並んでいるmodule群の中に、「invisible-watermark」がなかったら追加する
- たとえば、「- opencv-python」の行のすぐ下に「- invisible-watermark」と追加するとよいかも。
- 「importError: cannot import name 'WatermarkEncoder' from 'imWatermark'」というエラーが出たら、その原因は「invisible-watermark」がライブラリが入っていないためだと思われます。「imwatermark」ライブラリではないようです。・・・罠かな?
設定ファイルを使って環境構築。そして切替
% conda env create -f environment-mac.yaml
% conda activate ldm
- 「/opt/homebrew/Caskroom/miniconda/base/envs/ldm」というディレクトリ作って環境を構築するので、もしこの環境構築途中でエラーで止まったら、このldmディレクトリを消して再度実行すること
- ldm環境に切り替えるとシェルのプロンプトの表示が(base)から(ldm)に変わりました
別途ダウンロードした学習モデルを定位置に配置
% mkdir ./models/ldm/stable-diffusion-v1/
% mv ~/Downloads/sd-v1-4.ckpt ./models/ldm/stable-diffusion-v1/models.ckpt
txt2img.pyスクリプト実行でこけるので手で書き換え
- Patchコマンドを使ってもいいけど、今回は手で書き換えました。具体的には、カレントフォルダの「Patchfile」の中身を参照
- 対象:
- /opt/homebrew/Caskroom/miniconda/base/envs/ldm/lib/python3.10/site-packages/torch/nn/functional.py の2511行目あたり
- パスは微妙に違うかもしれないので自分で探すこと
変更前
return torch.layer_norm(input, normalized_shape, weight, bias, eps, torch.backends.cudnn.enabled)
変更後(inputほにゃららの一部分だけ書き換え)
return torch.layer_norm(input.contiguous(), normalized_shape, weight, bias, eps, torch.backends.cudnn.enabled)
さあ実行しよう
% python scripts/txt2img.py -e "a photograph of a cat into a bottle" -plms
かかる時間
- Macbook Air M2(メモリ16GB)、GPUを使用、学習モデルはsd-v1-4.ckptを使用。画像6枚1セットの生成でだいたい1時間コース
- アクティビティモニタで内蔵GPUを使っている様子が見えるが、まだ余力はありそう。
- メモリを18GBくらい使っているのでSSDへのSwapが処理速度低下の主要因かな。
TODO
- minicondaではなくてanacondaで環境を構築するともっと楽な可能性がある
torchのnightly buildを使った上で、ソースコードの書き換えを行うことでMacbookのGPUを使えるらしいので今度試す- 倍精度ではなく単精度のを使うともっと早いかも。すでにoptimizeされたbranchがいくつかありそう? 今度試す。
知りたいこと
- plmsオプションってなあに?