跳到正文
原文
Hugging Face Blog·· 2024-01-02精选AI 评分61

Hugging Face 发布 diffusers 版 SDXL LoRA 高级训练脚本

LoRA training scripts of the world, unite!

AI 导读

Hugging Face 发布 SDXL LoRA 高级训练脚本,把 Pivotal Tuning 与 Prodigy 优化器等社区 SOTA 做法整合进 diffusers,并提供 Colab 与带 UI 的训练 Space。

推荐理由

整理 SDXL Dreambooth LoRA 微调的社区最佳实践,包括 Pivotal Tuning、Prodigy 优化器与数据集构建等可复用方法。

正文 · AI 翻译

一份由社区推导出的 SD-XL Dreambooth LoRA 微调部分 SOTA 实践指南

TL;DR

我们将 Replicate 的 SDXL Cog 训练器所用的 Pivotal Tuning 技术与 Kohya 训练器中所用的 Prodigy 优化器(以及一系列其他优化)结合起来,在针对 SDXL 训练 Dreambooth LoRA 时取得了非常好的效果。 在 diffusers 上查看训练脚本🧨。 在 Colab 上试用。

如果你想跳过技术讨论,可以使用本博客中的所有技术,并在一个简单的 UI 和精心挑选的参数(你可以自行调整)下,在 HF Mirror Spaces 上进行训练。

概览

使用 LoRA dreambooth 微调的 Stable Diffusion XL(SDXL)模型,仅用少量图像就能在捕捉新概念方面取得惊人效果,同时保持 SDXL 的美学和图像质量,并且所需的计算量和资源相对较少。在这里查看一些很棒的 SDXL LoRA。
在这篇博客中,我们将回顾一些让 LoRA 微调跑得飞起的流行实践和技术,并展示你现在如何用 diffusers 运行或训练你自己的 LoRA!

回顾:LoRA(低秩适应)是一种用于 Stable Diffusion 模型的微调技术,它会对图像与提示交汇的关键交叉注意力层进行轻微调整。它能在质量上媲美完整微调模型,同时速度快得多,所需计算量也更少。要进一步了解 LoRA 的工作原理,请参阅我们之前的文章——使用 LoRA 进行高效的 Stable Diffusion 微调。

内容:

  1. Techniques/tricks
    1. 关键调优
    2. 自适应优化器
    3. 推荐实践 - 文本编码器学习率、自定义标注、数据集重复、最小信噪比 gamma、训练集创建
  2. 实验设置与结果
  3. Inference
    1. Diffusers 推理
    2. Automatic1111/ComfyUI 推理

致谢 ❤️: 本指南中展示的技术——算法、训练脚本、实验和探索——受到以下贡献者工作的启发,并建立在其基础之上:Nataniel Ruiz:Dreambooth,Rinon Gal:Textual Inversion,Ron Mokady:Pivotal Tuning,Simo Ryu:cog-sdxl, Kohya:sd-scripts,The Last Ben:fast-stable-diffusion。我们向他们以及社区的其他成员致以最诚挚的感谢!🙌

关键调优

关键调优是一种将文本反转与常规扩散微调相结合的方法。对于 Dreambooth,通常你会提供一个罕见 token 作为触发词,比如“an sks dog”。然而,这些 token 通常还带有其他语义含义,可能会影响你的结果。社区中流行的 sks 例子,实际上与一个武器品牌有关。

为了解决这个问题,我们向模型的文本编码器中插入新的 token,而不是复用现有的 token。然后我们优化新插入的 token 嵌入来表示新概念:这就是文本反转——我们学会通过嵌入空间中的新“词”来表示该概念。一旦我们获得了用于表示它的新 token 及其嵌入,我们就可以用这些 token 嵌入来训练 Dreambooth LoRA,从而兼得两者的优势。

训练

在我们新的训练脚本中,您可以通过提供以下参数来进行文本反转训练

