库名称: diffusers
基础模型: stabilityai/stable-diffusion-xl-base-1.0
标签:
- lora
- 文生图
许可证: mit
推理: false
轨迹一致性蒸馏
论文官方模型库:轨迹一致性蒸馏。
更多信息请访问GitHub仓库和项目主页。
欢迎体验托管在🤗 Space的演示。

关于抄袭指控的严正声明
我们对CTM团队的严重指控深表遗憾。
在此声明前,我们已与CTM作者进行了多轮沟通。
现对此事进行说明:
-
在首个arXiv版本的"A.相关工作"中已提供引用和讨论:
Kim等人(2023)提出了CM和DM的通用框架。核心设计与我们相似,主要区别在于我们专注于减少CM误差,巧妙利用PF ODE的半线性结构进行参数化,并避免对抗训练。
-
在首个arXiv版本的"D.3定理4.2证明"中注明:
本节推导主要借鉴(Kim等人,2023;Chen等人,2022)的证明。
我们从未试图窃取成果。
如邮件所述,我们对参考文献标注不足正式道歉,将在修订版中充分体现引用。
-
在更新的第二arXiv版本中,我们扩充了与CTM框架关系的讨论,并移除了部分仅为完整性而包含的证明。
-
CTM与TCD在动机、方法和实验上均不同。TCD基于潜在一致性模型(LCM)原则,旨在通过指数积分器设计有效的consistency函数。
-
实验结果也无法通过任何CTM算法复现:
5.1 验证方法:使用我们的采样器测试CTM发布的模型,或反之。
5.2 CTM提供了训练脚本,欢迎基于CTM算法复现SDXL或LDM实验。
我们认为抄袭指控不仅严重,更损害相关各方的学术诚信,希望各界能全面了解此事。
简介
TCD受一致性模型启发,是一种新颖的蒸馏技术,可将预训练扩散模型的知识蒸馏为少步采样器。本仓库发布推理代码和TCD-SDXL模型,该模型蒸馏自SDXL Base 1.0。我们在此仓库中提供LoRA检查点。

✨TCD具有以下优势:
灵活步数
:相比Turbo,TCD可自由调整步数而不影响结果质量(LCM在高步数时质量显著下降)。
超越教师模型
:TCD在高步数下保持优异生成质量,甚至超越原始SDXL的DPM-Solver++(2S)表现。值得注意的是训练过程未使用额外判别器或LPIPS监督。
自由调节细节
:推理时通过调整gamma超参数即可修改图像细节程度,无需引入额外参数。
通用性
:结合LoRA技术,TCD可直接应用于共享相同骨干的各种模型(包括自定义社区模型、风格化LoRA、ControlNet、IP-Adapter),如用法所示。

避免模式崩溃
:TCD无需对抗训练即可实现少步生成,规避了GAN目标导致的模式崩溃问题。
与同期工作SDXL-Lightning相比,基于对抗扩散蒸馏的后者会出现"双面"伪影,而TCD能合成更真实且略多样化的结果。

更多细节请参阅论文轨迹一致性蒸馏。
使用指南
运行模型需安装🧨 Diffusers库:
pip install diffusers transformers accelerate peft
克隆仓库:
git clone https://github.com/jabir-zheng/TCD.git
cd TCD
以下展示TCD LoRA在SDXL、SDXL修复、社区模型Animagine XL、风格化LoRA剪纸、预训练深度Controlnet、边缘Controlnet和IP-Adapter上的应用。
文生图
import torch
from diffusers import StableDiffusionXLPipeline
from scheduling_tcd import 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 = "美丽女性,泡泡糖粉,柠檬黄,薄荷蓝,未来感,高细节,史诗构图,水彩画。"
image = pipe(
prompt=prompt,
num_inference_steps=4,
guidance_scale=0,
eta=0.3,
generator=torch.Generator(device=device).manual_seed(0),
).images[0]

图像修复
import torch
from diffusers import AutoPipelineForInpainting
from diffusers.utils import load_image, make_image_grid
from scheduling_tcd import TCDScheduler
device = "cuda"
base_model_id = "diffusers/stable-diffusion-xl-1.0-inpainting-0.1"
tcd_lora_id = "h1t/TCD-SDXL-LoRA"
pipe = AutoPipelineForInpainting.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()
img_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png"
mask_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png"
init_image = load_image(img_url).resize((1024, 1024))
mask_image = load_image(mask_url).resize((1024, 1024))
prompt = "老虎坐在公园长椅上"
image = pipe(
prompt=prompt,
image=init_image,
mask_image=mask_image,
num_inference_steps=8,
guidance_scale=0,
eta=0.3,
strength=0.99,
generator=torch.Generator(device=device).manual_seed(0),
).images[0]
grid_image = make_image_grid([init_image, mask_image, image], rows=1, cols=3)

社区模型适配
import torch
from diffusers import StableDiffusionXLPipeline
from scheduling_tcd import TCDScheduler
device = "cuda"
base_model_id = "cagliostrolab/animagine-xl-3.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 = "一名身着考究军装的男子,目光坚毅。制服细节精致,帽檐下露出几缕被风吹散的鲜艳发丝。"
image = pipe(
prompt=prompt,
num_inference_steps=8,
guidance_scale=0,
eta=0.3,
generator=torch.Generator(device=device).manual_seed(0),
).images[0]

结合风格化LoRA
import torch
from diffusers import StableDiffusionXLPipeline
from scheduling_tcd import TCDScheduler
device = "cuda"
base_model_id = "stabilityai/stable-diffusion-xl-base-1.0"
tcd_lora_id = "h1t/TCD-SDXL-LoRA"
styled_lora_id = "TheLastBen/Papercut_SDXL"
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, adapter_name="tcd")
pipe.load_lora_weights(styled_lora_id, adapter_name="style")
pipe.set_adapters(["tcd", "style"], adapter_weights=[1.0, 1.0])
prompt = "冬日雪山的剪纸艺术"
image = pipe(
prompt=prompt,
num_inference_steps=4,
guidance_scale=0,
eta=0.3,
generator=torch.Generator(device=device).manual_seed(0),
).images[0]

ControlNet兼容性
深度ControlNet
import torch
import numpy as np
from PIL import Image
from transformers import DPTFeatureExtractor, DPTForDepthEstimation
from diffusers import ControlNetModel, StableDiffusionXLControlNetPipeline
from diffusers.utils import load_image, make_image_grid
from scheduling_tcd import TCDScheduler
device = "cuda"
depth_estimator = DPTFor