乐趣区

关于人工智能:使用-LoRA-进行-Stable-Diffusion-的高效参数微调

LoRA: Low-Rank Adaptation of Large Language Models 是微软研究员引入的一项新技术,次要用于解决大模型微调的问题。目前超过数十亿以上参数的具备强能力的大模型 (例如 GPT-3) 通常在为了适应其上游工作的微调中会呈现出微小开销。LoRA 倡议解冻预训练模型的权重并在每个 Transformer 块中注入可训练层 (秩 - 合成矩阵)。因为不须要为大多数模型权重计算梯度,所以大大减少了须要训练参数的数量并且升高了 GPU 的内存要求。钻研人员发现,通过聚焦大模型的 Transformer 注意力块,应用 LoRA 进行的微调品质与全模型微调相当,同时速度更快且须要更少的计算。

用于 Diffusers 的 LoRA 🧨

只管 LoRA 最后是为大模型提出的,并在 transformer 块上进行了演示,但该技术也能够利用于其余中央。在微调 Stable Diffusion 的状况下,LoRA 能够利用于将图像示意与形容它们的提醒相关联的穿插留神层。下图的细节 (摘自 Stable Diffusion 论文) 并不重要,只须要留神黄色块是负责建设图文之间的关系示意就行。

据咱们所知,Simo Ryu (GitHub 用户名 @cloneofsimo) 是第一个提出实用于 Stable Diffusion 的 LoRA 实现的人。如果想查看相干示例和许多其余乏味的探讨和见解。请肯定要看看 他们的 GitHub 我的项目。

为了将 LoRA 的可训练矩阵注入到与穿插注意力层一样深的模型中,过来人们须要以富裕想象力 (但软弱) 的形式破解 diffusers 的源代码。如果 Stable Diffusion 向咱们展现了一件事,那就是社区总是会想出方法来扭转和调整模型以达到创造性目标,咱们喜爱这样!因为许多其余起因,提供操纵穿插注意力层的灵活性可能是无益的,例如更容易采纳 xFormers 等优化技术。Prompt-to-Prompt 等其余创意我的项目能够应用一些简略的办法来拜访这些层,因而咱们决定 为用户提供一种通用的办法来做到这一点。自 12 月下旬以来,咱们始终在测试,并在咱们的 diffusers 中正式公布。

咱们始终在与 @cloneofsimo 单干,为 Dreambooth 和全微调办法提供 Diffusions 中的 LoRA 训练反对!这些技术提供了以下益处:

  • 更快的训练速度
  • 计算要求较低。咱们能够在具备 11 GB VRAM 的 2080 Ti 中创立一个全微调模型!
  • 小了很多的训练模型。因为原始模型已解冻,咱们注入了新层进行训练,因而咱们能够将新层的权重保留为大小约为 3 MB 的单个文件。这比 UNet 模型的原始大小小一千倍

咱们对最初一点特地兴奋。为了让用户分享他们杰出的微调或 dreamboothed 模型,他们必须分享最终模型的残缺正本。其余想要试用它们的用户必须在他们最喜爱的 UI 中下载通过微调的权重,这会减少大量存储和下载老本。截至明天,大概有 1,000 个 Dreambooth 模型在 Dreambooth 概念库中注册,可能还有更多未在库中注册。

应用 LoRA,当初能够公布 单个 3.29 MB 文件 以容许其他人应用你的微调模型。

(感激 GitHub 用户 @mishig25,他是我理解到的首个在平时对话中将 dreamboothing 作为动词的人)。

LoRA 微调

Stable Diffusion 的全模型微调过来既迟缓又艰难,这也是 Dreambooth 或 Textual Inversion 等轻量级办法变得如此风行的局部起因。应用 LoRA,在自定义数据集上微调模型要容易得多。

Diffusers 当初提供了一个 LoRA 微调脚本,能够在低至 11 GB 的 GPU RAM 中运行而无需借助到诸如 8-bit 优化器之类的技巧。这里展现了您如何借助它来应用 Lambda Labs Pokémon 数据集 微调模型:

export MODEL_NAME="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="/sddata/finetune/lora/pokemon"
export HUB_MODEL_ID="pokemon-lora"
export DATASET_NAME="lambdalabs/pokemon-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="Totoro" \
  --seed=1337

