PAI ArtLab LoRA模型训练实践

本文为您介绍如何使用Kohya训练LoRA模型。

背景信息

Stable Diffusion(SD)是一个开源的深度学习文生图模型。SD WebUISD的可视化界面,支持网页端文生图、图生图操作,并通过插件和模型导入实现高度定制化。

使用SD WebUI生成图片需要使用多种模型,不同模型有各自的特色与适用领域,需要针对性地采用不同的训练数据集及训练策略进行培养。其中,LoRA是一种轻量化的模型微调方法,速度较快,文件大小适中,对配置要求低。

Kohya是广泛应用的LoRA模型训练开源服务,Kohya's GUI程序包提供了训练环境和模型训练的用户界面,避免与其他程序干扰。SD WebUI也支持通过插件进行模型训练,但可能会产生干扰,导致报错 。

其他模型微调方法请参见模型介绍

LoRA模型介绍

LoRA(Low-Rank Adaptation of Large Language Models)可以基于基础模型通过对数据集的训练,得到一个风格化的模型,从而实现高度定制化的图像生成效果。

文件规格如下:

  • 文件大小:通常为个位到百级MB,具体大小取决于受训练参数与基础模型的复杂度。

  • 文件格式:采用.safetensors作为标准后缀。

  • 文件应用:需与特定的Checkpoint基础模型结合使用。

  • 文件版本:需要明确区分Stable Diffusion v1.5Stable Diffusion XL版本,各版本间模型不通用。

LoRA微调模型

如果将基础模型(如Stable Diffusion v1.5 Model、v2.1 ModelStable Diffusion XL base 1.0 Model等)视作基础原生态的自然食材,那么LoRA模型则是某种特殊风味的调味料,旨在为这些食材赋予独特的风味与创新。为了使料理具备多样性和创新性,LoRA模型作为关键的创新催化剂,可以突破基础模型在创造过程中遭遇的局限性,使内容创作更加灵活高效,个性十足。

Stable Diffusion v1.5模型为例,其局限性包括:

  1. 生成内容细节精准度缺失:在生成特定细节或复杂内容时,可能难以精准复现所有细节,导致生成图像缺乏细节或不够逼真。

  2. 生成内容逻辑性构建不足:生成图像中的物体布局、尺寸比例及光影逻辑可能不符合现实规律。

  3. 生成内容风格不一致:高度复杂且随机的生成过程,使得维持特定风格或执行风格转移时,难以确保风格的统一与连贯。

当前模型生态社区已有众多优秀的微调模型,此类模型均基于基础模型微调训练产生。相较于原始基础模型,生成图像细节更丰富,风格特征也更加鲜明,且生成内容更加可控。例如,下图展示了Stable Diffusion v1.5模型和微调模型生成图像效果对比,可以直观感受到图像生成质量的显著提升。

image

LoRA模型的不同类型

  • LyCORIS(LoHa/LoCon的前身)

    LyCORIS作为LoRA的增强版,能够对26层的神经网络进行精细调整,相比LoRA仅支持17层的微调,在性能上显著提升。因此,相较于LoRA,LyCORIS表现力更强,有更多的参数,可以承载更多的信息量。LyCORIS的核心优势在于LoHaLoCon。其中,LoCon专注于针对SD模型的每一层级进行调整,而LoHa则在原基础上实现双倍数据信息量。

    用法和LoRA相同,进阶用法可以通过调整文本编码的权重、Unet的权重和DyLoRa的权重实现。

  • LoCon

    LoRA(Conventional LoRA)只调整了cross-attention layers,LoCon用同样的方法调整了ResNet矩阵。目前LoCon已经被LyCORIS合并,过去扩展的LoCon已经不再需要。更多信息,参见 LoCon-LoRA for Convolution Network

  • LoHa

    LoHa(LoRA with Hadamard Product)用Hadamard Product替换了原方法中的矩阵点乘,理论上在相同的情况下能容纳更多信息。更多信息,请参见FedPara Low-Rank Hadamard Product For Communication-Efficient Federated Learning

  • DyLoRA

    LoRArank并非越高越好,其最优值需依据具体模型、数据集特性和所执行任务共同决定。DyLoRA能够在指定维度(rank)下灵活探索并学习多种rankLoRA配置,简化了寻找最适rank的复杂度,从而提升了模型调优的效率与精准度。

