見出し画像

HuggingFace Diffusers v0.27.0の新機能

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

前回


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

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

2. Stable Cascade

Würstchen上に構築される新しいText-to-Imageモデルのサポートを追加します。これは、非商用ライセンスが付属する「Stable Cascade」と呼ばれます。「Stable Cascade」パイプラインラインは、3つの異なるモデルに基づいて構築されており、「Image Patients」の階層圧縮を可能にし、優れた出力を実現するという点で 「Stable Diffusion」とは異なります。

from diffusers import StableCascadePriorPipeline, StableCascadeDecoderPipeline
import torch

prior = StableCascadePriorPipeline.from_pretrained(
    "stabilityai/stable-cascade-prior",
    torch_dtype=torch.bfloat16,
).to("cuda")

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
image_emb = prior(prompt=prompt).image_embeddings[0]

decoder = StableCascadeDecoderPipeline.from_pretrained(
    "stabilityai/stable-cascade",
    torch_dtype=torch.bfloat16,
).to("cuda")

image = pipe(image_embeddings=image_emb, prompt=prompt).images[0]
image

詳しくは、ドキュメントを参照してください。

【注意】「Stable Cascade」パイプラインで torch.bfloat16 データ型を使用するには、torch>=2.2.0 が必要です。

3. Playground v2.5

「PlaygroundAI」は、特に美観に優れた新しいv2.5モデル (playgroundai/playground-v2.5-1024px-aesthetic) をリリースしました。 このモデルは、いくつかの調整を除いて、「Stable Diffusion XL」アーキテクチャに従っています。

このリリースでは、次のモデルをサポートしています。

from diffusers import DiffusionPipeline
import torch

pipe = DiffusionPipeline.from_pretrained(
    "playgroundai/playground-v2.5-1024px-aesthetic",
    torch_dtype=torch.float16,
    variant="fp16",
).to("cuda")

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
image = pipe(prompt=prompt, num_inference_steps=50, guidance_scale=3).images[0]
image

元の単一ファイルのチェックポイントからのロードもサポートしています。

from diffusers import StableDiffusionXLPipeline, EDMDPMSolverMultistepScheduler
import torch

url = "https://huggingface.co/playgroundai/playground-v2.5-1024px-aesthetic/blob/main/playground-v2.5-1024px-aesthetic.safetensors"
pipeline = StableDiffusionXLPipeline.from_single_file(url)
pipeline.to(device="cuda", dtype=torch.float16)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
image  = pipeline(prompt=prompt, guidance_scale=3.0).images[0]
image.save("playground_test_image.png")

playgroundai/playground-v2.5-1024px-aesthetic チェックポイントを使用して LoRA DreamBooth の学習を実行することもできます。

accelerate launch train_dreambooth_lora_sdxl.py \
  --pretrained_model_name_or_path="playgroundai/playground-v2.5-1024px-aesthetic"  \
  --instance_data_dir="dog" \
  --output_dir="dog-playground-lora" \
  --mixed_precision="fp16" \
  --instance_prompt="a photo of sks dog" \
  --resolution=1024 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --learning_rate=1e-4 \
  --use_8bit_adam \
  --report_to="wandb" \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --max_train_steps=500 \
  --validation_prompt="A photo of sks dog in a bucket" \
  --validation_epochs=25 \
  --seed="0" \
  --push_to_hub

詳しくはドキュメントを参照してください。

4. EDM-style 学習サポート

「」EDM」は、論文「Elucidating the Design Space of Diffusion-Based Generative Models」で紹介されている学習およびサンプリング手法です。train_dreambooth_lora_sdxl.py スクリプトで EDM定式化を使用した学習をサポートしました。

EDM定式化を使用して「stabilityai/stable-diffusion-xl-base-1.0」を学習するには、trainingコマンドで --do_edm_style_trainingを指定するだけです。

この定式化を他の学習スクリプトに拡張することに興味がある場合は、この PR を参照してください。

5. EDM 定式化による新スケジューラ

「Playground v2.5」モデルと「EDM-style」の学習全般をより適切にサポートするため、「EDMDPMSolverMultistepScheduler」と「EDMEulerScheduler」をサポートします。これらは、それぞれ 「DPMSolverMultistepScheduler」と「EulerDiscreteScheduler」の EDM定式化をサポートします。

6. Trajectory Consistency Distillation

「Trajectory Consistency Distillation」 (TCD) を使用すると、モデルはより少ないステップで高品質で詳細な画像を生成できます。さらに、「TCD」は蒸留プロセス中のエラーを効果的に軽減するため、推論ステップが大きい条件下でも優れたパフォーマンスを発揮します。これは、「Trajectory Consistency Distillation」で提案されました。

