文章主题:关键词:Dreambooth, 全模型微调, LoRA 训练支持, 稳定扩散
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 数据集 微调模型:
这里需要注意的一件事是学习率为“1e-4”,远大于常规微调的通常学习率 (通常为“~1e-6”的数量级)。这是上次运行的 W&B dashboard,在 2080 Ti GPU (11 GB 内存)。我没有尝试优化超参数,所以请自行尝试!Sayak 在 T4 (16 GB 内存) 上又跑了一次,这是 他的最终模型,这里是 使用它的演示空间。
Sayak 的 LoRA 模型输出示例有关 diffusers 中 LoRA 支持的更多详细信息,请参阅 我们的文档——它将始终与实现保持同步。
推理
正如我们所探讨的,LoRa 技术的一个显著优点在于,我们可以通过训练较小的权重来实现比原始模型更好的性能。为了实现这一目标,我们设计了一种推理方法,可以在未经修改的稳定扩散模型权重之上添加额外的权重。接下来,我们将详细介绍这个方法是如何运作的。
首先,我们将使用 Hub API 自动确定用于微调 LoRA 模型的基本模型是什么。从 Sayak的模型 开始,我们可以使用这段代码:
此代码段将打印他用于微调的模型,即 “CompVis/stable-diffusion-v1-4″。就我而言,我从 Stable Diffusion 1.5 版开始训练我的模型,因此如果您使用 我的 LoRA 模型 运行相同的代码,您会看到输出是 runwayml/stable-diffusion-v1-5。
如果您使用 –push_to_hub 选项,我们在上一节中看到的微调脚本会自动填充有关基本模型的信息。正如您在 pokemon-lora 的介绍文档 中所见,这被记录为模型存储库的“自述文件”文件中的元数据标签。
在选定LoRa技术进行微调基础模型之后,我们导入了一条典型的稳定扩散通道。接下来,我们将利用DPMSolverMultistepScheduler对其进行个性化定制,从而实现超高速的推理过程:
在探索神秘领域时,我们采用了hub方法来加载LoRa权重,将其置于常规模型权重的上方。接下来,我们将pipeline迁移至CUDA设备并进行推理操作。
用 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 (忠东)AI时代,拥有个人微信机器人AI助手!AI时代不落人后!
免费ChatGPT问答,办公、写作、生活好得力助手!
搜索微信号aigc666aigc999或上边扫码,即可拥有个人AI助手!