見出し画像

HuggingFace Diffusers v0.30.0の新機能

「Diffusers v0.30.0」の新機能についてまとめました。

前回


1. Diffusers v0.30.0 のリリースノート

情報元となる「Diffusers 0.30.0」のリリースノートは、以下で参照できます。

2. 新パイプライン

2-1. オーディオパイプライン

Stable Audio

2-2. ビデオパイプライン

Latte
CogVideoX

2-3. 画像パイプライン 

Lumina
Kolors
AuraFlow
Flux

これらのパイプラインについて詳しく知るには、それぞれのドキュメントを参照してください。

・「Lumina」は、多言語対応の新しいDiT アーキテクチャを導入。
・「Kolors」はSDXLからインスピレーションを受けている。多言語対応。
・「Flux」は、現在のオープンなDiTバリアントの中で最大(12B) です。
 効率的なDreamBooth + LoRA学習には
ガイドを参照。
・メモリ効率を高めるために大規模なパイプラインを量子化する方法は
ガイドを参照。
・「CogVideoX」は、diffusersに真の「3D VAE」を導入。

3. PAG (Perturbed Attention Guidance)

PAG」のコミュニティ パイプラインはすでにありましたが、その有用性を考慮して、ライブラリの第一級メンバーにすることにしました。ここに「PAG」の中心的な使用ガイドがあります。
現在、「PAG」では次のパイプラインをサポートしています。

・StableDiffusionPAGPipeline
・StableDiffusion3PAGPipeline
・StableDiffusionControlNetPAGPipeline
・StableDiffusionXLPAGPipeline
・StableDiffusionXLPAGImg2ImgPipeline
・StableDiffusionXLPAGInpaintPipeline
・StableDiffusionXLControlNetPAGPipeline
・StableDiffusion3PAGPipeline
・PixArtSigmaPAGPipeline
・HunyuanDiTPAGPipeline
・AnimateDiffPAGPipeline
・KolorsPAGPipeline

4. SparseCtrl を使用した AnimateDiff

「SparseCtrl」は、ControlNet にヒントを得た追加の条件エンコーダを組み込むことで、線/エッジスケッチ、深度マップ、RGB 画像などの信号を活用したText-to-Videoのdiffusionモデルに制御方法を導入し、これらの信号を AnimateDiffフレームワークで処理します。補間やビデオ予測 (アニメーション用の画像シーケンス間のギャップを埋める)、パーソナライズされた画像アニメーション、Sketch-to-Video、Depth-to-Videoなど、さまざまなアプリケーションに適用できます。これは、「SparseCtrl: Adding Sparse Controls to Text-to-Video Diffusion Models」で導入されました。

著者によって提供されている「SparseCtrl」固有のチェックポイント2つと 「Motion LoRA」1つがあります。

SparseCtrl Scribble
SparseCtrl RGB
Motion LoRA v1-5-3

・Scribble Interpolationの例

import torch

from diffusers import AnimateDiffSparseControlNetPipeline, AutoencoderKL, MotionAdapter, SparseControlNetModel
from diffusers.schedulers import DPMSolverMultistepScheduler
from diffusers.utils import export_to_gif, load_image

motion_adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-3", torch_dtype=torch.float16).to(device)
controlnet = SparseControlNetModel.from_pretrained("guoyww/animatediff-sparsectrl-scribble", torch_dtype=torch.float16).to(device)
vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse", torch_dtype=torch.float16).to(device)
pipe = AnimateDiffSparseControlNetPipeline.from_pretrained(
    "SG161222/Realistic_Vision_V5.1_noVAE",
    motion_adapter=motion_adapter,
    controlnet=controlnet,
    vae=vae,
    scheduler=scheduler,
    torch_dtype=torch.float16,
).to(device)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, beta_schedule="linear", algorithm_type="dpmsolver++", use_karras_sigmas=True)
pipe.load_lora_weights("guoyww/animatediff-motion-lora-v1-5-3", adapter_name="motion_lora")
pipe.fuse_lora(lora_scale=1.0)

prompt = "an aerial view of a cyberpunk city, night time, neon lights, masterpiece, high quality"
negative_prompt = "low quality, worst quality, letterboxed"

image_files = [
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-1.png",
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-2.png",
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-3.png"
]
condition_frame_indices = [0, 8, 15]
conditioning_frames = [load_image(img_file) for img_file in image_files]

video = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=25,
    conditioning_frames=conditioning_frames,
    controlnet_conditioning_scale=1.0,
    controlnet_frame_indices=condition_frame_indices,
    generator=torch.Generator().manual_seed(1337),
).frames[0]
export_to_gif(video, "output.gif")

詳しくはドキュメントを参照。

5. AnimateDiff 用 FreeNoise

「FreeNoise」は、学習不要の方法で、事前学習済みのビデオ拡散モデルの生成機能を既存のコンテキスト/フレーム制限を超えて拡張できます。

「FreeNoise」は、すべてのフレームのノイズを初期化する代わりに、長距離相関のためにノイズのシーケンスを再スケジュールし、ウィンドウベースの関数を使用してそれらに対して時間的注意を実行します。DiffusersのAnimateDiffモデル ファミリに「FreeNoise」を追加し、デフォルトの32フレーム制限を超えてビデオを生成できるようにしました。

import torch
from diffusers import AnimateDiffPipeline, MotionAdapter, EulerAncestralDiscreteScheduler
from diffusers.utils import export_to_gif

adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", torch_dtype=torch.float16)
pipe = AnimateDiffPipeline.from_pretrained("SG161222/Realistic_Vision_V6.0_B1_noVAE", motion_adapter=adapter, torch_dtype=torch.float16)
pipe.scheduler = EulerAncestralDiscreteScheduler(
    beta_schedule="linear",
    beta_start=0.00085,
    beta_end=0.012,
)

pipe.enable_free_noise()
pipe.vae.enable_slicing()

pipe.enable_model_cpu_offload()
frames = pipe(
    "An astronaut riding a horse on Mars.",
    num_frames=64,
    num_inference_steps=20,
    guidance_scale=7.0,
    decode_chunk_size=2,
).frames[0]

export_to_gif(frames, "freenoise-64.gif")

6. LoRA のリファクタリング

LoRAに関連するローダークラスを大幅にリファクタリングしました。今後、これは新パイプラインとモデルにLoRAサポートを追加する上で役立ちます。現在、StableDiffusionXLLoraLoaderMixin などのさまざまなパイプラインレベルのLoRAローディングクラスによってサブクラス化される LoraBaseMixin クラスがあります。このドキュメントでは、使用可能なクラスの概要を示します。

さらに、PeftAdapterMixinクラス内のメソッドの範囲を拡大しました。このリファクタリングにより、サポートされているすべてのモデルで、set_adapter()、add_adapter() などの共通のLoRA機能を共有できます。

詳しくは、このPRに従ってください。これらのリファクタリングに起因する LoRA 関連の問題を見つけた場合は、問題を報告してください。

7. attention projection fusion の修正

fuse_qkv_projections() の実装が壊れていることが分かりました。このPRで修正されました。さらにこのPRにより、「AuraFlow」と「PixArt Sigma」への融合サポートが追加されました。この種の融合が役立つ可能性がある場所についての根拠は、こちらを参照してください。



この記事が気に入ったらサポートをしてみませんか?