Diffusers 文件
LoRA
並獲得增強的文件體驗
開始使用
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 層在 lora_layers
中被過濾以進行最佳化。
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 captions 資料集上進行訓練,以生成您自己的火影忍者角色。將環境變數 MODEL_NAME
和 DATASET_NAME
分別設定為模型和資料集。您還應該在 OUTPUT_DIR
中指定儲存模型的位置,並在 HUB_MODEL_ID
中指定要儲存到 Hub 的模型名稱。指令碼將建立並將以下檔案儲存到您的倉庫中
- 儲存的模型檢查點
pytorch_lora_weights.safetensors
(訓練後的 LoRA 權重)
如果您在多個 GPU 上進行訓練,請將 --multi_gpu
引數新增到 accelerate launch
命令中。
在具有 11GB 視訊記憶體的 2080 Ti GPU 上,完整訓練需要約 5 小時。
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 訓練了一個新模型!要了解如何使用您的新模型,以下指南可能會有所幫助
- 瞭解如何載入使用 Kohya 和 TheLastBen 等社群訓練器訓練的不同 LoRA 格式。
- 瞭解如何使用 PEFT 組合多個 LoRA 進行推理。