dskjal
広告
広告

openvino(CPU)版で Waifu Diffusion を実行する(Windows, Linux)

カテゴリ:deeplearning

CPU で Waifu Diffusion が実行できるクローンは以下の6つ。

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 はノードベースで画像を生成できる。以下の機能がある。

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(
    "",
    # ... その他のコード

この "" の部分にネガティブプロンプトを入力する。

リンク

Waifu Diffusion で効率的に画像生成する


広告
広告

カテゴリ