LoRA
LoRA (大型语言模型的低秩适应) 是一种流行且轻量级的训练技术,可以显著减少可训练参数的数量。它通过在模型中插入少量的新权重,并且只训练这些新权重来实现。这使得使用 LoRA 进行训练更快、更节省内存,并且生成的模型权重更小(通常只有几百 MB),更容易存储和分享。LoRA 还可以与其他训练技术(如 DreamBooth)结合使用,以加速训练。
本指南将探讨 train_text_to_image_lora.py 脚本,帮助你更熟悉它,并了解如何根据自己的需求进行调整。
在运行脚本之前,请确保从源代码安装库:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
导航到包含训练脚本的示例文件夹,并安装你所使用脚本所需的依赖项:
初始化一个 🤗 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 相关的部分。
优化器 使用 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 字幕 数据集来生成你自己的 Naruto 角色。将环境变量 MODEL_NAME
和 DATASET_NAME
分别设置为模型和数据集。你还应该指定在 OUTPUT_DIR
中保存模型的位置,以及在 Hub 上保存模型的名称 HUB_MODEL_ID
。脚本会将以下文件创建并保存到你的仓库中:
- 保存的模型检查点
pytorch_lora_weights.safetensors
(训练的 LoRA 权重)
如果你在多于一个 GPU 上进行训练,请在 accelerate launch
命令中添加 --multi_gpu
参数。
export MODEL_NAME="stable-diffusion-v1-5/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("stable-diffusion-v1-5/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 训练了一个新模型!要了解更多关于如何使用你的新模型,以下指南可能会对你有所帮助:
- 了解如何加载不同格式的 LoRA,这些 LoRA 是使用社区训练器(如 Kohya 和 TheLastBen)训练的。
- 了解如何使用 PEFT 进行推理时组合多个 LoRA。