LoRA
这是一个实验性功能,API 可能会在将来发生变化。
LoRA(大型语言模型的低秩适应) 是一种流行且轻量级的训练技术,可以显著减少可训练参数的数量。它通过在模型中插入少量新的权重来工作,并且只训练这些权重。这使得 LoRA 训练更快、更节省内存,并且产生更小的模型权重(几百兆字节),更易于存储和共享。LoRA 还可以与其他训练技术(如 DreamBooth)结合使用,以加快训练速度。
LoRA 非常灵活,支持 DreamBooth、Kandinsky 2.2、Stable Diffusion XL、文本到图像 和 Wuerstchen。
本指南将探索 train_text_to_image_lora.py 脚本,帮助您熟悉它,以及如何根据自己的用例进行调整。
在运行脚本之前,请确保您从源代码安装库
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
导航到包含训练脚本的示例文件夹,并安装您要使用的脚本所需的依赖项
cd examples/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()
函数中找到。大多数参数都提供了默认值,效果很好,但您也可以在训练命令中设置自己的值。
例如,要增加训练的轮次数量
accelerate launch train_text_to_image_lora.py \ --num_train_epochs=150 \
许多基本和重要的参数在 文本到图像 训练指南中进行了描述,因此本指南只关注与 LoRA 相关的参数
--rank
:要训练的低秩矩阵的内部维度;更高的秩意味着更多可训练参数--learning_rate
:默认学习率为 1e-4,但使用 LoRA,您可以使用更高的学习率
训练脚本
数据集预处理代码和训练循环位于 main()
函数中,如果您需要调整训练脚本,就在这里进行修改。
与脚本参数一样,文本到图像 训练指南中提供了训练脚本的逐步说明。相反,本指南重点介绍了脚本中与 LoRA 相关的部分。
Diffusers 使用来自 PEFT 库的 ~peft.LoraConfig
来设置 LoRA 适配器的参数,例如秩、alpha,以及在哪些模块中插入 LoRA 权重。适配器被添加到 UNet 中,并且只有在 lora_layers
中过滤的 LoRA 层才会被优化。
unet_lora_config = LoraConfig(
r=args.rank,
lora_alpha=args.rank,
init_lora_weights="gaussian",
target_modules=["to_k", "to_q", "to_v", "to_out.0"],
)
unet.add_adapter(unet_lora_config)
lora_layers = filter(lambda p: p.requires_grad, unet.parameters())
优化器 使用 lora_layers
进行初始化,因为这些是唯一要优化的权重
optimizer = optimizer_cls( lora_layers, lr=args.learning_rate, betas=(args.adam_beta1, args.adam_beta2), weight_decay=args.adam_weight_decay, eps=args.adam_epsilon, )
除了设置 LoRA 层之外,训练脚本与 train_text_to_image.py 几乎完全相同!
启动脚本
完成所有更改或您对默认配置感到满意后,您就可以启动训练脚本了!🚀
让我们使用 Naruto BLIP 说明 数据集进行训练,以生成您自己的火影忍者角色。将环境变量 MODEL_NAME
和 DATASET_NAME
分别设置为模型和数据集。您还应该指定在 OUTPUT_DIR
中保存模型的位置,以及使用 HUB_MODEL_ID
在 Hub 上保存模型的名称。脚本会创建以下文件并保存到您的存储库中
- 保存的模型检查点
pytorch_lora_weights.safetensors
(训练后的 LoRA 权重)
如果您在多个 GPU 上进行训练,请将 --multi_gpu
参数添加到 accelerate launch
命令中。
在配备 11GB VRAM 的 2080 Ti GPU 上,完整训练运行大约需要 5 小时。
export MODEL_NAME="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="/sddata/finetune/lora/naruto"
export HUB_MODEL_ID="naruto-lora"
export DATASET_NAME="lambdalabs/naruto-blip-captions"
accelerate launch --mixed_precision="fp16" train_text_to_image_lora.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--dataset_name=$DATASET_NAME \
--dataloader_num_workers=8 \
--resolution=512 \
--center_crop \
--random_flip \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--max_train_steps=15000 \
--learning_rate=1e-04 \
--max_grad_norm=1 \
--lr_scheduler="cosine" \
--lr_warmup_steps=0 \
--output_dir=${OUTPUT_DIR} \
--push_to_hub \
--hub_model_id=${HUB_MODEL_ID} \
--report_to=wandb \
--checkpointing_steps=500 \
--validation_prompt="A naruto with blue eyes." \
--seed=1337
训练完成后,您可以使用您的模型进行推理。
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16).to("cuda")
pipeline.load_lora_weights("path/to/lora/model", weight_name="pytorch_lora_weights.safetensors")
image = pipeline("A naruto with blue eyes").images[0]
下一步
恭喜您使用 LoRA 训练了一个新模型!要了解有关如何使用新模型的更多信息,以下指南可能会有所帮助。
- 了解如何使用社区训练师(如 Kohya 和 TheLastBen) 加载不同的 LoRA 格式。
- 了解如何使用和 组合多个 LoRA 与 PEFT 进行推理。