先日構築したRyzen+RADEONのALL AMD環境で動かすStable Diffusion
CUDAなんてない!Ryzen + RADEONのAMD環境でもStable Diffusionをローカルマシンで動かす。
「そろそろWindows上でもAMDネイティブなツール出るだろう」
と思ったらこれっぽっちも出てこなくて恐々としているところです。
低速なIntel版ですら開発されたというのにRADEONったらどんだけ嫌われてるの。
それはさておき。
このLinux環境にアニメ絵特化のWaifu Diffusionが追加できたので記事にします。
Waifu Diffusion
Stable Diffusionは多様で膨大な画像を学習しているため、複雑な命令(Prompt)をつけると人物の顔が著しく崩れます。
ピカソのゲルニカも顔負けの情緒不安定アウトプットが出てきたり。
特に均整がとれている事が大前提となるアニメイラストでは「シードガチャ」とも言える無限の生成を試行しなくてはなりません。
そこでtable-diffusion-v1-4の派生として、アニメイラスト(特に美少女)に特化したwaifu-diffusionが作成されたようです。
Stable DiffusionにDanbooruから56,000個の追加学習を行ったとあります。
Danbooruは参照元不明多数のイラスト集約サイトの為、出来上がるのもそれ由来ものものになります。
SD環境にWaifu Diffusionを追加
試したところ、前回作った環境にそのまま追加して動きました。
もしAMD環境でWaifu Diffusionを動かしたい時は、冒頭に書いたstable diffusionの環境作成をまず実施してください。Waifuとかぶる部分もいくつかありますが、環境の動作確認のためにもまずStablの構築がおススメです。
コードはまずGeforceでやられていた方のサイトを参照させていただきました。
2022/09/12 追記
参照したサイトのスクリプトsample.pyそのままでは、画像出力サイズが400×400と小さめ。
そこを変更してGPU的出力サイズの最大値となるH768xW512にしました(逆でも可)。
また、縦768の画像をWebUIでそのまま見るためにmax-width: 1600pxとしています。
DotbyDotで表示して欲しいけれど、自動リサイズされてしまうみたい。なのでこれくらいがベストという実録。
この設定で6800XTなら2枚の画像を計26秒で出せます。
import gradio as gr
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline
model_id = "hakurei/waifu-diffusion"
device = "cuda"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16, revision='fp16')
pipe = pipe.to(device)
block = gr.Blocks(css=".container { max-width: 1600px; margin: auto; }")
num_samples = 2
def infer(prompt):
with autocast("cuda"):
images = pipe([prompt] * num_samples, guidance_scale=7.5, width=512, height=768)["sample"]
return images
with block as demo:
gr.Markdown("<h1><center>Waifu Diffusion</center></h1>")
gr.Markdown(
"waifu-diffusion is a latent text-to-image diffusion model that has been conditioned on high-quality anime images through fine-tuning."
)
with gr.Group():
with gr.Box():
with gr.Row().style(mobile_collapse=False, equal_height=True):
text = gr.Textbox(
label="Enter your prompt", show_label=False, max_lines=1
).style(
border=(True, False, True, True),
rounded=(True, False, False, True),
container=False,
)
btn = gr.Button("Run").style(
margin=False,
rounded=(False, True, True, False),
)
gallery = gr.Gallery(label="Generated images", show_label=False).style(
grid=[2], height="auto"
)
text.submit(infer, inputs=[text], outputs=gallery)
btn.click(infer, inputs=[text], outputs=gallery)
gr.Markdown(
"""___
<p style='text-align: center'>
Created by https://huggingface.co/hakurei
<br/>
</p>"""
)
demo.launch(debug=True)- SDと同じコンテナを起動し、ldm環境に切り替える。
- /dockerx/rocmディレクトリでwaifu-diffusionをクローン。
(ldm) root@grayhound:/dockerx/rocm/waifu-diffusion# git clone https://github.com/harubaru/waifu-diffusion (ldm) root@grayhound:/dockerx/rocm/waifu-diffusion# cd waifu-diffusion
- gradioモジュールを追加。いろいろインストールされます。
# pip3 install gradio Collecting gradio Downloading gradio-3.3-py3-none-any.whl (6.1 MB) |████████████████████████████████| 6.1 MB 1.9 MB/s - 参照元の通りwaifu-diffusionディレクトリにSample.pyを作成
- 実行。数GBのダウンロードあり。
# python3 sample.py Downloading: 100%|█████████████████████████| 1.34k/1.34k [00:00<00:00, 1.51MB/s] Downloading: 100%|█████████████████████████| 2.30k/2.30k [00:00<00:00, 2.23MB/s] ....
- ローカルアドレスが表示されるので、ブラウザで開く
Running on local URL: http://127.0.0.1:7860 To create a public link, set `share=True` in `launch()`.
SDと異なり、操作はWebUIで行います。
使ってみる
SDと同様にPromptを入れてRunすれば、10〜15秒ほどで2枚の画像が出力されます。
イラストに特化されているため、細かな情報を入れなくても勝手にわりと均整の取れた絵が出力されました。
オッサンもイケる!
なおNSFWプロテクタがついているので、エッチな絵は出力されません(黒塗りになる)。安心ですね!!!
使ってみると、Stable Diffusionで苦労していたのが嘘のように、整ったイラストがバンバン出力されます。
まさに餅は餅屋というようなモデルデータ。
またWebUIも初めて使ってみましたがやっぱり楽ですね。
コマンドラインも玄人ぽくていいけれど。





