openvino(CPU)版で Waifu Diffusion を実行する(Windows, Linux)
CPU で Waifu Diffusion が実行できるクローンは以下の6つ。
- stable-diffusion-webui(AUTOMATIC1111)
- ComfyUI
- stable-diffusion-ui(CMDR2)
- NMKD Stable Diffusion GUI
- stable_diffusion.openvino
- OnnxDiffusersUI
stable-diffusion-webui(AUTOMATIC1111)は最も高機能でユーザーも多い。CPU で最も高速なのはstable_diffusion.openvinoで、半分以下の時間で生成できる。
ComfyUI は比較的新しいノードベースのツールだ。CPU で実行でき、SDXL や LoRA や ControlNet など必須級機能をサポートしている。
OnnxDiffusersUI は AMD の GPU でも実行できる。
AUTOMATIC1111 を CPU で実行する
webui-user.bat に以下の引数を追加して起動する。
set COMMANDLINE_ARGS=--skip-torch-cuda-test --precision full --no-half
パフォーマンス
無料枠の Google Colab だと速度は、512x512、Euler で 37 s/it。20 ステップなら1枚あたり 13 分程度かかる。
ComfyUI
Comfy はノードベースで画像を生成できる。以下の機能がある。
- 動作が高速
- SD1.x, SD2.x and SDXL 対応
- CPU 動作対応
- LoRA, LoCon, LoHa, Hypernetwork 対応
- ControlNet 対応
- Upscale 可能
openvino
CPU で Stable Diffusion が実行できる stable_diffusion.openvino は model を指定できる。その model に ShadowPower/waifu-diffusion.openvino を指定するだけで、Waifu Diffusion が実行できる。
stable_diffusion.openvino のインストール
まず python をインストールする。バージョンは他のライブラリの依存関係から 3.8.x が推奨される。2022 年9月時点では、3.8.14 が最新だ。
stable_diffusion.openvinoをダウンロードして、管理者権限でシェル(Powershell, コマンドプロンプト, bash など)を起動する。stable_diffusion.openvino のディレクトリで
pip install -r requirements.txt
を実行する。
実行
あとはコマンドを実行するだけだ。以下は Powershell のコマンド例。
python demo.py --prompt "kawaii girl with silver hair" --model ShadowPower/waifu-diffusion.openvino
--init-image で初期画像を指定できる(img2img)。入力画像サイズは 512px * 512px。プロンプトで細部の修正はできないので、細部の修正にこれを使う。
python demo.py --prompt "kawaii girl with silver hair" --model ShadowPower/waifu-diffusion.openvino --init-image ./init.png
--seed でシードを指定できる。シードは構図や色に影響する。いい感じのシードを見つけてから、プロンプトを修正していくのが効率的だ。
python demo.py --prompt "kawaii girl with silver hair" --model ShadowPower/waifu-diffusion.openvino --seed 93467853
10 枚作成するなら
1..10 | %{python demo.py --prompt "kawaii girl with silver hair" --model ShadowPower/waifu-diffusion.openvino}
パフォーマンス
Ryzen 5 2600、メモリ 16GB のマシンで inference step が 50 の場合、1枚作成するのにおよそ6分かかる。Stable Diffusion 実行中のCPU 使用率は 50 %程度で、Python の使用しているメモリは8GB程度。
シードガチャをする場合 inference step は8前後で行う。その場合は1枚あたり1分かかる。
inference step 30 と 50 は結果がたいして変わらない。30 なら1枚あたり3分半程度。
ソースの修正
シードをファイル名に含める
openvino バージョンは demo.py を以下のように適宜修正して、ファイル名にシードを含めると便利だ。Windows はファイル名の長さが最大 255 文字程度に制限されているので、プロンプトはファイル名に入らない。
def main(args): seed = args.seed if seed is None: import random seed = random.randint(0, 2**32-1) np.random.seed(seed) # その他のコード # ... # 画像の書きだし cv2.imwrite("{}.png".format(seed), image)
DDIM サンプラーを使う
DDIM サンプラーは少ない inference steps でそこそこの画像を生成する。なので、シードガチャに最適だ。
demo.py を読むと、初期画像を使用しない場合は LMS(LMSDiscreteScheduler)、使用する場合は PNDM を使っているようだ。
openvino で DDIM を使う
demo.py の LMS オブジェクトを作成している部分を DDIM オブジェクトに置き換えるだけだ。
# インポート部分 # old from diffusers import LMSDiscreteScheduler, PNDMScheduler # new from diffusers import LMSDiscreteScheduler, PNDMScheduler, DDIMScheduler # オブジェクト生成部分 # old scheduler = LMSDiscreteScheduler( # new scheduler = DDIMScheduler(
ネガティブプロンプトを使う
stable_diffusion_engine.py の 125 行目あたりに以下のようなコードがある。
tokens_uncond = self.tokenizer( "", # ... その他のコード
この "" の部分にネガティブプロンプトを入力する。