広告
広告

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

カテゴリ:その他

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 = int(random.random()*1000000000)
    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(
    "",
    # ... その他のコード

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

Strengh 引数

openvino バージョンでは init-image に画像を指定した場合に strength 引数が有効になる。しかしこれは inference steps の回数を増減させるだけのパラメーターだ。init-image がある場合の推論回数は以下のようになる。

inference steps = 引数で指定した inference steps × strength + 1

デフォルトで inference steps は 50、 strength は 0.5 なので、init-image を指定した状態でのデフォルト推論回数は 26 回になる。

リンク

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


広告
広告