Wuerstchen
The Wuerstchen 模型通过将潜在空间压缩 42 倍来大幅降低计算成本,同时不影响图像质量并加速推理。在训练期间,Wuerstchen 使用两个模型(VQGAN + 自编码器)来压缩潜在变量,然后将第三个模型(文本条件潜在扩散模型)与这个高度压缩的空间进行条件化以生成图像。
为了将先验模型放入 GPU 内存并加快训练速度,请分别尝试启用 gradient_accumulation_steps
、gradient_checkpointing
和 mixed_precision
。
本指南探讨了 train_text_to_image_prior.py 脚本,以帮助您对其有更深入的了解,以及如何将其适用于您自己的用例。
在运行脚本之前,请确保您已从源代码安装库
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
然后导航到包含训练脚本的示例文件夹,并安装您正在使用的脚本所需的依赖项
cd examples/wuerstchen/text_to_image
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()
函数中找到。它为每个参数提供了默认值,例如训练批大小和学习率,但如果您愿意,也可以在训练命令中设置自己的值。
例如,要使用 fp16 格式通过混合精度加速训练,请将 --mixed_precision
参数添加到训练命令中
accelerate launch train_text_to_image_prior.py \
--mixed_precision="fp16"
大多数参数与 文本到图像 训练指南中的参数相同,所以让我们直接深入到 Wuerstchen 训练脚本!
训练脚本
训练脚本也与 文本到图像 训练指南类似,但它已修改为支持 Wuerstchen。本指南重点关注 Wuerstchen 训练脚本中独有的代码。
The main()
函数首先初始化图像编码器 - 一个 EfficientNet - 以及通常的调度器和标记器。
with ContextManagers(deepspeed_zero_init_disabled_context_manager()):
pretrained_checkpoint_file = hf_hub_download("dome272/wuerstchen", filename="model_v2_stage_b.pt")
state_dict = torch.load(pretrained_checkpoint_file, map_location="cpu")
image_encoder = EfficientNetEncoder()
image_encoder.load_state_dict(state_dict["effnet_state_dict"])
image_encoder.eval()
您还将加载用于优化的 WuerstchenPrior
模型。
prior = WuerstchenPrior.from_pretrained(args.pretrained_prior_model_name_or_path, subfolder="prior")
optimizer = optimizer_cls(
prior.parameters(),
lr=args.learning_rate,
betas=(args.adam_beta1, args.adam_beta2),
weight_decay=args.adam_weight_decay,
eps=args.adam_epsilon,
)
def preprocess_train(examples):
images = [image.convert("RGB") for image in examples[image_column]]
examples["effnet_pixel_values"] = [effnet_transforms(image) for image in images]
examples["text_input_ids"], examples["text_mask"] = tokenize_captions(examples)
return examples
最后,训练循环 处理使用 EfficientNetEncoder
将图像压缩到潜在空间,向潜在变量添加噪声,并使用 WuerstchenPrior
模型预测噪声残差。
pred_noise = prior(noisy_latents, timesteps, prompt_embeds)
如果您想了解有关训练循环如何工作的更多信息,请查看 理解管道、模型和调度器 教程,该教程分解了降噪过程的基本模式。
启动脚本
一旦您完成所有更改或对默认配置感到满意,您就可以启动训练脚本了!🚀
将 DATASET_NAME
环境变量设置为 Hub 中的数据集名称。本指南使用 Naruto BLIP 标题 数据集,但您也可以创建和训练自己的数据集(请参阅 创建用于训练的数据集 指南)。
要使用 Weights & Biases 监控训练进度,请将 --report_to=wandb
参数添加到训练命令中。您还需要将 --validation_prompt
添加到训练命令中以跟踪结果。这对于调试模型和查看中间结果非常有用。
export DATASET_NAME="lambdalabs/naruto-blip-captions"
accelerate launch train_text_to_image_prior.py \
--mixed_precision="fp16" \
--dataset_name=$DATASET_NAME \
--resolution=768 \
--train_batch_size=4 \
--gradient_accumulation_steps=4 \
--gradient_checkpointing \
--dataloader_num_workers=4 \
--max_train_steps=15000 \
--learning_rate=1e-05 \
--max_grad_norm=1 \
--checkpoints_total_limit=3 \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--validation_prompts="A robot naruto, 4k photo" \
--report_to="wandb" \
--push_to_hub \
--output_dir="wuerstchen-prior-naruto-model"
训练完成后,您可以使用新训练的模型进行推理!
import torch
from diffusers import AutoPipelineForText2Image
from diffusers.pipelines.wuerstchen import DEFAULT_STAGE_C_TIMESTEPS
pipeline = AutoPipelineForText2Image.from_pretrained("path/to/saved/model", torch_dtype=torch.float16).to("cuda")
caption = "A cute bird naruto holding a shield"
images = pipeline(
caption,
width=1024,
height=1536,
prior_timesteps=DEFAULT_STAGE_C_TIMESTEPS,
prior_guidance_scale=4.0,
num_images_per_prompt=2,
).images
下一步
恭喜您训练了一个Wuerstchen模型!若要了解有关如何使用新模型的更多信息,以下内容可能会有所帮助
- 查看Wuerstchen API 文档,以详细了解如何使用文本到图像生成管道及其限制。