HuggingFace Diffusers v0.21.0の新機能
「Diffusers v0.21.0」の新機能についてまとめました。
前回
1. Diffusers v0.21.0 のリリースノート
情報元となる「Diffusers 0.21.0」のリリースノートは、以下で参照できます。
2. Würstchen
「Würstchen」は拡散モデルであり、そのテキスト条件付きモデルは高度に圧縮された画像の潜在空間で機能し、より安価で高速な推論を可能にします。
「Würstchen」の使い方は、次のとおりです。
import torch
from diffusers import AutoPipelineForText2Image
from diffusers.pipelines.wuerstchen import DEFAULT_STAGE_C_TIMESTEPS
pipeline = AutoPipelineForText2Image.from_pretrained("warp-ai/wuerstchen", torch_dtype=torch.float16).to("cuda")
caption = "Anthropomorphic cat dressed as a firefighter"
images = pipeline(
caption,
height=1024,
width=1536,
prior_timesteps=DEFAULT_STAGE_C_TIMESTEPS,
prior_guidance_scale=4.0,
num_images_per_prompt=4,
).images
詳しくは、ドキュメントを参照。
3. T2I Adapters for SDXL
「T2I-Adapter」は、元の大きなText-to-Imageモデルをフリーズしながら、事前学習されたText-to-Imageモデルに追加のガイダンスを提供する、効率的なプラグアンドプレイモデルです。
以下は StableDiffusionXLAdapterPipeline の使用方法です。
(1) controlnet_aux がインストールされていることを確認。
pip install -U controlnet_aux==0.0.7
(2) パイプラインの準備。
import torch
from controlnet_aux.lineart import LineartDetector
from diffusers import (AutoencoderKL, EulerAncestralDiscreteScheduler,
StableDiffusionXLAdapterPipeline, T2IAdapter)
from diffusers.utils import load_image, make_image_grid
# アダプターの準備
adapter = T2IAdapter.from_pretrained(
"TencentARC/t2i-adapter-lineart-sdxl-1.0", torch_dtype=torch.float16, varient="fp16"
).to("cuda")
# パイプラインの準備
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
euler_a = EulerAncestralDiscreteScheduler.from_pretrained(
model_id, subfolder="scheduler"
)
vae = AutoencoderKL.from_pretrained(
"madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16
)
pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
model_id,
vae=vae,
adapter=adapter,
scheduler=euler_a,
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
# 線画検出器の準備
line_detector = LineartDetector.from_pretrained("lllyasviel/Annotators").to("cuda")
(3) 画像を準備して線画コンディショニングを計算。
url = "https://huggingface.co/Adapter/t2iadapter/resolve/main/figs_SDXLV1.0/org_lin.jpg"
image = load_image(url)
image = line_detector(image, detect_resolution=384, image_resolution=1024)
(4) 画像生成。
prompt = "Ice dragon roar, 4k photo"
negative_prompt = "anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured"
gen_images = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=image,
num_inference_steps=30,
adapter_conditioning_scale=0.8,
guidance_scale=7.5,
).images[0]
詳しくは、ドキュメントを参照。
4. importの高速化
モジュール (パイプライン、モデルなど) のインポート時間を大幅に短縮するために、「lazy imports」を導入しました。
以下は、「import diffusers」で「lazy imports」を使用した場合としない場合の比較です。
・lazy import あり
real 0m0.417s
user 0m0.714s
sys 0m0.499s
・lazy import なし
real 0m5.391s
user 0m5.299s
sys 0m1.273s
5. LoRAの読み込みの高速化
以前は、load_lora_weights() で LoRA パラメータを読み込むのに時間がかかりました。そこで、load_lora_weights() に low_cpu_mem_usage 引数を導入しました。これにより、読み込み時間が大幅に短縮されます。low_cpu_mem_usage=True を渡すだけでメリットが得られます。
6. LoRAのマージ
LoRAの重みをモデルの重みにマージできるようになったため、LoRの 重みをロードしたモデルは、ロードしていないモデルと同じ速度で実行できるようになりました。また、複数のLoRAを同じモデルにマージすることもできます。
詳しくは、ドキュメントと PR: #4473 を参照。
7. LoRAフォーマットの追加
SDXL用のほぼすべてのLoRAフォーマットがサポートされるようになりました。
詳しくは、ドキュメントを参照。