ジャコ Lab

プログラミング関連のメモ帳的ブログです

LCM LoRA も使っとく

前回の記事では LCM (Latent Consistency Model) を使ってみました。
v0.22.0 の時点では、 DiffusionPipeline に指定するモデルが LCM 対応のモデルとなっていました。

恐らくこれでは、LCMに対応したモデルしか使えず、既存モデルは使えないと思っています。

しかし v0.23.0 で、LCM が LoRA として設定が可能になりました。

これにより、Pipeline に指定するモデルは好きなものを使えるはず!

ちなみに AnimateLCM では、LoRA を使い LCM を適用していたので Pipeline のモデルは好きなものを使えました。

本来の時系列では、v0.23.0 以降に AnimateLCM が登場したのかな?

それでは、使ってみます。

まずはリリースノート通りに行きます

モデルのロード等(stable-diffusion-xl-base-1.0, lcm-lora-sdxl, LCMScheduler)

from diffusers import DiffusionPipeline, LCMScheduler
import torch

# SDモデルのロード
pipe = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    variant="fp16",
    torch_dtype=torch.float16
).to("cuda")

# LCM LoRA のロード
pipe.load_lora_weights("latent-consistency/lcm-lora-sdxl")

# スケジューラーの設定(LCMScheduler)
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)

パイプライン実行

prompt = "close-up photography of cat in the rain at night, in a street lit by lamps, leica 35mm summilux"
image = pipe(
    prompt=prompt,
    num_inference_steps=4,
    guidance_scale=1,
).images[0]

image
ステップ数は4!
4/4 [00:02<00:00, 1.81it/s]
2秒です。メチャメチャ高速!

lcm-lora-sdxl を適用して出力した SDXL の画像
lcm-lora-sdxl を適用して出力した SDXL の画像

にゃーん

PaperCut LoRA とやらも使ってみよう

Papercut SDXL はこちらの LoRA です。

準備

!wget -O lora.safetensors "https://civitai.com/api/download/models/133503"

モデルのロード等 (stable-diffusion-xl-base-1.0, lcm-lora-sdxl, Papercut SDXL)

from diffusers import DiffusionPipeline, LCMScheduler
import torch

# SDモデルのロード
pipe = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    variant="fp16",
    torch_dtype=torch.float16
).to("cuda")

# LoRA のロード(LCM, PaperCut)
pipe.load_lora_weights("latent-consistency/lcm-lora-sdxl", adapter_name="lcm-lora")
pipe.load_lora_weights(".", weight_name="lora.safetensors", adapter_name="papercut-lora")
pipe.set_adapters(["lcm-lora", "papercut-lora"], adapter_weights=[1.0, 1.0])

# スケジューラーの設定(LCMScheduler)
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)

パイプライン実行

# プロンプト実行
prompt = "papercut an cat made of cherry blossoms in moonlight with a circular border"
image = pipe(
    prompt=prompt,
    num_inference_steps=4,
    guidance_scale=1,
).images[0]

image

Papercut SDXL LoRA を適用して出力した様子
Papercut SDXL LoRA を適用して出力した結果

お、これは良いにゃんこ

SDXL 以外は???

lcm-lora-sdxl のページ を見てみると書いてありました。

どうやら こちらのページ のようです。

lcm-lora-sdv1-5 を使ってみる

モデルのロード等 (MeinaMix, lcm-lora-sdv1-5)

from diffusers import DiffusionPipeline, LCMScheduler
import torch

# SDモデルのロード
pipe = DiffusionPipeline.from_pretrained(
    "Meina/MeinaMix_V11",
    custom_pipeline="lpw_stable_diffusion",
    torch_dtype=torch.float16
).to("cuda")

# LCM LoRA のロード
pipe.load_lora_weights("latent-consistency/lcm-lora-sdv1-5")

# スケジューラの設定(LCMScheduler)
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)

パイプライン実行

# プロンプト実行
prompt = "realistic, 1girl, white hair, purple eyes, bikini, beach, light particles, light rays, wallpaper"
negative_prompt = "(worst quality, low quality:1.4), monochrome, zombie, (interlocked fingers:1.2)"
image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=4,
    guidance_scale=1
).images[0]

lcm-lora-sdv1-5 を適用して出力した MeinaMix の画像
lcm-lora-sdv1-5 を適用して出力した MeinaMix の画像

ちょっと青み掛かり過ぎだけど。。。
というか、早すぎるんですけど!
4/4 [00:00<00:00,  7.20it/s]

まとめ

ステップ数4 で、この品質は凄いです。