Waifu Diffusion 1.3が動かない場合の対応

Waifu Diffusion 1.3が動かない場合の対応 機械学習

「Waifu Diffusionを動かすことができない・・・」
「Waifu Diffusion 1.3になってから動かなくなってしまった・・・」

このような場合には、この記事の内容が参考になります。
この記事では、Waifu Diffusion 1.3が動かない場合の対応方法を解説しています。

本記事の内容

  • Waifu Diffusionのバージョンアップ
  • Waifu Diffusion 1.3を動かすための対応
  • Waifu Diffusion 1.3の動作確認

それでは、上記に沿って解説していきます。

Waifu Diffusionのバージョンアップ

「Waifu Diffusionとは?」という方は、次の記事をご覧ください。

Waifu Diffusionが、2022年10月8日にバージョンアップしました。
バージョンは、1.2から1.3への変更です。

その変更は、単純なモノではありませんでした。
単純に学習データの画像枚数が増えただけではなかったのです。

単純ではない変更は、設定ファイルの変更履歴から確認できます。
https://huggingface.co/hakurei/waifu-diffusion/commit/2dff9dab944d77470b545a1bbe86fffb08d54912

要点をピックアップすると、以下となります。

  • Diffusersのバージョンアップ
  • Transformersのバージョンアップ
  • スケジュール関数の変更

Waifu Diffusion 1.3が動かない原因となる可能性のあるモノを取り上げています。
それぞれを以下で説明します。

Diffusersのバージョンアップ

Diffusersのバージョンの値が変更されています。

2022年10月9日時点のDiffusersの最新バージョンですね。

おそらく、このバージョンでなければ動かないというわけではないでしょう。
実際、Diffusers 0.3.0でもWaifu Diffusion 1.3は動いています。

モデルを生成したDiffusersのバージョンのはずです。
ただ、Diffusersのバージョンが古すぎるとWaifu Diffusion 1.3が動かない可能性はあります。

その場合は、Diffusersのバージョンアップを行いましょう。
もしくは、別のPython仮想環境にStable Diffusionをインストールします。

Diffusersについては、次の記事で解説しています。

Transformersのバージョンアップ

Transformersのバージョンの値が変更されています。

これも同じように、古いとアウトかもしれません。
これは、適当にバージョンアップしても問題ないでしょう。

Transformersについては、次の記事で説明しています。

Transformersのバージョンアップは、以下のコマンドで実施可能です。

pip install -U transformers

スケジュール関数の変更

スケジュール関数については、次のページで詳細が説明されています。
https://huggingface.co/docs/diffusers/api/schedulers

簡単に言うと、Diffusersにおけるモデルの扱いを決める関数です。
そのコアな関数が変更されています。

model_index.jsonでは、次のような変更点があります。

scheduler/scheduler_config.jsonでは、以下の変更となっています。

完全に置き換えています。

まとめ

DiffusersやTransformersに関しては、何も対応をする必要がない可能性も高いです。
ただし、スケジュール関数の変更では対応をする必要があります。
詳細は、後ほど説明します。

以上、Waifu Diffusionのバージョンアップを説明しました。
次は、Waifu Diffusion 1.3を動かすための対応を説明します。

Waifu Diffusion 1.3を動かすための対応

DiffusersやTransformerについては、解決済みとします。
ここでは、スケジュール関数の変更への対応をメインで説明します。

まず、Scipyをインストールしましょう。
Scipyについては、次の記事で説明しています。

新しく採用されたスケジュール関数は、LMSDiscreteSchedulerです。
LMSDiscreteSchedulerは、Scipyに依存しています。

Scipyがインストールされていないと、次のようなエラーが出ることになります。

ImportError: 
LMSDiscreteScheduler requires the scipy library but it was not found in your environment. You can install it with pip: `pip install scipy`

エラーに書いてある通り、次のコマンドでインストールしましょう。

pip install scipy

次は、コードにおけるスケジュール関数の指定を変更する対応です。
バージョンごとに記載して比較してみましょう。

バージョン 1.2

import

from diffusers import StableDiffusionPipeline, DDIMScheduler

スケジュール関数設定

pipe = StableDiffusionPipeline.from_pretrained(
    "hakurei/waifu-diffusion",
    torch_dtype=torch.float16,
    revision="fp16",
    scheduler=DDIMScheduler(
        beta_start=0.00085,
        beta_end=0.012,
        beta_schedule="scaled_linear",
        clip_sample=False,
        set_alpha_to_one=False,
    ),
).to('cuda')

バージョン 1.3

import

from diffusers import StableDiffusionPipeline, LMSDiscreteScheduler

スケジュール関数設定

pipe = StableDiffusionPipeline.from_pretrained(
    "hakurei/waifu-diffusion",
    torch_dtype=torch.float16, 
    scheduler=LMSDiscreteScheduler(
        beta_start=0.00085,
        beta_end=0.012,
        beta_schedule='scaled_linear',
        num_train_timesteps=1000
    ),
).to('cuda')

以上、Waifu Diffusion 1.3を動かすための対応を説明しました。
最後は、Waifu Diffusion 1.3の動作確認を説明します。

Waifu Diffusion 1.3の動作確認

Waifu Diffusion 1.3が動作するコードは、以下。

import torch
from torch import autocast
from diffusers import StableDiffusionPipeline, LMSDiscreteScheduler

pipe = StableDiffusionPipeline.from_pretrained(
    "hakurei/waifu-diffusion",
    torch_dtype=torch.float16,  # GPUに余裕があるなら「torch.float32」
    scheduler=LMSDiscreteScheduler(
        beta_start=0.00085,
        beta_end=0.012,
        beta_schedule='scaled_linear',
        num_train_timesteps=1000
    ),
).to('cuda')

prompt = "1girl, black eyes, black hair, black sweater, blue background, bob cut, closed mouth, glasses, medium hair, red-framed eyewear, simple background, solo, sweater, upper body, wide-eyed"

# ====ここから====
def null_safety(images, **kwargs):
    return images, False


pipe.safety_checker = null_safety
# ====ここまで====

with autocast("cuda"):
    image = pipe(prompt, guidance_scale=6)["sample"][0]

image.save("test.png")

ポイントになる部分は、すでに説明しています。
プロンプトは、以下のページから適当に拝借しています。

Waifu Diffusion 1.3 Release Notes
https://gist.github.com/harubaru/f727cedacae336d1f7877c4bbe2196e1

あと、このプロンプトがNSFWフィルターに引っかかる確率が高いです。
そのため、NSFWフィルター回避策を仕込んでいます。

上記コードが上手く動けば、次のような画像が生成されます。

以上、Waifu Diffusion 1.3の動作確認を説明しました。

タイトルとURLをコピーしました