准备数据集

确定LoRA类型

首先您需要确定希望训练的LoRA模型的类型,比如是角色类型还是风格类型。

例如,需要训练一个阿里云进化设计语言体系下的阿里云3D产品图标风格的风格模型。image.png

数据集内容要求

数据集由图片和图片对应的文本描述标注两种文件组成。

准备数据集内容:图片

  • 图片要求

    • 数量:15张以上。

    • 质量:分辨率适中,画质清晰。

    • 风格:需要一套风格统一的图片内容。

    • 内容:图片需凸显要训练的主体物形象,不宜有复杂背景以及其他无关的内容,尤其是文字。

    • 尺寸:分辨率是64的倍数,范围为512~768。显存低可以裁剪为512*512,显存高可以裁剪为768*768。

  • 图片预处理

    • 质量调整:图片分辨率适中即可,保证画质清晰,但也无需太大。画质会影响模型训练的结果。如果自己准备的图片分辨率比较小,不是很清晰,可以使用SD WebUIExtras页面进行分辨率放大,也可以使用其他图像处理工具去处理图像的分辨率。

    • 尺寸调整:可以前往像birme站点批量裁剪后批量下载,也可以使用SD WebUI裁剪或手动裁剪。

  • 图片部分准备完毕示例

    image.png

    将图片存放至本地文件夹中。

    image.png

创建数据集并上传文件

上传前需要注意文件的属性和命名要求,如果只是用平台管理数据集文件或者给图片打标,直接上传文件或文件夹都可以,对这些文件和文件夹的命名没有特殊要求。

如果数据集打标完之后,需要用平台的KohyaLoRA模型训练,对于上传的文件属性和命名要求如下。

  • 命名格式:数字+下划线+任意名称

  • 命名含义:自定义。

  • 数字:每张图片重复训练次数,一般要求≥100。总训练次数一般要求>1500,因此若文件夹内包含10张图片,则每张图片训练1500/10=150次,图片文件夹名数字部分可为150;若文件夹内包含20张图片,则每张图片训练1500/20=75(<100)次,图片文件夹名数字部分可为100。

  • 任意名称:本文以100_ACD3DICON为例,您可以根据实际情况自定义。

  1. 登录PAI ArtLab,选择Kohya(专享版),进入Kohya-SS页面。

  2. 创建数据集

    在数据集页面,单击新建数据集,并输入数据集名称,此处以acd3dicon为例。

    image

  3. 上传数据集文件

    单击已创建的数据集,将整理好的数据集图片文件夹从本地拖拽上传。

    image

    上传成功。

    image.png

  4. 进入到文件夹里可以查看到已上传的图片。

    image.png

准备数据集内容:图片标注