这里须要留神的一件事是学习率为“1e-4”,远大于惯例微调的通常学习率(通常为“~1e-6”的数量级)。这是上次运行的 W&B dashboard,在 2080 Ti GPU (11 GB 内存)。我没有尝试优化超参数,所以请自行尝试!Sayak 在 T4 (16 GB 内存) 上又跑了一次,这是 他的最终模型,这里是 应用它的演示空间。

无关 diffusers 中 LoRA 反对的更多详细信息,请参阅 咱们的文档——它将始终与实现放弃同步。

推理

正如咱们所探讨的,LoRA 的次要劣势之一是您能够通过训练比原始模型大小少几个数量级的权重来取得杰出的后果。咱们设计了一个推理过程,容许在未修改的 Stable Diffusion 模型权重之上加载额定的权重。让咱们看看它是如何工作的。

首先,咱们将应用 Hub API 主动确定用于微调 LoRA 模型的根本模型是什么。从 Sayak 的模型 开始,咱们能够应用这段代码:

from huggingface_hub import model_info

# LoRA weights ~3 MB
model_path = "sayakpaul/sd-model-finetuned-lora-t4"

info = model_info(model_path)
model_base = info.cardData["base_model"]
print(model_base)   # CompVis/stable-diffusion-v1-4

此代码段将打印他用于微调的模型,即“CompVis/stable-diffusion-v1-4”。就我而言,我从 Stable Diffusion 1.5 版开始训练我的模型,因而如果您应用 我的 LoRA 模型 运行雷同的代码,您会看到输入是 runwayml/stable-diffusion-v1-5

如果您应用 --push_to_hub 选项,咱们在上一节中看到的微调脚本会主动填充无关根本模型的信息。正如您在 pokemon-lora 的介绍文档 中所见,这被记录为模型存储库的“自述文件”文件中的元数据标签。

在咱们确定了用于应用 LoRA 进行微调的根底模型之后,咱们加载了一个失常的稳固扩散管道。咱们将应用 DPMSolverMultistepScheduler 对其进行自定义,以实现十分疾速的推理:

import torch
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler

pipe = StableDiffusionPipeline.from_pretrained(model_base, torch_dtype=torch.float16)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

神奇的中央来了 。咱们从 hub 加载 LoRA 权重 在惯例模型权重之上,将 pipline 挪动到 cuda 设施并运行推理:

pipe.unet.load_attn_procs(model_path)
pipe.to("cuda")

image = pipe("Green pokemon with menacing face", num_inference_steps=25).images[0]
image.save("green_pokemon.png")

用 LoRA 进行 Dreamboothing

Dreambooth 容许您向 Stable Diffusion 模型“传授”新概念。LoRA 与 Dreambooth 兼容,过程相似于微调,有几个长处:

  • 训练更快。
  • 咱们只须要几张咱们想要训练的主题的图像 (通常 5 或 10 张就足够了)。
  • 如果须要,咱们能够调整文本编码器,以进步对训练主体的保真度。

要应用 LoRA 训练 Dreambooth,您须要应用 此 diffusers 脚本。请看一下 README、文档 和 咱们的超参数摸索博文 理解详细信息.

其余办法

对轻松微调的谋求并不陈腐。除了 Dreambooth 之外,textual inversion 是另一种风行的办法,它试图向训练有素的稳固扩散模型传授新概念。应用 Textual Inversion 的次要起因之一是经过训练的权重也很小且易于共享。然而,它们只实用于单个主题 (或一小部分主题),而 LoRA 可用于通用微调,这意味着它能够适应新的畛域或数据集。

Pivotal Tuning 是一种尝试将 Textual Inversion 与 LoRA 相结合的办法。首先,您应用 textual inversion 技术向模型传授一个新概念,取得一个新的标记嵌入来示意它。而后,您应用 LoRA 训练该 token 嵌入以取得两败俱伤。

咱们还没有应用 LoRA 摸索过 Pivotal Tuning。欢送挑战?🤗


英文原文: https://huggingface.co/blog/lora

原文作者: Pedro Cuenca, Sayak Paul

中文译者: innovation64 (李洋)

审校: zhongdongy (忠东)

退出移动版