このリリースには、高速サンプリングを可能にする「TCDScheduler」のサポートが付属しています。「LCM-LoRA」と同様に、TCDはアクセラレーションのために追加のAdapterを必要とします。

使用例は、次のとおりです。

import torch
from diffusers import StableDiffusionXLPipeline, TCDScheduler

device = "cuda"
base_model_id = "stabilityai/stable-diffusion-xl-base-1.0"
tcd_lora_id = "h1t/TCD-SDXL-LoRA"

pipe = StableDiffusionXLPipeline.from_pretrained(base_model_id, torch_dtype=torch.float16, variant="fp16").to(device)
pipe.scheduler = TCDScheduler.from_config(pipe.scheduler.config)

pipe.load_lora_weights(tcd_lora_id)
pipe.fuse_lora()

prompt = "Painting of the orange cat Otto von Garfield, Count of Bismarck-Schönhausen, Duke of Lauenburg, Minister-President of Prussia. Depicted wearing a Prussian Pickelhaube and eating his favorite meal - lasagna."

image = pipe(
    prompt=prompt,
    num_inference_steps=4,
    guidance_scale=0,
    eta=0.3, 
    generator=torch.Generator(device=device).manual_seed(0),
).images[0]

詳しくは、ドキュメントを参照してください。

7. IP-Adapter image embeddings と masking

IP-Adapterをサポートするすべてのパイプラインは、ip_adapter_image_embeds 引数を受け入れます。同じ画像で IP-Adapterを複数回実行する必要がある場合は、画像を1回エンコードして、埋め込みをディスクに保存できます。これにより計算時間が節約され、UIを構築する場合に特に役立ちます。さらに、IP-AdapterのComfyUI画像埋め込みは「diffusers」と完全に互換性があり、すぐに使用できます。

また、出力画像のどの部分をIP-Adapterに割り当てるかを指定するためのバイナリマスクをサポートしました。入力IP-Adapter画像ごとに、バイナリマスクとIP-Adapterを提供する必要があります。

詳しくは、「Official Guide」を参照してください。

8. LoRA のマージに関するガイド

LoRAのマージは、新しくユニークな画像を作成する創造的な手法です。「diffusers」は、マージする LoRA の重みを連結する set_adapters() によるマージ機能を提供します。

現在、「diffusers」は「PEFT」の add_weighted_adapter() もサポートしており、「TIES」「DARE」「linear」などのより効率的なマージ手法や、「dare_ties」などのこれらのマージ手法の組み合わせも提供されています。

詳しくは、「Merge LoRAs Guide」を参照してください。

9. LEDITS++

LEDITS++」(Limitless Image Editing using Text-to-Image Models)と呼ばれる本格的な画像編集技術のサポートを追加します。これは、ファインチューニングや最適化を必要としないパラメータフリーの手法です。

実画像を編集するために、LEDITS++パイプラインは、まず画像DPM-solver++スケジューラを反転させます。このスケジューラは、反転と推論を合わせて20ステップという少ない拡散ステップで編集を容易にします。「LEDITS++」のガイダンスは、編集の方向(編集コンセプトから遠ざかりたい/遠ざかりたい場合)と効果の強さの両方を反映するように定義されます。また、ガイダンスには関連する画像領域に焦点を当てたマスキング項が含まれ、特に複数の編集の場合、各概念に対応するガイダンス項がほぼ分離されたままとなり、干渉が制限されます。

使用例は、次のとおりです。

import torch
import PIL
import requests
from io import BytesIO
from diffusers import LEditsPPPipelineStableDiffusionXL, AutoencoderKL

device = "cuda"
base_model_id = "stabilityai/stable-diffusion-xl-base-1.0"

vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16)

pipe = LEditsPPPipelineStableDiffusionXL.from_pretrained(
    base_model_id, 
    vae=vae, 
    torch_dtype=torch.float16
).to(device)

def download_image(url):
    response = requests.get(url)
    return PIL.Image.open(BytesIO(response.content)).convert("RGB")

img_url = "https://www.aiml.informatik.tu-darmstadt.de/people/mbrack/tennis.jpg"
image = download_image(img_url)

_ = pipe.invert(
    image = image,
    num_inversion_steps=50,
    skip=0.2
)

edited_image = pipe(
    editing_prompt=["tennis ball","tomato"],
    reverse_editing_direction=[True,False],
    edit_guidance_scale=[5.0,10.0],
    edit_threshold=[0.9,0.85],)

詳しくは、ドキュメントを参照してください。



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