图片标注是指每张图片对应的文字描述,文字描述的标注文件,是与图片同名的TXT格式的文件。

  • 图片标注要求

    B端元素通常具备清晰的结构布局、规范的透视效果及特定的光影,因此在进行标注处理时,需要区别于人像、风景等类型的数据集图像处理方法。建议采取基础的描绘打标,集中关注并标注元素的顶层、中层及底部的简单几何形态,如“球形”、“立方体”等。

    分类

    关键词

    业务

    产品/业务

    数据库、云安全、计算平台、容器、云原生等(英文)

    云计算元素

    Data processing、Storage、Computing、Cloud computing、Elastic computing、Distributed storage、Cloud database、Virtualization、Containerization、Cloud security、Cloud architecture、Cloud services、Server、Load balancing、Automated management、Scalability、Disaster recovery、High availability、Cloud monitoring、Cloud billing

    设计(质感)

    环境&构图

    viewfinder、isometric、hdri environment、white background、negative space

    材质

    glossy texture、matte texture、metallic texture、glass texture、frosted glass texture

    照明

    studio lighting、soft lighting

    色彩

    alibaba cloud orange、white、black、gradient orange、transparent、silver

    情绪

    rational、orderly、energetic、vibrant

    质量

    UHD、accurate、high details、best quality、1080P、16k、8k

    设计(氛围)

    ...

    ...

    • 示例一:针对3D图标画面打标的信息维度的拆分。image.png

    • 示例二:针对紫砂壶物品打标的信息维度的拆分。

      image

      image

  • 给图片添加标注

    您可以手动为每张图片添加对应的文字描述,但当图片数量非常大时,手动打标非常耗时耗力,此时您可以选择借助神经网络,完成对所有图片批量生成文本描述的工作,或者在Kohya中选择使用BLIP的图像打标模型,搭配手动微调,满足您的业务需求。

打标数据集

  1. Kohya-SS页面,选择Utilities>Captioning>BLIP Captioning

  2. 选择已创建的数据集中上传的图片文件夹。

  3. 输入一些预置词,让机器给每一张图片都批量加上您输入的标注文本。您可以结合自己对数据集图片拆分的维度去添加预置词,不同类型的图片打标的维度也不同。

  4. 单击Caption Image即可开始打标。

    image

  5. 在下方的日志里可以查看打标的进度和打标完成的提示。image.png

  6. 返回数据集,可以看到刚才上传的图片已经有对应的标注文件。image.png

  7. (可选)对于不合适的标注,可以手动修改。image.png

训练LoRA模型

  1. Kohya-SS页面,选择LoRA(LoRA)>Training(训练)>Source Model(模型来源)

  2. 配置以下参数:

    • Model Quick Pick(快速选择模型)runwayml/stable-diffusion-v1-5

    • Save trained model as(保存训练模型为)safetensors

  3. Kohya-SS页面,选择LoRA(LoRA)>Training(训练)>Folders(文件夹)

  4. 选择已上传了数据集文件夹的数据集,并配置训练参数。

    image

    说明

    数据集文件打标时,要选到数据集下面图片的文件夹;做模型训练时,要选择放置数据集文件夹的数据集。

  5. 单击Start training,开始训练。

    更多参数信息,请参见常用训练参数介绍说明

  6. 在下方的日志里可以查看模型训练进度和模型训练完成的提示。image.png

常用训练参数介绍说明

参数介绍

图片数量*repeat数量*设置的epoch/batch_size=模型训练总步数

例如,10张图*20步*10个循环/2并行数=1000步。