--train_text_encoder_ti
--train_text_encoder_ti_frac=0.5
--token_abstraction="TOK"
--num_new_tokens_per_abstraction=2
--adam_weight_decay_text_encoder
  • train_text_encoder_ti 能够训练新概念的嵌入
  • train_text_encoder_ti_frac 指定何时停止文本反转(即停止对文本嵌入的优化,并仅继续优化 UNet)。 中途转向(即在前半部分训练周期执行文本反转) 是 cog sdxl 示例中的默认值,我们的实验也验证了这一点。我们鼓励在这方面进行尝试。
  • token_abstraction this refers to the concept identifier, the word used in the image captions to describe the concept we wish to train on. Your choice of token abstraction should be used in your instance prompt, validation prompt or custom captions. Here we chose TOK, so, for example, "a photo of a TOK" can be the instance prompt. As --token_abstraction is a place-holder, before training we insert the new tokens in place of TOK and optimize them (meaning "a photo of TOK" becomes "a photo of <s0><s1>" during training, where <s0><s1> are the new tokens). Hence, it's also crucial that token_abstraction corresponds to the identifier used in the instance prompt, validation prompt and custom prompts(if used).
    • num_new_tokens_per_abstraction 为每个 token_abstraction 初始化新 token 的数量——即为模型的每个文本编码器插入并训练多少个新 token。默认值为 2,我们鼓励您尝试并分享您的结果!
  • adam_weight_decay_text_encoder 用于为文本编码器参数设置不同的权重衰减值( 与 UNet 参数所用的值不同)。`

自适应优化器

在训练/微调扩散模型(或任何机器学习模型)时,我们使用优化器来引导我们走向收敛训练目标的最优路径——即所选损失函数的最小值点,代表模型已学会我们试图教给它的内容的状态。深度学习任务的标准(且最先进的)选择是 Adam 和 AdamW 优化器。

然而,它们要求用户大量调整通向收敛的超参数(如学习率、权重衰减等)。这可能导致耗时的实验,产生次优结果,而且即使您找到了理想的学习率,如果训练期间学习率保持不变,仍可能导致收敛问题。某些参数可能受益于更频繁的更新以加速收敛,而其他参数可能需要更小的调整以避免超出最优值。为应对这一挑战,引入了具有自适应学习率的算法,如 Adafactor 和 Prodigy。这些方法通过根据每个参数的过去梯度动态调整其学习率,优化了算法在优化景观中的遍历。

我们选择多关注一下 Prodigy,因为我们认为它对 Dreambooth LoRA 训练特别有益!

训练

--optimizer="prodigy"

使用 prodigy 时,通常良好的做法是设置-

--learning_rate=1.0

被认为对扩散模型尤其是 LoRA 训练有益的附加设置包括:

--prodigy_safeguard_warmup=True
--prodigy_use_bias_correction=True
--adam_beta1=0.9
# Note these are set to values different than the default:
--adam_beta2=0.99 
--adam_weight_decay=0.01

使用 prodigy 训练时,您还可以调整额外的超参数 (例如- --prodigy_beta3、prodigy_decouple、prodigy_safeguard_warmup),本文不会深入探讨这些内容, 但您可以此处了解更多。

附加良好实践

除关键调优和自适应优化器外,还有一些其他技术可能影响您训练的 LoRA 质量,所有这些都已整合到新的 diffusers 训练脚本中。

文本编码器和 UNet 的独立学习率

在优化文本编码器时,社区普遍认为为其设置不同的学习率( 相对于 UNet 的学习率)可以获得更好的质量结果——具体来说,为文本编码器设置更低的学习率,因为它往往更快过拟合。 * 在执行 pivotal tuning 时,UNet 和文本编码器学习率不同的重要性也很明显——在这种情况下,为文本编码器设置更高的学习率被认为更好。 * 但请注意,当使用 Prodigy(或一般的自适应优化器)时,我们对所有可训练参数使用相同的初始学习率,并让优化器发挥它的魔力 ✨

训练

--train_text_encoder
--learning_rate=1e-4 #unet
--text_encoder_lr=5e-5 

--train_text_encoder 可以完整训练文本编码器(即文本编码器的权重被完全优化,而不仅仅是优化我们在 textual inversion 中看到的插入嵌入(--train_text_encoder_ti))。 如果你希望文本编码器的学习率始终与 --learning_rate 匹配,请设置 --text_encoder_lr=None。

自定义标注

虽然在一组全部使用相同实例提示(例如 "photo of a person" 或 "in the style of " 等)标注的图像上进行训练可以获得不错的结果,但使用相同的标注可能会导致结果不理想,这取决于所学概念的复杂性、模型对该概念的“熟悉”程度,以及训练集对该概念的捕获程度。

训练 要使用自定义标注,首先确保你已经安装了 datasets 库,否则你可以通过以下方式安装 -

!pip install datasets

要加载自定义标注,我们需要训练集目录遵循 datasets ImageFolder 的结构, 其中包含图像以及每张图像对应的标注。

  • 选项 1: 你从 hub 中选择一个已经包含图像和提示的数据集——例如 LinoyTsaban/3d_icon。现在你只需 在训练参数中指定数据集名称和标注列的名称(在本例中为 "prompt"):

--dataset_name=LinoyTsaban/3d_icon
--caption_column=prompt
  • 选项 2: 你希望使用自己的图像并为其添加标注。在这种情况下,你可以使用 这个 colab notebook 来 使用 BLIP 自动为图像添加标注,或者你可以在元数据文件中手动创建标注。然后 你按照同样的方式进行,将 --dataset_name 指定为你的文件夹路径,将 --caption_column 指定为标注的列名。

Min-SNR Gamma 加权

训练扩散模型常常面临收敛缓慢的问题,部分原因是不同时间步之间的优化方向相互冲突。Hang 等人通过引入 简单的 Min-SNR-gamma 方法找到了缓解此问题的方法。该方法基于截断的信噪比调整时间步的损失权重,从而有效地平衡时间步之间的冲突。 * 对于小数据集,Min-SNR 加权策略的效果可能不明显,但对于更大的数据集,效果可能会更明显。 * snr vis 在 Weights and Biases 上找到这个项目,它比较了以下设置的损失曲面:snr_gamma 设置为 5.0、1.0 和 None。

训练

要使用 Min-SNR gamma,请为以下参数设置一个值:

--snr_gamma=5.0

默认情况下为 --snr_gamma=None,即不使用。启用 --snr_gamma 时,推荐值为 5.0。

重复

这个参数指的是数据集中一张图像在训练集中被重复的次数。它与 epoch 的不同之处在于,图像会先被重复,然后才被打乱。

训练

要启用重复,只需将大于 1 的整数值设置为重复次数-

--repeats

默认情况下,--repeats=1,即训练集不重复

训练集创建

  • 正如那句流行的话所说——“垃圾进,垃圾出”。仅用少量图像就可以轻松训练出良好的 Dreambooth LoRA,但这些图像的质量对微调后的模型影响非常大。

  • 通常,在对某个物体/主体进行微调时,我们要确保训练集中包含尽可能以多种不同方式描绘该物体/主体的图像,以便我们能够以这些方式对其进行提示。

  • 例如,如果我的概念是这个红色背包:(可在 google/dreambooth 数据集中找到)

  • 我可能还想提示它被人背着的样子,所以要有这样的示例:

    in the training set - that fits that scenario - will likely make it easier for the model to generalize to that setting/composition during inference.

特别是在人脸上进行训练时,关于数据集,你可能需要记住以下几点:

  1. 如果可能,始终选择高分辨率、高质量的图像。模糊或低分辨率的图像可能会损害微调过程。

  2. 在人脸训练中,建议训练集中不要出现其他人脸,因为我们不希望对应训练的是哪张脸这一点产生模糊不清的概念。

  3. 特写照片对于实现真实感很重要,但也应包含良好的全身照,以提高泛化到不同姿势/构图的能力。

  4. 我们建议避免使用主体距离很远的照片,因为这类图像中的大多数像素与我们希望优化的概念无关,模型从中能学到的东西不多。

  5. 避免重复的背景/服装/姿势——力求在光照、姿势、背景和面部表情方面具备多样性。多样性越高,LoRA 就会越灵活、越具有泛化能力。

  6. 先验保持损失 -
    先验保持损失是一种使用模型自己生成的样本来帮助其学习如何生成更多样化图像的方法。由于这些样本图像与你提供的图像属于同一类别,它们有助于模型保留其已学到的关于该类别的知识,以及它如何利用自己对该类别的已有知识来生成新的构图。 用于正则化的真实图像 VS 模型生成的图像 在选择类别图像时,你可以在合成图像(即由扩散模型生成的图像)和真实图像之间做出选择。支持使用真实图像的人认为,它们能提高微调模型的真实感。另一方面,也有人认为,使用模型生成的图像更能达到保留模型对该类别的知识和整体美学的目的。

  7. 名人相似者 - 这更多是关于用于训练的字幕/实例提示的评论。一些微调者在结果上有所改善,当时他们用令牌标识符 + 基础模型知道的、与被训练者相似的一位公众人物来进行提示。

训练并使用先验保持损失

--with_prior_preservation
--class_data_dir
--num_class_images
--class_prompt

--with_prior_preservation - 支持带先验保留的训练
--class_data_dir - 包含类别图像的文件夹路径
—-num_class_images - 用于先验保留损失的最小类别图像数量。如果 --class_data_dir 中已有的图像不足,将使用 --class_prompt 额外采样图像。

实验设置与结果

为了探索所述方法,我们在不同的目标(风格调优、人脸和物体)上实验了这些技术的不同组合。

为了缩小无限多的超参数取值范围,我们以一些更流行和常见的配置作为起点,并在此基础上进行调整。

Huggy Dreambooth LoRA 首先,我们感兴趣的是微调一个 Huggy LoRA,这意味着同时教授一种艺术风格和一个特定角色。 对于这个例子,我们整理了一个高质量的 Huggy 吉祥物数据集(使用了 Chunte-Lee 出色的艺术作品),包含 31 张图像并配有自定义描述。

配置:

--train_batch_size = 1, 2,3, 4
-repeats = 1,2
-learning_rate = 1.0 (Prodigy), 1e-4 (AdamW)
-text_encoder_lr = 1.0 (Prodigy), 3e-4, 5e-5 (AdamW)
-snr_gamma = None, 5.0 
-max_train_steps = 1000, 1500, 1800
-text_encoder_training = regular finetuning, pivotal tuning (textual inversion)
  • 完整文本编码器调优 VS 关键调优 - 我们注意到关键调优取得的结果与完整文本编码器训练相当或更好,而且无需优化 text_encoder 的权重。
  • Min SNR Gamma
    • 我们比较了未使用 snr_gamma 训练的 version1,和使用 snr_gamma = 5.0 训练的 version2 具体来说,我们在两个版本中使用了以下参数(并在 version 2 中添加了 snr_gamma)
--pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0" \
--pretrained_vae_model_name_or_path="madebyollin/sdxl-vae-fp16-fix" \
--dataset_name="./huggy_clean" \
--instance_prompt="a TOK emoji"\
--validation_prompt="a TOK emoji dressed as Yoda"\
--caption_column="prompt" \
--mixed_precision="bf16" \
--resolution=1024 \
--train_batch_size=4 \
--repeats=1\
--report_to="wandb"\
--gradient_accumulation_steps=1 \
--gradient_checkpointing \
--learning_rate=1e-4 \
--text_encoder_lr=3e-4 \
--optimizer="adamw"\
--train_text_encoder_ti\
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--rank=32 \
--max_train_steps=1000 \
--checkpointing_steps=2000 \
--seed="0" \
  • AdamW vs Prodigy Optimizer
    • 我们比较了使用 optimizer=prodigy 训练的 version1,和使用 optimizer=adamW 训练的 [version2](https://wandb.ai/linoy/dreambooth-lora-sd-xl/runs/cws7nfzg? workspace=user-linoy)。两个版本都使用关键调优进行训练。
    • When training with optimizer=prodigy we set the initial learning rate to be 1. For adamW we used the default learning rates used for pivotal tuning in cog-sdxl (1e-4, 3e-4 for learning_rate and text_encoder_lr respectively) as we were able to reproduce good results with these settings.
    • 所有其他训练参数和设置都相同。具体来说:
    --pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0" \
  --pretrained_vae_model_name_or_path="madebyollin/sdxl-vae-fp16-fix" \
  --dataset_name="./huggy_clean" \
  --instance_prompt="a TOK emoji"\
  --validation_prompt="a TOK emoji dressed as Yoda"\
  --output_dir="huggy_v11" \
  --caption_column="prompt" \
  --mixed_precision="bf16" \
  --resolution=1024 \
  --train_batch_size=4 \
  --repeats=1\
  --report_to="wandb"\
  --gradient_accumulation_steps=1 \
  --gradient_checkpointing \
  --train_text_encoder_ti\
  --lr_scheduler="constant" \
  --snr_gamma=5.0 \
  --lr_warmup_steps=0 \
  --rank=32 \
  --max_train_steps=1000 \
  --checkpointing_steps=2000 \
  --seed="0" \

Y2K Webpage LoRA 让我们探索另一个例子,这次是在由 27 张 1990 年代和 2000 年代初期网页截图组成的数据集上进行训练,这些截图是我们(怀旧地 🥲)从互联网上抓取的:

配置:

–rank = 4,16,32
-optimizer = prodigy, adamW
-repeats = 1,2,3
-learning_rate = 1.0 (Prodigy), 1e-4 (AdamW)
-text_encoder_lr = 1.0 (Prodigy), 3e-4, 5e-5 (AdamW)
-snr_gamma = None, 5.0 
-train_batch_size = 1, 2, 3, 4
-max_train_steps = 500, 1000, 1500
-text_encoder_training = regular finetuning, pivotal tuning

这个例子展示了与之前略有不同的行为。 虽然在两种情况下我们使用的图像数量大致相同(即约 30 张), 但我们注意到,对于这个风格 LoRA,那些在 Huggy LoRA 上产生良好结果的相同设置会导致网页风格过拟合。那里

对于 v1,我们选择在训练 Huggy LoRA 时对我们最有效的设置作为起点 - 它明显过拟合了,所以我们试图在接下来的版本中通过调整 --max_train_steps、--repeats、--train_batch_size 和 --snr_gamma 来解决这个问题。 更具体地说,这些是我们在每个版本之间更改的设置(其余所有设置保持不变):

param v1 v2 v3 v4 v5 v6 v7 v8
max_train_steps 1500 1500 1500 1000 1000 1000 1000 1000
repeats 1 1 2 2 1 1 2 1
train_batch_size 4 4 4 4 2 1 1 1
instance_data_dir web_y2k 从 web_y2k 随机采样的 14 张图像 web_y2k web_y2k web_y2k web_y2k web_y2k web_y2k
snr_gamma 5.0 5.0 5.0 5.0 - - 5.0 5.0

我们发现 v4、v5 和 v6 达到了最佳平衡:

Face LoRA 在面部图像上训练时,我们希望 LoRA 生成的图像尽可能逼真且与原人物相似, 同时也能很好地泛化到训练集中未出现的背景和构图上。 针对这个用例,我们使用了由 Linoy 的面部组成的 6-10 张图像的不同数据集,包括一组同一时间拍摄的特写照片,以及一组在不同场合拍摄的照片(变换背景、光线和服装)以及全身照。 我们了解到,在涉及光线/分辨率/主体对焦时,如果图像质量处于中低水平,则经过更好筛选的较少图像比更多图像效果更好——少即是多:挑选你最好的照片并用它来训练模型! 配置:

rank = 4,16,32, 64
optimizer = prodigy, adamW
repeats = 1,2,3,4
learning_rate = 1.0 , 1e-4
text_encoder_lr = 1.0, 3e-4
snr_gamma = None, 5.0
num_class_images = 100, 150
max_train_steps = 75 * num_images, 100 * num_images, 120 * num_images
text_encoder_training = regular finetuning, pivotal tuning
  • 先验保持损失

    • 与常见做法相反,我们发现使用生成的类别图像会降低与主体的相似度和真实感。
    • 我们创建了一个真实肖像图像的数据集,使用的是从 unsplash 下载的免费许可图像。 你现在也可以在新的训练空间中自动使用它!
    • 当使用真实图像数据集时,我们确实注意到语言漂移更少(即模型不会仅将女人/男人一词与训练过的面孔关联起来,也能生成不同的人),同时在提示训练过的面孔时保持真实感和整体质量。
  • Rank

    • 我们比较了 rank 为 4、16、32 和 64 的 LoRA。我们观察到,在我们探索中测试的设置下,使用 64 rank LoRA 生成的图像往往具有更明显的磨皮效果,皮肤纹理看起来也更不真实。
    • 因此,对于下文详述的实验以及 LoRA ease space,我们使用默认 rank 为 32。
  • 训练步数

  • 尽管少量高质量图像(在我们的例子中是 6 张)效果很好,我们仍然需要确定训练模型的理想步数。

  • 我们在图像数量的几个不同乘数上进行了实验:6 x75 = 450 步 / 6 x100 = 600 步 / 6 x120 = 720 步。

  • 如下所示,我们的初步结果表明,使用 120x 乘数可以获得良好结果(如果数据集足够多样而不至于过拟合,最好不要使用相同的拍摄)

    Inference

    使用上述技术训练的模型进行推理应该与任何训练器一样工作,除了当我们进行 pivotal tuning 时,除了你的 LoRA 的 *.safetensors 权重之外,还有为新 token 随模型一起训练的 *.safetensors 文本嵌入。 为了用这些进行推理,我们在通常加载 LoRA 的方式上增加 2 个步骤:

    1. 从 hub 下载我们训练好的嵌入 (你的嵌入文件名默认设置为 {model_name}_emb.safetensors)
    import torch
    from huggingface_hub import hf_hub_download
    from diffusers import DiffusionPipeline
    from safetensors.torch import load_file
    pipe = DiffusionPipeline.from_pretrained(
            "stabilityai/stable-diffusion-xl-base-1.0",
            torch_dtype=torch.float16,
            variant="fp16",
    ).to("cuda")
    
    # download embeddings
    embedding_path = hf_hub_download(repo_id="LinoyTsaban/web_y2k_lora", filename="web_y2k_emb.safetensors", repo_type="model")
    
    1. 将嵌入加载到文本编码器
    
    # load embeddings to the text encoders
    state_dict = load_file(embedding_path)
    
    # notice we load the tokens <s0><s1>, as "TOK" as only a place-holder and training was performed using the new initialized tokens - <s0><s1>
    # load embeddings of text_encoder 1 (CLIP ViT-L/14)
    pipe.load_textual_inversion(state_dict["clip_l"], token=["<s0>", "<s1>"], text_encoder=pipe.text_encoder, tokenizer=pipe.tokenizer)
    # load embeddings of text_encoder 2 (CLIP ViT-G/14)
    pipe.load_textual_inversion(state_dict["clip_g"], token=["<s0>", "<s1>"], text_encoder=pipe.text_encoder_2, tokenizer=pipe.tokenizer_2)
    
    1. 加载你的 LoRA 并提示它!
    # normal LoRA loading
    pipe.load_lora_weights("LinoyTsaban/web_y2k_lora", weight_name="pytorch_lora_weights.safetensors")
    prompt="a <s0><s1> webpage about an astronaut riding a horse"
    images = pipe(
        prompt,
        cross_attention_kwargs={"scale": 0.8},
    ).images
    # your output image
    images[0]
    

    Comfy UI / AUTOMATIC1111 推理

    新脚本完全支持 Comfy UI 和 AUTOMATIC1111 格式的 textual inversion 加载!

    AUTOMATIC1111 / SD.Next
    在 AUTOMATIC1111/SD.Next 中,我们将同时加载 LoRA 和文本嵌入。

    • LoRA:除了 diffusers 格式之外,该脚本还会训练一个兼容 WebUI 的 LoRA。它生成为 {your_lora_name}.safetensors。然后你可以将其包含在你的 models/Lora 目录中。
    • Embedding:该嵌入对 diffusers 和 WebUI 是相同的。你可以从训练好的模型下载你的 {lora_name}_emb.safetensors 文件,并将其包含在你的 embeddings 目录中。

    然后,你可以通过输入a y2k_emb webpage about the movie Mean Girls <lora:y2k:0.9>来运行推理。你可以正常使用y2k_emb token,包括通过(y2k_emb:1.2)来增加其权重。

    ComfyUI
    在 ComfyUI 中,我们将同时加载一个 LoRA 和一个文本嵌入。

    • LoRA:除了 diffusers 格式之外,该脚本还会训练出一个与 ComfyUI 兼容的 LoRA。它生成的文件为{your_lora_name}.safetensors。然后你可以将它放入你的models/Lora目录中。接着,你会加载 LoRALoader 节点,并将其与你的模型和 CLIP 连接起来。加载 LoRA 的官方指南
    • Embedding:该嵌入在 diffusers 和 WebUI 中是相同的。你可以从训练好的模型中下载你的{lora_name}_emb.safetensors文件,将它放入你的models/embeddings目录,并在提示词中像embedding:y2k_emb这样使用它。加载嵌入的官方指南。

    接下来是什么?

    🚀 更多功能即将推出! 我们正在努力为我们的高级训练脚本添加更多控制和灵活性。请告诉我们你觉得最有帮助的功能!

    🤹 多概念 LoRA Shah 等人最近的一项工作引入了 ZipLoRAs——一种将独立训练的风格 LoRA 和主体 LoRA 合并的方法,以便实现以任意用户提供的风格生成任意用户提供的主体。mkshing 在此处这里实现了一个开源复现版本,它使用了新的且改进过的脚本。

来源:Hugging Face Blog · hf-mirror.com