AMDのWindowsマシンでStableDiffusion V1.5とAnything V3.0を使えるようにする

AMDのWindowsマシンでStableDiffusion V1.5とAnything V3.0を使えるようにする

打ち捨てられた感のあるAMD WinのStableDiffusion環境。
それでも淡い期待を込めて新しいモデルへの入れ替えを行いました。

ベースとなる環境の構築はこちらをに書いてあります。

とうとうRyzen + RADEONのAMD環境にもWindowsで動くStable Diffusionがきた

stable-diffusion-v1-5

話題に登った時点でv1.4だったSDは、今v1.5モデルが公開されています。
前回の手順でvirtualenvを有効化した後に、下記コマンドでモデルをダウンロード&変換します。

python convert_stable_diffusion_checkpoint_to_onnx.py --model_path="runwayml/stable-diffusion-v1-5" --output_path="stable-diffusion-v1-5"

古い変換スクリプトを使う

それだけなんですが詰まりました。
実行時点で最新の変換スクリプトを使ったせいです。

(virtualenv) PS C:\temp\virtualenv> python convert_stable_diffusion_checkpoint_to_onnx.py --model_path="runwayml/stable-diffusion-v1-5" --output_path="stable-diffusion-v1-5"
Traceback (most recent call last):
  File "C:\temp\virtualenv\convert_stable_diffusion_checkpoint_to_onnx.py", line 24, in <module>
    from diffusers import OnnxStableDiffusionPipeline, StableDiffusionPipeline
ImportError: cannot import name 'OnnxStableDiffusionPipeline' from 'diffusers' (C:\temp\virtualenv\lib\site-packages\diffusers\__init__.py)

問題箇所の修正は自力では失敗。
結局実績のあった10月時点のスクリプトですんなり行きました(2022 Oct 6版)。

diffusers/convert_stable_diffusion_checkpoint_to_onnx.py at 78744b6a8f3c9dd4800e1b279cc37930dfd77048 · huggingface/diffusers · GitHub

モデルの使用許諾に同意

V1.5はCompVisではなくRunwayからの公開。
あらためてHuggingface内でモデルの使用許諾に同意が必要。

というエラー。

(virtualenv) PS C:\temp\virtualenv> python convert_stable_diffusion_checkpoint_to_onnx.py --model_path="runwayml/stable-diffusion-v1-5" --output_path="stable-diffusion-v1-5"
......
  File "C:\temp\virtualenv\lib\site-packages\huggingface_hub\utils\_errors.py", line 280, in hf_raise_for_status
    raise HfHubHTTPError(str(e), response=response) from e
huggingface_hub.utils._errors.HfHubHTTPError: 403 Client Error: Forbidden for url: https://huggingface.co/api/models/runwayml/stable-diffusion-v1-5/revision/main (Request ID: gMieA3MksEplzTPc7GV27)

Access to model runwayml/stable-diffusion-v1-5 is restricted and you are not in the authorized list. Visit https://huggingface.co/runwayml/stable-diffusion-v1-5 to ask for access.

実行

実行用スクリプトも元記事(の元記事)に習って変更しています。

> type .\txt2img_sd15.py
import click
from diffusers import StableDiffusionOnnxPipeline
import numpy as np

@click.command()
@click.option("-p", "--prompt", required=True, type=str)
@click.option("-w", "--width", required=False, type=int, default=512)
@click.option("-h", "--height", required=False, type=int, default=512)
@click.option("-st", "--steps", required=False, type=int, default=25)
@click.option("-g", "--guidance-scale", required=False, type=float, default=7.5)
@click.option("-s", "--seed", required=False, type=int, default=None)
def run(
    prompt: str,
    width: int,
    height: int,
    steps: int,
    guidance_scale: float,
    seed: int):

    pipe = StableDiffusionOnnxPipeline.from_pretrained(
        "./stable-diffusion-v1-5",
        provider="DmlExecutionProvider"
    )

    pipe.safety_checker = lambda images, **kwargs: (images, [False] * len(images))


    # Generate our own latents so that we can provide a seed.
    seed = np.random.randint(np.iinfo(np.int32).max) if seed is None else seed
    latents = get_latents_from_seed(seed, width, height)

    print(f"\nUsing a seed of {seed}")
    image = pipe(prompt, height=height, width=width, num_inference_steps=steps, guidance_scale=guidance_scale, latents=latents).images[0]
   image.save(f"step{steps}-cfg{guidance_scale}-{seed}.png")

def get_latents_from_seed(seed: int, width: int, height:int) -> np.ndarray:
    # 1 is batch size
    latents_shape = (1, 4, height // 8, width // 8)
    # Gotta use numpy instead of torch, because torch's randn() doesn't support DML
    rng = np.random.default_rng(seed)
    image_latents = rng.standard_normal(latents_shape).astype(np.float32)
    return image_latents

if __name__ == '__main__':
    run()

実行時のパラメータにプロンプトやサイズをつける一般的な方式になりました。
ファイル名は”ステップ数-CFG-シード値.png”とし、ある程度後から分かるようにしています。

なお実行にはclickモジュールの追加が必要なので、これも実行します。

pip install click

無指定の場合サイズは512×512、Stepは25でCFGは7.5となります。
pipe =に変換で作成した./stable-diffusion-v1-5ディレクトリを指定しています。

“火星で馬に乗る宇宙飛行士“を書いてもらいます。

(virtualenv) PS C:\temp\virtualenv> python.exe .\txt2img_sd15.py -p "a photo of an astronaut riding a horse on mars" -st 50

Linaqruf/anything-v3.0

中国にて元素法典を作成したグループが公開してる、とされるアニメ特化のAIモデル。
Wifu Diffusionと被っているけれど、AIイラストが苦手な手指も割と綺麗にかけると話題に登っています。

SD1.5と同様に以下のコマンドで取得します。

python convert_stable_diffusion_checkpoint_to_onnx.py --model_path="Linaqruf/anything-v3.0" --output_path="anything-v3.0"

実行

実行スクリプトも個別に用意し、今度は女の子を描いてもらいます。

> python.exe .\txt2img_any3.py -p "1girl, brown hair, green eyes, colorful, autumn, cumulonimbus clouds, lighting, blue sky, falling leaves, garden" -w 512 -h 768 -g 12 -st 50

Anything V3.0、確かに綺麗なんだけど女性を描くとほぼほぼ「女の子」になるのが残念。
美少女じゃなくて目付きの悪い美女をお願いしたい。

仕上がりがイマイチ

SD1.5もAnythnig3.0も無事に生成できました。
でもなんだかAnythingは画質が悪いような?Waifu Deffusionにもその傾向はありましたが。

絵全体としては綺麗なのだけど、ノイジーというかディティールの低い絵になる。同じプロンプトはLinuxで実行すると綺麗に出ますし。

これは画像データを作るスケジューラ(サンプラー)の問題かもしれません。
AUTOMATIC1111の様に簡単にスケジューラを変更できないから今のところ憶測ですが。

もう少し調べてみよう。

 

コメントを残す