QQ|Archiver|小黑屋|宇宙岛Galaxias Ai ( 粤ICP备2024174411号-2 )

GMT+8, 2025-5-4 15:33 , Processed in 0.057572 second(s), 21 queries .

Powered by Galaxias AI

Copyright © 2021-2024 All Rights Reserved.

Stable Diffusion 训练指南 (LyCORIS)

866
0
1
1
小仙女吖嚯 LV1
正文
发布时间:2024-05-21
本帖最后由 小仙女吖嚯 于 2024-5-21 11:17 编辑

LyCORIS
LyCORIS 是对 LoRA 的增强,其实主要包含两个独立的改进:

LoCon (Conventional LoRA): LoRA 只调整了 cross-attention layers,LoCon 还用同样的方法调整了 ResNet 矩阵。更多信息参见 LoCon - LoRA for Convolution Network。

LoHa (LoRA with Hadamard Product): 用 Hadamard Product 替换掉了原方法中的矩阵点乘,理论上在相同的  下能容纳更多(丢失更少)的信息。该方法来自论文 FedPara Low-Rank Hadamard Product For Communication-Efficient Federated Learning。

LyCORIS 还实现了其他几种对 LoRA 改进的变体,因为很少有人用,这里不展开介绍。

LoHa,LyCORIS 的模型在 fine-tune 更多层的前提下,反而可以用更小的 ,因此输出的模型体积也更小。

如果你刚开始,建议无脑选择 LyCORIS 模型。本文也将会以 LyCORIS 模型讲解后面的实操步骤。

准备训练集
收集整理需要训练的角色的图片,20 张以上即可。原则是:

要能清晰地体现出角色特征,例如训练集要覆盖角色的正脸、侧脸、全身、站坐姿等

在保留角色特征的基础上,尽可能 various,例如不同的角度、场景、风格等

将图片正则化,缩放并裁剪到 512x512 或 512x768 或 768x512 这 3 种尺寸之一,并放置到三个不同的目录中。这步不是必须的,对于实在无法裁剪的部分图片可以跳过,但是 SD 模型本身是用 512x512 图片训练的,使用相同的尺寸能获得更好的效果。裁剪图片可以用 Birme.net。

Stable Diffusion 同一次训练中只能处理一种尺寸的图片(推理也一样)。如果你的图片并非全都是 512x512,Kohya Trainer 中已经自带了 bucketize,长宽比相同的图片会被分类到同一个 bucket 作为同一批次训练。因此,即便你做不到把图片全都统一到 512x512,最好也做到仅有少数几种长宽比。

图片加 Tag 的过程通常是自动标注结合手动筛选,自动标注的过程在 Kohya Trainer 脚本中已经包含,因此现在只要先准备好训练集就行了。



训练
推荐使用 Kohya Trainer。由于咱没有足够好的显卡(训练至少需要 6GB VRAM),无论训练还是推理都是通过 Google Colab 进行。该脚本也很好地适配了 Google Colab,一键部署运行。

点击 “Kohya LoRA Dreambooth” 后面的 Open in Colab 按钮开启今天的旅程。

I. Install Kohya Trainer
安装所需的各种依赖。
install_xformers (默认勾选)xformer 是 NVIDIA CPU 特有的一个硬件加速库,能够加速计算并减少 VRAM 使用。
mount_drive (推荐勾选)映射 Google Drive 到 /mount/ 目录,方便最后保存结果到 Google Drive

II. Pretrained Model Selection
下载 Stable diffusion 基础模型。
Stable Diffusion 2.x 虽然训练步数更多,但是训练集中过滤掉了 NSFW 的图片。注意:SD 1.5 和 2.x 不兼容,但基于 SD1.5 训练的模型可以用在任何一个基于 SD1.5 的 checkpoint 上。而社区的大部分二次元 Checkpoint 模型基于 SD1.5 训练。
如果你在训练二次元 waifu,建议选择基于 SD1.5 的 checkpoint 作为基础模型,例如 Anything V5、Counterfeit V3、AbyssOrangeMix3 等。

2.3. Download Available VAE (Optional)

Stable Diffusion 是自带 VAE 的,这一步的含义是是否要下载一个 VAE 替换原来的 VAE 模型。三次元图更接近 SD 原始训练集,一般不需要。
二次元模型可以选择你的基础模型配套的 VAE,或者选择 notebook 中推荐的 anime.vae。

III. Data Acquisition
把之前准备好的图片放到 train_data_dir(training set) 中。可以有子目录,也可以没有。例如:

4.2. Data Annotation
这一步为训练集自动生成 prompt text。脚本的注释中已经给了明确的说明:
Use BLIP Captioning for: General Images
Use Waifu Diffusion 1.4 Tagger V2 for: Anime and Manga-style Images
建议从生成的 tags 中移除掉角色自身的特征,比如:long hair, wolf ears, wolf girl, red eyes, brown hair 等。移除掉 tag 代表着将模型将这些特征当作 general 的情况去对待,换句话说,我们希望模型输出的所有图片都带有这些特征。相反,角色本身之外的特征应当用 tag 标识出,比如角色的几件特定穿着(皮肤),相应的,在画图时也可以通过相同的 tag 来触发这些特征。
参数 undesired_tags 可以快速地做到这一点。如果你时间充裕,咱也建议你以把生成的 prompt 下载到本地,逐个人工校对一遍。
如果你想让你的模型拥有一个 tigger word(例如角色的名字),即,仅当 trigger word 出现在 prompt 中时才绘制对应的角色,那么你可以为所有生成的 prompt text 都加上这个 trigger word 并放在最前面。咱觉得这个没什么用,因此跳过。
最终得到的训练集中,每个图片都有一个对应的 .txt 或 .caption 的 prompt
建议将这个目录打包存放到本地 / Google Drive,方便之后调参。

