LCM LoRA の概要
以下の記事が面白かったので、かるくまとめました。
1. はじめに
「LCM」 (Latent Consistency Model) は、元モデルを別モデルに蒸留することで、画像生成に必要なステップ数を減らす手法です。25~50ステップかかっていた処理を4~8ステップで可能にします。
蒸留したモデルは、より小さくなるように設計される場合 (DistilBERT、Distil-Whisperなど)と、必要なステップ数が少なくなるように設計される場合があります。これは通常、膨大な量のデータ、忍耐力、少数のGPU を必要とし、時間とコストが必要でした。しかし、それも過去の話です。
11月9日 、「LCM」で蒸留したかのように「Stable Diffusion」「SDXL」を本質的に高速化できる新手法「LCM LoRA」を発表しました。3090では7倍、Macでは10倍の速度で実行できます。
2. LCM LoRA の概要
「LCM LoRA」のコアとなる考え方は、完全なモデルの代わりに、LoRA層と呼ばれる少数のアダプタだけを学習することです。その結果得られるLoRAは、別々に抽出することなく、ファインチューニングしたモデルに適用することができます。
独自のLoRAを学習する手順は、次のとおりです。
詳しくは、論文を参照してください。
3. LCM LoRA による高速推論
「diffusers」では、「LCM LoRA」を簡単に使用することができます。
from diffusers import DiffusionPipeline, LCMScheduler
import torch
# パイプラインの準備
pipe = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
variant="fp16",
torch_dtype=torch.float16
).to("cuda")
# LoRAウェイトの準備
pipe.load_lora_weights("latent-consistency/lcm-lora-sdxl")
# スケジューラの準備
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
# プロンプトの準備
prompt = "close-up photography of old man standing in the rain at night, in a street lit by lamps, leica 35mm summilux"
# 画像生成
images = pipe(
prompt=prompt,
num_inference_steps=4,
guidance_scale=1,
).images[0]
手順は、次のとおりです。
4ステップで以下の画像が生成できました。
4. LCM LoRA の品質の比較
4-1. LCM LoRAの1〜8ステップの比較
「LCM LoRA」のステップ数が生成品質にどのような影響を与えるかを見てみます。次のコードは、1〜8ステップで画像生成しています。
images = []
for steps in range(8):
generator = torch.Generator(device=pipe.device).manual_seed(1337)
image = pipe(
prompt=prompt,
num_inference_steps=steps+1,
guidance_scale=1,
generator=generator,
).images[0]
images.append(image)
グリッドに表示された8つの画像は次のとおりです。
1ステップでは特徴が認識できず、テクスチャも欠如したおおよその形状が生成されます。しかし、結果はすぐに向上し、通常はわずか4~6ステップで満足のいく画像が生成できます。
4-2. ガイダンススケール と ネガティブプロンプト
前の例では、guide_scale を実質的に無効にする1を使用していました。これはほとんどのプロンプトでうまく機能し、最も高速ですが、ネガティブプロンプトは無視されます。1から2の間のガイダンススケールを指定することで、ネガティブプロンプトを使用して画像生成することもできます。これより大きな値は機能しないことがわかりました。
4-3. LCM LoRA のあり・なしの比較
「SDXL」(ベース) での「LCM LoRA」のあり・なしの品質を比較してみます。「LoRA」の重みをアンロードし、デフォルトのスケジューラに切り替えることで、標準のSDXLパイプラインに戻すことができます。
from diffusers import EulerDiscreteScheduler
pipe.unload_lora_weights()
pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)
「SDXL」に対してさまざまなステップ数で推論を実行します。
images = []
for steps in (1, 4, 8, 15, 20, 25, 30, 50):
generator = torch.Generator(device=pipe.device).manual_seed(1337)
image = pipe(
prompt=prompt,
num_inference_steps=steps,
generator=generator,
).images[0]
images.append(image)
1、4、8、15、20、25、30、50ステップを使用した SDXL パイプラインの結果です。20ステップ (2 行目) まではほとんど使えませんが、ステップが増えると品質は大幅に向上します。最終的な画像は驚くべきものですが、そこに到達するまでに50のステップ必要でした。
5. 提供されている LCM LoRA モデル
提供されている「LCM LoRA」モデルは、次のとおりです。
この記事が気に入ったらサポートをしてみませんか?