Kohya-SS页面,选择LoRA(LoRA)>Training(训练)>Parameters(参数),即可配置模型训练参数,常用参数说明如下:

  • Basic(基础)页签

    image

    参数

    功能

    设置说明

    repeat

    读取图像次数

    在文件夹命名时设置读取图像的次数,次数越多学习效果越好。初期训练时建议设置如下:

    • 二次元:7~15

    • 人像:20~30

    • 实物:30~100

    LoRA type

    选择LoRA类型

    保持默认选择Standard

    LoRA network weights

    LoRA网络权重

    选填。如果要接着训练则选用最后训练的LoRA。

    Train batch size

    训练批量大小

    根据显卡性能选择。12G显存最大为2,8G显存最大为1。

    Epoch

    训练轮数,将所有数据训练一次为一轮

    自行计算。一般:

    • Kohya中总训练次数=训练图片数量x重复次数x训练轮数/训练批量大小

    • WebUI中总训练次数=训练图片数量x重复次数

    使用类别图像时,在Kohya或在WebUI中总训练次数都会乘2;在Kohya中模型存储次数会减半。

    Save every N epochs

    N个训练周期保存一次结果

    如设为2,则每完成2轮训练保存一次训练结果。

    Caption Extension

    打标文件扩展名

    选填。 训练图集中注解/提示文件的格式为.txt。

    如图:image

    Mixed precision

    混合精度

    根据显卡性能决定。取值如下:

    • no

    • fp16(默认)

    • bf16(RTX30以上显卡可选bf16)

    Save precision

    保存精度

    根据显卡性能决定。取值如下:

    • no

    • fp16(默认)

    • bf16(RTX30以上显卡可选bf16)

    Number of CPU threads per core

    CPU每核线程数

    主要为显存,根据所购实例和需求调整,保持默认即可。

    Seed

    随机数种子

    可以用于生图验证。

    Cache latents

    缓存潜变量

    默认开启,训练后图像信息会缓存为latens文件。

    LR Scheduler

    学习率调度器

    理论上没有最佳学习点,为了能够找到一个最佳的假设值,一般可以使用cosine(余弦函数)

    Optimizer

    优化器

    默认AdamW8bit。如果基于sd1.5的基础模型训练,保持默认值即可。

    Learning rate

    学习率

    初期训练时,建议设置学习率为0.01~0.001。默认值为0.0001。

    可以根据损失函数(loss)调整学习率:当loss值偏高时,可以适度提升学习率;若loss值较低,可以逐步减少学习率有助于精细调优模型。

    • 高学习率加速训练但可能因学习粗糙引发过拟合,即模型对训练数据过度适应而泛化能力差。

    • 低学习率虽能细致学习,减少过拟合,但可能导致训练时间长和欠拟合,即模型简化而未能把握数据特性。

    LR Warmup(% of steps)

    学习率预热(%的步数)

    默认值为10。

    Max Resolution

    最大分辨率

    根据图片情况设置。默认值为512,512。

    Network Rank (Dimension)

    模型复杂度

    一般设置为64即可适应大部分场景。

    Network Alpha

    网络Alpha

    建议可以设置较小值,RankAlpha设置会影响最终输出LoRA的大小。

    Clip skip

    文本编码器跳过层数

    二次元选2,写实模型选1,动漫模型训练最初就有跳过一层,如使用训练素材也是二次元图像,再跳一层=2。

    Sample every n epochs

    n个训练周期采样一次

    每几轮保存一次样本。

    Sample prompts

    样本提示

    提示词样本。需要使用命令,参数如下:

    • --n:反向提示词。

    • --w:图片宽度。

    • --h:图片高度。

    • --d:图像种子。

    • --l:提示词相关性(cfg比例)。

    • --s:迭代步数(steps)。

  • Advanced(增强)页签

    image

    参数

    功能

    设置说明

    Clip skip

    文本编码器跳过层数

    二次元选2,写实模型选1,动漫模型训练最初就有跳过一层,如使用训练素材也是二次元图像,再跳一层=2。

  • Samples(样例)页签

    image

    参数

    功能

    设置说明

    Sample every N epochs

    N个训练周期采样一次

    每几轮保存一次样本。

    Sample prompts

    样本提示

    提示词样本。需要使用命令,参数如下:

    • --n:反向提示词。

    • --w:图片宽度。

    • --h:图片高度。

    • --d:图像种子。

    • --l:提示词相关性(cfg比例)。

    • --s:迭代步数(steps)。

Loss值介绍

在微调模型训练过程中(LoRA),Loss值可以算是一个比较重要的衡量模型优劣的指标。理想状况下,随着训练的进程,Loss值应呈现逐渐下降的趋势,这代表训练过程机器正在有效学习并逐渐去贴合用户提供的训练数据。一般Loss值维持在0.080.1之间,表明模型训练的结果较好,Loss值为0.08时,模型训练的结果比较理想。

可以说LoRA学习就是Loss值从高到低的过程。假设训练周期Epoch30,如果目标是获取Loss值位于0.090.07区间的模型,则有望在第2024Epoch之间实现这一目标。这样设置可以避免因训练轮次过少而导致的Loss快速骤降。例如,仅经历两轮训练Loss就从0.1骤减至0.06,可能会错过期望的Loss区间。

image