見出し画像

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フォーマットがサポートされるようになりました。
詳しくは、ドキュメントを参照。

次回



いいなと思ったら応援しよう!