5.1. Model Config
v2 以及 v_parameterization 需要和当前的 SD 模型相对应。SD 1.5 两个都不需要选。
pretrained_model_name_or_path 是你要 fine-tune 的基础模型。先前在 II. Pretrained Model Selection 步骤中已经下载好了,把它的路径复制过来。vae 也同样。有时候 vae 和 U-Net 可能放在同一个 .safetensor 文件中,这时候两个路径填同一个文件就行了。

5.2. Dataset Config
dataset_repeats 的含义是在每个 epoch 为训练集合内的图片迭代多少次。通常总迭代次数在 1000~3000 次就会有不错的效果,咱的建议每 500 张图片作为一个 epoch,这样就能在训练到 500、1000、1500 ... 3000 的时候分别获得 6 个模型输出,然后根据实际画图效果选取最好的那个。假设一共有 100 张训练图,那么 repeats 就可以设置为 500/100 = 5。
caption_extension 对应 4.2. Data Annotation 中生成的 prompt text 文件名后缀,一般是 .caption 或者 .txt。
resolution 一般选择 512 或 768。如果你之前已经手动裁剪并 resize 过训练集,可以在 Python 代码中设置 bucket_no_upscale = false,防止 512x512 的图片被放大。
shuffle_caption(默认 True)表示自动打乱逗号分隔的所有单词。keep_token 保留前几个标签位置不被 shuffle(默认 0),如果你有 trigger word,则根据需要调整。

5.3. LoRA and Optimizer Config
network_category 选择 LoCon_Lycoris。

下面 4 个参数可能是争议最多的参数(等号后的数值为咱推荐的数值):

解释一下:

dim(有时也称为 rank)表示 LoRA/LoHa 方法中保留多少维度, 越高表示模型的参数量越大,能承载更丰富的特征,同时也更容易过拟合,通常取值范围 ,对于 LyCORIS 推荐取值

alpha 用于调整模型输出  的系数,, 越高模型越倾向于拟合更多的细节,学习速率也越快,通常取值范围 ,对于 LyCORIS 推荐取值

network 表示作用于 cross-attention 矩阵

conv 表示作用于 ResNet 卷积矩阵

Optimizer Config 基本上只影响训练速度,建议全部保留默认值。如果有兴趣可以自行搜索 DAdaptation optimizer 的使用,否则就用默认的 AdamW8bit。

其中 train_text_encoder 这一项,按照咱的理解,至少对于 LoRA/LyCORIS 模型是不生效的,在训练的过程中应该都是直接使用了 CLIP 模型的默认参数。但是没有查到相关资料。

5.4. Training Config
num_epochs 控制一共训练多少步骤。上文提到过,图片总数 × 重复次数 (repeats) × epoch 数大约在 1000~3000 之间,这里选择合适的 epoch 数使得总数大于等于 3000。
vae_batch_size
train_batch_size
batch_size 取决于你的 VRAM,在 VRAM 够用(不抛出 CUDA out-of-memory 错误)的情况下越大越好、训练速度越快。对于 512x512 的图片、16 GB VRAM 的配置,推荐设置 batch_size = 6,其他配置可以自己调整尝试。

mixed_precision = fp16
save_precision = fp16
精度保持 fp16 即可。

save_n_epochs_type = save_every_n_epochs
save_n_epochs_type_value = 1

决定在什么时机保存当前训练的模型状态,因为训练太多次往往会出现过拟合,体现为生成出的图像有明显的风格化(stylish),这时就需要找一个更早些的模型。建议 1 epoch 保存一次。
max_token_length = 225
clip_skip = 2
这部分涉及到 CLIP 模型,即 text embedding 所用的模型。
max_token_length 指输入 CLIP 进行 text embedding 最大 token 数,常见取值有 ,一般这几个值都足够用了
clip_skip 指从后往前跳过的层数,CLIP 模型输出一共有 12 层,越往后的所在层数越高、信息越具体,跳过过于具体的信息可以防止过拟合。更详细的解释参考这个 discussion。经验上,推荐二次元模型选择 clip_skip = 2,现实模型选择 clip_skip = 1

5.5. Start Training
之前的步骤生成的配置会保存在 ./LoRA/config/dataset_config.toml 和 ./LoRA/config/config_file.toml 这两个文件中,开始训练前可以再 review 一遍。

开始训练之后,注意 log 中的 bucket resolution 以及图片数是否符合预期。

保存现场
最后,无比将整个训练过程保存下来,方便以后改进,包括

/content/LoRA/output: 输出的模型

/content/LoRA/config: 训练配置

/content/LoRA/train_data: 训练数据

/logs/{model}_{timestamp}:日志

作者:艾拉酱的内存条https://www.bilibili.com/read/cv25224310/ 出处:bilibili





细雨鱼儿出,微风燕子斜。
回复

使用道具

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表