Diffusers 文档
T2I-Adapter
并获得增强的文档体验
开始使用
T2I-Adapter
T2I-Adapter 是一种轻量级适配器模型,它提供额外的条件输入图像(线条画、边缘检测、草图、深度、姿态)以更好地控制图像生成。它类似于 ControlNet,但它要小得多(约 77M 参数和约 300MB 文件大小),因为它只将权重插入到 UNet 中,而不是复制和训练它。
T2I-Adapter 仅可用于使用 Stable Diffusion XL (SDXL) 模型进行训练。
本指南将探索 train_t2i_adapter_sdxl.py 训练脚本,帮助您熟悉它,以及如何根据自己的用例进行调整。
在运行脚本之前,请确保从源代码安装库
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
然后导航到包含训练脚本的示例文件夹并安装您正在使用的脚本所需的依赖项
cd examples/t2i_adapter
pip install -r requirements.txt
🤗 Accelerate 是一个帮助您在多个 GPU/TPU 上或使用混合精度进行训练的库。它将根据您的硬件和环境自动配置您的训练设置。请查看 🤗 Accelerate 快速入门 以了解更多信息。
初始化 🤗 Accelerate 环境
accelerate config
要设置默认的 🤗 Accelerate 环境而不选择任何配置
accelerate config default
或者如果您的环境不支持交互式 shell(例如笔记本),您可以使用
from accelerate.utils import write_basic_config
write_basic_config()
最后,如果您想在自己的数据集上训练模型,请查看 创建训练数据集 指南,了解如何创建与训练脚本兼容的数据集。
以下部分重点介绍了训练脚本中对于理解如何修改它很重要的部分,但它没有详细介绍脚本的每个方面。如果您有兴趣了解更多信息,请随时阅读 脚本,如果您有任何问题或疑虑,请告诉我们。
脚本参数
训练脚本提供了许多参数,可帮助您自定义训练运行。所有参数及其描述都可以在 parse_args()
函数中找到。它为每个参数提供了默认值,例如训练批次大小和学习率,但您也可以根据需要,在训练命令中设置自己的值。
例如,要激活梯度累积,请将 --gradient_accumulation_steps
参数添加到训练命令中。
accelerate launch train_t2i_adapter_sdxl.py \ ----gradient_accumulation_steps=4
许多基本和重要的参数在文本到图像训练指南中都有描述,因此本指南只关注相关的 T2I-Adapter 参数。
--pretrained_vae_model_name_or_path
:预训练 VAE 的路径;SDXL VAE 已知存在数值不稳定性,因此此参数允许您指定一个更好的 VAE。--crops_coords_top_left_h
和--crops_coords_top_left_w
:包含在 SDXL 裁剪坐标嵌入中的高度和宽度坐标。--conditioning_image_column
:数据集中条件图像的列。--proportion_empty_prompts
:将替换为空字符串的图像提示的比例。
训练脚本
与脚本参数一样,文本到图像训练指南中提供了训练脚本的详细说明。本指南将重点介绍脚本中与 T2I-Adapter 相关的部分。
训练脚本首先准备数据集。这包括对提示进行标记化以及对图像和条件图像应用变换。
conditioning_image_transforms = transforms.Compose( [ transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR), transforms.CenterCrop(args.resolution), transforms.ToTensor(), ] )
在 main()
函数中,T2I-Adapter 要么从预训练的适配器加载,要么随机初始化。
if args.adapter_model_name_or_path:
logger.info("Loading existing adapter weights.")
t2iadapter = T2IAdapter.from_pretrained(args.adapter_model_name_or_path)
else:
logger.info("Initializing t2iadapter weights.")
t2iadapter = T2IAdapter(
in_channels=3,
channels=(320, 640, 1280, 1280),
num_res_blocks=2,
downscale_factor=16,
adapter_type="full_adapter_xl",
)
优化器 为 T2I-Adapter 参数初始化。
params_to_optimize = t2iadapter.parameters() optimizer = optimizer_class( params_to_optimize, lr=args.learning_rate, betas=(args.adam_beta1, args.adam_beta2), weight_decay=args.adam_weight_decay, eps=args.adam_epsilon, )
最后,在训练循环中,适配器条件图像和文本嵌入被传递给 UNet 以预测噪声残差。
t2iadapter_image = batch["conditioning_pixel_values"].to(dtype=weight_dtype)
down_block_additional_residuals = t2iadapter(t2iadapter_image)
down_block_additional_residuals = [
sample.to(dtype=weight_dtype) for sample in down_block_additional_residuals
]
model_pred = unet(
inp_noisy_latents,
timesteps,
encoder_hidden_states=batch["prompt_ids"],
added_cond_kwargs=batch["unet_added_conditions"],
down_block_additional_residuals=down_block_additional_residuals,
).sample
如果您想了解更多关于训练循环如何工作的信息,请查看 理解管道、模型和调度器 教程,它分解了去噪过程的基本模式。
启动脚本
现在您已准备好启动训练脚本!🚀
在此示例训练中,您将使用 fusing/fill50k 数据集。如果您愿意,也可以创建并使用自己的数据集(请参阅创建训练数据集指南)。
将环境变量 MODEL_DIR
设置为 Hub 上的模型 ID 或本地模型的路径,并将 OUTPUT_DIR
设置为您要保存模型的目录。
下载以下图像以进行条件训练
wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_1.png wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_2.png
要使用 Weights & Biases 监控训练进度,请将 --report_to=wandb
参数添加到训练命令中。您还需要将 --validation_image
、--validation_prompt
和 --validation_steps
添加到训练命令中以跟踪结果。这对于调试模型和查看中间结果非常有用。
export MODEL_DIR="stabilityai/stable-diffusion-xl-base-1.0"
export OUTPUT_DIR="path to save model"
accelerate launch train_t2i_adapter_sdxl.py \
--pretrained_model_name_or_path=$MODEL_DIR \
--output_dir=$OUTPUT_DIR \
--dataset_name=fusing/fill50k \
--mixed_precision="fp16" \
--resolution=1024 \
--learning_rate=1e-5 \
--max_train_steps=15000 \
--validation_image "./conditioning_image_1.png" "./conditioning_image_2.png" \
--validation_prompt "red circle with blue background" "cyan circle with brown floral background" \
--validation_steps=100 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--report_to="wandb" \
--seed=42 \
--push_to_hub
训练完成后,您可以将 T2I-Adapter 用于推理
from diffusers import StableDiffusionXLAdapterPipeline, T2IAdapter, EulerAncestralDiscreteSchedulerTest
from diffusers.utils import load_image
import torch
adapter = T2IAdapter.from_pretrained("path/to/adapter", torch_dtype=torch.float16)
pipeline = StableDiffusionXLAdapterPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", adapter=adapter, torch_dtype=torch.float16
)
pipeline.scheduler = EulerAncestralDiscreteSchedulerTest.from_config(pipe.scheduler.config)
pipeline.enable_xformers_memory_efficient_attention()
pipeline.enable_model_cpu_offload()
control_image = load_image("./conditioning_image_1.png")
prompt = "pale golden rod circle with old lace background"
generator = torch.manual_seed(0)
image = pipeline(
prompt, image=control_image, generator=generator
).images[0]
image.save("./output.png")
下一步
恭喜您成功训练了一个 T2I-Adapter 模型!🎉 欲了解更多信息:
- 阅读《使用 T2I-Adapters 实现 SDXL 的高效可控生成》博客文章,了解更多关于 T2I-Adapter 团队的实验结果。