Stable DiffusionをAMD GPUやCPUで動かす
※この記事はメンテされていません。SD出始めの頃の記事です。今(2023/04/24)現在はstable-diffusion-webui-directmlが一番楽だと思います。なんかめちゃくちゃVRAMが足りないですが。
モデリングする前のキャラクターデザインなどで悩んだときにはAIを活用するのは大いにありだと思うのです。
ということでローカルでAIお絵かきする環境を整えたいと思います。なおnvidiaのグラボなんてものはありません。
キャラクターデザインをメインにしたいので、本家SDだとあんまりいいのがつくれません。
※TrinArtのキャラクターモデルめちゃくちゃいいので正直お金あるならローカル環境にこんな面倒なことして環境作るよりもWebで使えるTrinArtを使いましょう、30秒もしないで美麗イラストが出力されます。 2022/10/17追記 本命が公式配布始まったのでそちらも確認しました、出来ました。
さてでは本題の環境構築です。
英語でよければここに書いてることを殆どなぞっているだけ(ckptからの変換のみ違う)なのでまずはこちらを読みましょう
前提
OSはWindows 10 Home 64bit
普通のStable Diffusionの環境構築は終わっていること(txt2imgをしようとするとCUDAデバイスが無いと言われる状態)
筆者の場合、txt2img.py等を書き換えてCPUで動くことを確認済み
以下実際のコマンド
$ cd SDのフォルダ
$ conda create --name sd39 python=3.9 -y
$ conda activate sd39
$ pip install diffusers==0.3.0
$ pip install transformers
$ pip install onnxruntime
からort_nightly_directml-1.13.0.dev20220908001-cp39-cp39-win_amd64.whlをDL
$ pip install ort_nightly_directml-1.13.0.dev20220908001-cp39-cp39-win_amd64.whl --force-reinstall
から以下ををダウンロード
convert_original_stable_diffusion_to_diffusers.py
ckpt形式からONNX版に変換できる形式に変換するスクリプト
convert_stable_diffusion_checkpoint_to_onnx.py
上で変換したものをONNX版に変換するスクリプト
変換したいSD互換ckptファイルをDLして配置(今回はtrinart2_step115000を./trinart2_step115000\model.ckptに配置)
$ pip install OmegaConf
$ python convert_original_stable_diffusion_to_diffusers.py --checkpoint_path="./trinart2_step115000\model.ckpt" --dump_path="./trin_diffusers"
特記事項:waifu_diffusionの場合、このままだと画像生成の時に型が合わないとエラーになるので無理矢理変える
ダウンロードしたwaifu-diffusionフォルダ内model_index.jsonの該当箇所を以下に書き換える(SD/TrinArtに合わせる)
code:model_index.json
"scheduler": [
"diffusers",
"DDIMScheduler"
],
を
"scheduler": [
"diffusers",
"PNDMScheduler"
],
に変更(私は面倒くさいのでtrinartの同ファイルで上書きしました)
$ python convert_stable_diffusion_checkpoint_to_onnx.py --model_path="./trin_diffusers" --output_path="./stable_diffusion_onnx"
からonnx_txt2img.pyをダウンロード
これはONNX変換したモデルを使ってtxt2imgするスクリプト
私は思いっきりカスタマイズして使ってますが、本元も時々更新されているっぽい?
CPUで実施する場合
$ python onnx_txt2img.py --n_samples 1 --prompt "illustration devil girl with cat ear" --random_seed True --ddim_steps 50 --hardware cpu
GPUで実施する場合
$ python onnx_txt2img.py --n_samples 1 --prompt "illustration devil girl with cat ear" --random_seed True --ddim_steps 50
※trinart_stable_diffusion_v2というかキャラ系は割とNSFW判定に引っかかりまくるので、必要に応じて自己責任で
condaのディレクトリ\envs\sd39\Lib\site-packages\diffusers\pipelines\stable_diffusion
にあるpipeline_stable_diffusion_onnx.pyを編集
もしくは
pipe.safety_checker = lambda images, **kwargs: (images, [False] * len(images))
謝辞
ONNX版を実装してくださった方々、それを便利に使えるスクリプトを公開してくださった方々、本家Stable Diffusionの開発者の方々、trinart_diffusionの開発者の方、その他多くの関連情報を残してくださった方など皆様に感謝申し上げます。
私だけでは正直ROCmも動かなかったし完全に手詰まりでした。