深入浅出完整解析Stable Diffusion XL(SDXL)核心基础知识

文章目录[隐藏]

原文


本文的专栏:算法兵器谱
我的公众号:WeThinkIn
更多高价值内容欢迎关注我的知乎,公众号,专栏~

码字不易,希望大家能多多点赞,给我更多坚持写下去的动力,谢谢大家!


2023.08.24最新消息,本文已经发布Stable Diffusion XL以及相关LoRA模型的保姆级训练资源,大家可以下载愉快地训练属于自己的SDXL和LoRA模型了!

2023.08.18最新消息,本文已经持续撰写Stable Diffusion XL以及对应LoRA的训练全流程,并增加对Stable Diffusion XL微调训练与LoRA训练的解读。

2023.08.05最新消息,本文已经发布Stable Diffusion XL四大模型的完整可视化结构图。

2023.07.27最新消息:Stable Diffusion XL 1.0版本已经发布,本文已增加对Stable Diffusion XL 1.0版本的解读。


2022年作为AIGC时代的元年,各个领域的生成式模型与技术都有了一个大的爆发,包括计算机视觉领域的Stable Diffusion,Rocky之前已经深入浅出解析过(依旧在持续优化和补充完善中,欢迎大家点赞,给我更多坚持写下去的动力):

还有NLP的ChatGPT:深入浅出解析ChatGPT引领的科技浪潮等。

本文介绍的Stable Diffusion XL是Stable Diffusion的最新优化版本,由Stability AI发布。比起Stable Diffusion,Stable Diffusion XL做了全方位的优化,Rocky相信,Stable Diffusion会是图像生成领域的“YOLO”,而Stable Diffusion XL那就是“YOLOv3”。

Stable Diffusion XL生成图片

因此在本文中,Rocky主要对Stable Diffusion XL的各个细节做一个深入浅出的分析总结(模型结构,从0到1训练教程,从0到1搭建推理流程,最新SD资源汇总,相关插件工具使用等),和大家一些探讨学习,在AIGC时代更好地融合和从容。

1. Stable Diffusion XL资源

2023.08.24更新:保姆级SDXL训练资源已经上传到百度云网盘,大家可以下载使用。

2023.07.27更新:Stable Diffusion XL 1.0(Base模型+Refiner模型)模型权重和Stable Diffusion XL VAE模型权重已经上传到百度云网盘,大家可以下载使用。

Rocky会持续把更多Stable Diffusion XL的资源发布到这里,让大家更加方便的查找最新资讯。

2. Stable Diffusion XL核心基础内容

与Stable DiffusionV1-v2相比,Stable Diffusion XL主要做了如下的优化:

  1. 对Stable Diffusion原先的U-Net,VAE,CLIP Text Encoder三大件都做了改进。
  2. 增加一个单独的基于Latent的Refiner模型,来提升图像的精细化程度。
  3. 设计了很多训练Tricks,包括图像尺寸条件化策略,图像裁剪参数条件化以及多尺度训练等。
  4. 先发布Stable Diffusion XL 0.9测试版本,基于用户使用体验和生成图片的情况,针对性增加数据集和使用RLHF技术优化迭代推出Stable Diffusion XL 1.0正式版

2.1 SDXL整体架构初识

Stable Diffusion XL是一个二阶段的级联扩散模型,包括Base模型和Refiner模型。其中Base模型的主要工作和Stable Diffusion一致,具备文生图,图生图,图像inpainting等能力。在Base模型之后,级联了Refiner模型,对Base模型生成的图像Latent特征进行精细化,其本质上是在做图生图的工作

Base模型由U-Net,VAE,CLIP Text Encoder(两个)三个模块组成,在FP16精度下Base模型大小6.94G(FP32:13.88G),其中U-Net大小5.14G,VAE模型大小167M以及两个CLIP Text Encoder一大一小分别是1.39G和246M。

Refiner模型同样由U-Net,VAE,CLIP Text Encoder(一个)三个模块组成,在FP16精度下Refiner模型大小6.08G,其中U-Net大小4.52G,VAE模型大小167M(与Base模型共用)以及CLIP Text Encoder模型大小1.39G(与Base模型共用)。

可以看到,Stable Diffusion XL无论是对整体工作流还是对不同模块(U-Net,VAE,CLIP Text Encoder)都做了大幅的改进,能够在1024x1024分辨率上从容生成图片。同时这些改进无论是对生成式模型还是判别式模型,都有非常大的迁移应用价值

Stable Diffusion XL整体结构

比起Stable Diffusion,Stable Diffusion XL的参数量增加到了66亿(Base模型35亿+Refiner模型31亿),并且先后发布了模型结构完全相同的0.9和1.0两个版本。Stable Diffusion XL 1.0使用更多训练集+RLHF来优化生成图像的色彩,对比度,光线以及阴影方面,使得生成图像的构图比0.9版本更加鲜明准确。

Rocky相信过不了多久,以Stable Diffusion XL 1.0版本为基础的AI绘画以及AI视频生态将会持续繁荣。

Stable Diffusion XL Base模型参数:SDXL-Base

Stable Diffusion XL Refiner模型参数:SDXL-Refiner

2.2 U-Net模型(Base部分)

Stable Diffusion全系列对比图

上表是Stable Diffusion XL与之前的Stable Diffusion系列的对比,从中可以看出,Stable DiffusionV1.4/1.5的U-Net参数量只有860M,就算是Stable DiffusionV2.0/2.1,其参数量也不过865M。但等到Stable Diffusion XL,U-Net模型(Base部分)参数量就增加到2.6B,参数量增加幅度达到了3倍左右

下图是Rocky梳理的Stable Diffusion XL Base U-Net的完整结构图,大家可以感受一下其魅力,看着这个完整结构图学习Stable Diffusion XL Base U-Net部分,相信大家脑海中的思路也会更加清晰:

Stable Diffusion XL Base U-Net完整结构图

上图中包含Stable Diffusion XL Base U-Net的十四个基本模块:

  1. GSC模块:Stable Diffusion Base XL U-Net中的最小组件之一,由GroupNorm+SiLU+Conv三者组成。
  2. DownSample模块:Stable Diffusion Base XL U-Net中的下采样组件,使用了Conv(kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))进行采下采样
  3. UpSample模块:Stable Diffusion Base XL U-Net中的上采样组件,由插值算法(nearest)+Conv组成。
  4. ResNetBlock模块:借鉴ResNet模型的“残差结构”,让网络能够构建的更深的同时,将Time Embedding信息嵌入模型
  5. CrossAttention模块:将文本的语义信息与图像的语义信息进行Attention机制,增强输入文本Prompt对生成图片的控制。
  6. SelfAttention模块:SelfAttention模块的整体结构与CrossAttention模块相同,这是输入全部都是图像信息,不再输入文本信息。
  7. FeedForward模块:Attention机制中的经典模块,由GeGlU+Dropout+Linear组成。
  8. BasicTransformer Block模块:由LayerNorm+SelfAttention+CrossAttention+FeedForward组成,是多重Attention机制的级联,并且每个Attention机制都是一个“残差结构”。通过加深网络和多Attention机制,大幅增强模型的学习能力与图文的匹配能力
  9. SDXL_Spatial Transformer_X模块:由GroupNorm+Linear+X个BasicTransformer Block+Linear构成,同时ResNet模型的“残差结构”依旧没有缺席。
  10. SDXL_DownBlock模块:由ResNetBlock+ResNetBlock+DownSample组成。
  11. SDXL_UpBlock_X模块:由X个ResNetBlock模块组成。
  12. CrossAttnDownBlock_X_K模块:是Stable Diffusion XL Base U-Net中Encoder部分的主要模块,由K个(ResNetBlock模块+SDXL_Spatial Transformer_X模块)+DownSample模块组成。
  13. CrossAttnUpBlock_X_K模块:是Stable Diffusion XL Base U-Net中Decoder部分的主要模块,由K个(ResNetBlock模块+SDXL_Spatial Transformer_X模块)+UpSample模块组成。
  14. CrossAttnMidBlock模块:是Stable Diffusion XL Base U-Net中Encoder和ecoder连接的部分,由ResNetBlock+SDXL_Spatial Transformer_10+ResNetBlock组成。

可以看到,其中增加的SDXL_Spatial Transformer_X模块(主要包含Self Attention + Cross Attention + FeedForward)数量占新增参数量的主要部分,Rocky在上表中已经用红色框圈出。U-Net的Encoder和Decoder结构也从原来的4stage改成3stage([1,1,1,1] -> [0,2,10]),说明SDXL只使用两次下采样和上采样,而之前的SD系列模型都是三次下采样和上采样。并且比起Stable DiffusionV1/2,Stable Diffusion XL在第一个stage中不再使用Spatial Transformer Blocks,而在第二和第三个stage中大量增加了Spatial Transformer Blocks(分别是2和10),那么这样设计有什么好处呢?

首先,在第一个stage中不使用SDXL_Spatial Transformer_X模块,可以明显减少显存占用和计算量。然后在第二和第三个stage这两个维度较小的feature map上使用数量较多的SDXL_Spatial Transformer_X模块,能在大幅提升模型整体性能(学习能力和表达能力)的同时,优化了计算成本。整个新的SDXL Base U-Net设计思想也让SDXL的Base出图分辨率提升至1024x1024。在参数保持一致的情况下,Stable Diffusion XL生成图片的耗时只比Stable Diffusion多了20%-30%之间,这个拥有2.6B参数量的模型已经足够伟大

在SDXL U-Net的Encoder结构中,包含了两个CrossAttnDownBlock结构和一个SDXL_DownBlock结构;在Decoder结构中,包含了两个CrossAttnUpBlock结构和一个SDXL_UpBlock结构;与此同时,Encoder和Decoder中间存在Skip Connection,进行信息的传递与融合。

从上面讲到的十四个基本模块中可以看到,BasicTransformer Block模块是整个框架的基石,由SelfAttention,CrossAttention和FeedForward三个组件构成,并且使用了循环残差模式,让SDXL Base U-Net不仅可以设计的更深,同时也具备更强的文本特征和图像体征的学习能力

Stable Diffusion XL中的Text Condition信息由两个Text Encoder提供(OpenCLIP ViT-bigG和OpenAI CLIP ViT-L),通过Cross Attention组件嵌入,作为K Matrix和V Matrix。与此同时,图片的Latent Feature作为Q Matrix。

2.3 VAE模型

VAE模型(变分自编码器,Variational Auto-Encoder)是一个经典的生成式模型,其基本原理就不过多介绍了。在传统深度学习时代,GAN的风头完全盖过了VAE,但VAE简洁稳定的Encoder-Decoder架构,以及能够高效提取数据Latent特征的关键能力,让其跨过了周期,在AIGC时代重新繁荣。

Stable Diffusion XL依旧是基于Latent的扩散模型,所以VAE的Encoder和Decoder结构依旧是Stable Diffusion XL提取图像Latent特征和图像像素级重建的关键一招

当输入是图片时,Stable Diffusion XL和Stable Diffusion一样,首先会使用VAE的Encoder结构将输入图像转换为Latent特征,然后U-Net不断对Latent特征进行优化,最后使用VAE的Decoder结构将Latent特征重建出像素级图像。除了提取Latent特征和图像的像素级重建外,VAE还可以改进生成图像中的高频细节,小物体特征和整体图像色彩

当Stable Diffusion XL的输入是文字时,这时我们不需要VAE的Encoder结构,只需要Decoder进行图像重建。VAE的灵活运用,让Stable Diffusion系列增添了几分优雅。

Stable Diffusion XL使用了和之前Stable Diffusion系列一样的VAE结构,但在训练中选择了更大的Batch-Size(256 vs 9),并且对模型进行指数滑动平均操作(EMA,exponential moving average),EMA对模型的参数做平均,从而提高性能并增加模型鲁棒性。

下面是Rocky梳理的Stable Diffusion XL的VAE完整结构图,希望能让大家对这个在Stable DIffusion系列中未曾改变架构的模型有一个更直观的认识,在学习时也更加的得心应手:

Stable Diffusion XL Base VAE完整结构图

在损失函数方面,使用了久经考验的生成领域“交叉熵”—感知损失(perceptual loss)以及回归损失来约束VAE的训练过程。

下表是Stable Diffusion XL的VAE在COCO2017 验证集上,图像大小为256×256像素的情况下的性能。

(注:Stable Diffusion XL的VAE是从头开始训练的

Stable Diffusion XL中优化VAE带来的性能提升

与此同时,VAE的缩放系数也产生了变化。VAE在将Latent特征送入U-Net之前,需要对Latent特征进行缩放让其标准差尽量为1,之前的Stable Diffusion系列采用的缩放系数为0.18215,由于Stable Diffusion XL的VAE进行了全面的重训练,所以缩放系数重新设置为0.13025

注意:由于缩放系数的改变,Stable Diffusion XL VAE模型与之前的Stable Diffusion系列并不兼容。

官方的Stable Diffusion XL VAE的权重已经开源:stabilityai/sdxl-vae

在官网如果遇到网络问题或者下载速度很慢的问题,可以关注Rocky的公众号WeThinkIn,后台回复:SDXL模型,即可获得Stable Diffusion XL VAE模型权重资源链接。

2.4 CLIP Text Encoder模型

CLIP模型主要包含Text Encoder和Image Encoder两个模块,在Stable Diffusion XL中,和之前的Stable Diffusion系列一样,只使用Text Encoder模块从文本信息中提取Text Embeddings

不过Stable Diffusion XL与之前的系列相比,使用了两个CLIP Text Encoder,分别是OpenCLIP ViT-bigG(1.39G)和OpenAI CLIP ViT-L(246M),从而大大增强了Stable Diffusion XL对文本的提取和理解能力。

其中OpenCLIP ViT-bigG是一个只由Transformer模块组成的模型,一共有32个CLIPEncoder模块,是一个强力的特征提取模型。其单个CLIPEncoder模块结构如下所示:

# OpenCLIP ViT-bigG中CLIPEncoder模块结构
CLIPEncoderLayer(
    (self_attention): CLIPAttention(
        (k_Matric): Linear(in_features=1280, out_features=1280, bias=True)
        (v_Matric): Linear(in_features=1280, out_features=1280, bias=True)
        (q_Matric): Linear(in_features=1280, out_features=1280, bias=True)
        (out_proj): Linear(in_features=1280, out_features=1280, bias=True)
      )
    (layer_norm1): LayerNorm((1280,), eps=1e-05, elementwise_affine=True)
    (mlp): CLIPMLP(
        (activation_fn): GELUActivation()
        (fc1): Linear(in_features=1280, out_features=5120, bias=True)
        (fc2): Linear(in_features=5120, out_features=1280, bias=True)
    )
    (layer_norm2): LayerNorm((1280,), eps=1e-05, elementwise_affine=True)
    )

OpenAI CLIP ViT-L同样是一个只由Transformer模块组成的模型,一共有12个CLIPEncoder模块,其单个CLIPEncoder模块结构如下所示:

# OpenAI CLIP ViT-L中CLIPEncoder模块结构
CLIPEncoderLayer(
    (self_attention): CLIPAttention(
        (k_Matric): Linear(in_features=768, out_features=768, bias=True)
        (v_Matric): Linear(in_features=768, out_features=768, bias=True)
        (q_Matric): Linear(in_features=768, out_features=768, bias=True)
        (out_proj): Linear(in_features=768, out_features=768, bias=True)
    )
    (layer_norm1): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
    (mlp): CLIPMLP(
        (activation_fn): QuickGELUActivation()
        (fc1): Linear(in_features=768, out_features=3072, bias=True)
        (fc2): Linear(in_features=3072, out_features=768, bias=True)
    )
    (layer_norm2): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
  )

由上面两个结构对比可知,OpenCLIP ViT-bigG的优势在于模型结构更深,特征维度更大,特征提取能力更强,但是其两者的基本CLIPEncoder模块是一样的。

与传统深度学习中的模型融合类似,Stable Diffusion XL分别提取两个Text Encoder的倒数第二层特征,并进行concat操作作为文本条件(Text Conditioning)。其中OpenCLIP ViT-bigG的特征维度为77x1280,而CLIP ViT-L的特征维度是77x768,所以输入总的特征维度是77x2048(77是最大的token数),再通过Cross Attention模块将文本信息传入Stable Diffusion XL的训练过程与推理过程中。

OpenCLIP ViT-bigG和OpenAI CLIP ViT-L模型性能

从上图可以看到,OpenCLIP ViT-bigG和OpenAI CLIP ViT-L在ImageNet上zero-shot性能分别为80.1%和75.4%,Rocky有点疑惑的是,为什么不用CoCa或者将penAI CLIP ViT-L替换成penAI CLIP ViT-H呢。

和Stable Diffusion一致的是,Stable Diffusion XL输入的最大Token数依旧是77,当输入text的Token数量超过77后,将通过Clip操作拉回77;如果Token数不足77则会padding操作得到77x2048。

与此同时,Stable Diffusion XL还提取了OpenCLIP ViT-bigG的pooled text embedding,将其嵌入到time embedding中,作为辅助约束条件,但是这种辅助条件的强度是较为微弱的。

动图封面

2.5 Refiner模型

Rocky第一次看到Stable Diffusion XL的Refiner部分时,脑海里马上联想到了DeepFloyd和StabilityAI联合开发的DeepFloyd IF。

DeepFloyd IF是一种基于像素的文本到图像三重级联扩散模型,大大提升了扩散模型的图像生成能力。

这次,Stable Diffusion XL终于也开始使用级联策略,在U-Net(Base)之后,级联Refiner模型,进一步提升生成图像的细节特征与整体质量。

通过级联模型提升生成图片的质量,可以说这是AIGC时代里的模型融合。和传统深度学习时代的多模型融合策略一样,不管是学术界,工业界还是竞赛界,都是“行业核武”般的存在。

DeepFloyd IF结构图

由于已经有U-Net(Base)模型生成了图像的Latent特征,所以Refiner模型的主要工作是在Latent特征进行小噪声去除和细节质量提升

U-Net(Base)结构+Refiner结构

Refiner模型和Base模型一样是基于Latent的扩散模型,也采用了Encoder-Decoder结构,和U-Net兼容同一个VAE模型,不过Refiner模型的Text Encoder只使用了OpenCLIP ViT-bigG。

下图是Rocky梳理的Stable Diffusion XL Refiner模型的完整结构图,大家可以先感受一下其魅力,在学习Refiner模型时可以与Base模型中的U-Net进行对比,会有更多直观的认识:

Stable Diffusion XL Refiner完整结构图

在Stable Diffusion XL推理阶段,输入一个prompt,通过VAE和U-Net(Base)模型生成Latent特征,接着给这个Latent特征加一定的噪音,在此基础上,再使用Refiner模型进行去噪,以提升图像的整体质量与局部细节。

左图表示只使用Base模型,右图表示使用了Base+Refiner模型

可以看到,Refiner模型主要做了图像生成图像的工作,其具备很强的迁移兼容能力,可以作为Stable Diffusion,GAN,VAE等生成式模型的级联组件,不管是对学术界,工业界还是竞赛界,无疑都是一个无疑都是一个巨大利好。

Stable Diffusion系列模型效果对比

由上表可以看出,只使用U-Net(Base)模型,Stable Diffusion XL模型的效果已经大幅超过SD1.5和SD2.1,当增加Refiner模型之后,Stable Diffusion XL达到了更加优秀的图像生成效果。

2.6 训练技巧&细节

Stable Diffusion XL在训练阶段提出了很多Tricks,包括图像尺寸条件化策略,图像裁剪参数条件化以及多尺度训练。这些Tricks都有很好的通用性和迁移性,能普惠其他的生成式模型。

【一】图像尺寸条件化

之前在Stable Diffusion的训练过程中,主要分成两个阶段,一个是在256x256的图像尺寸上进行预训练,然后在512x512的图像尺寸上继续训练。

而这两个阶段的训练过程都要对最小图像尺寸进行约束。第一阶段中,会将尺寸小于256x256的图像舍弃;同样的,在第二阶段,会将尺寸小于512x512的图像筛除。这样的约束会导致训练数据中的大量数据被丢弃,从而很可能导致模型性能和泛化性的降低。

下图展示了如果将尺寸小于256x256的图像筛除,整个数据集将减少39%的数据。如果加上尺寸小于512x512的图像,未利用数据占整个数据集的百分比将更大

针对上述数据集利用率的问题,常规思路可以借助超分模型将尺寸过小的图像放大。但是面对对于图像尺寸过小的场景,目前的超分模型可能会在对图像超分的同时会引入一些噪声伪影,影响模型的训练,导致生成一些模糊的图像

Stable Diffusion XL为了在解决数据集利用率问题的同时不引入噪声伪影,将U-Net(Base)模型与原始图像分辨率相关联,核心思想是将输入图像的原始高度和宽度作为额外的条件嵌入U-Net模型中,表示为 �����=(ℎ���ℎ�,����ℎ) 。height和width都使用傅里叶特征编码进行独立嵌入,然后将特征concat后加在Time Embedding上,将图像尺寸引入训练过程。这样以来,模型在训练过程中能够学习到图像的原始分辨率信息,从而在推理生成阶段更好地适应不同尺寸的图像生成,而不会产生噪声伪影的问题。

如下图所示,在使用了图像尺寸条件化策略后,Base模型已经对不同图像分辨率有了“自己的判断”。当输入低分辨率条件时,生成的图像较模糊;在不断增大分辨率条件时,生成的图像质量不断提升。

图像尺寸条件化策略让Base模型对图像分辨率有了“自己的判断”

【二】图像裁剪参数条件化

之前的Stable Diffusion系列模型,由于需要输入固定的图像尺寸用作训练,很多数据在预处理阶段会被裁剪。生成式模型中典型的预处理方式是先调整图像尺寸,使得最短边与目标尺寸匹配,然后再沿较长边对图像进行随机裁剪或者中心裁剪。虽然裁剪是一种数据增强方法,但是训练中对图像裁剪导致的图像特征丢失,可能会导致模型在图像生成阶段出现不符合训练数据分布的特征

如下图所示,一个骑士的图片做了裁剪操作后,丢失了头部和脚部特征,再将裁剪后的数据放入模型中训练,就会影响模型对骑士这个概念的认识

“骑士”概念特征被破坏的数据

下图中展示了SD1.4和SD1.5的经典失败案例,生成图像中的猫出现了头部缺失的问题,龙也出现了体征不完整的情况:

SD1.4和SD1.5的经典失败案例

其实之前NovelAI就发现了这个问题,并提出了基于分桶(Ratio Bucketing)的多尺度训练策略其主要思想是先将训练数据集按照不同的长宽比(aspect ratio)进行分桶(buckets)。在训练过程中,每次在buckets中随机选择一个bucket并从中采样Batch个数据进行训练。将数据集进行分桶可以大量较少裁剪图像的操作,并且能让模型学习多尺度的生成能力;但相对应的,预处理成本大大增加,特别是数据量级较大的情况下。

并且尽管数据分桶成功解决了数据裁剪导致的负面影响,但如果能确保数据裁剪不把负面影响引入生成过程中,裁剪这种数据增强方法依旧能给模型增强泛化性能。所以Stable Diffusion XL使用了一种简单而有效的条件化方法,即图像裁剪参数条件化策略。其主要思想是在加载数据时,将左上角的裁剪坐标通过傅里叶编码并嵌入U-Net(Base)模型中,并与原始图像尺寸一起作为额外的条件嵌入U-Net模型,从而在训练过程中让模型学习到对“图像裁剪”的认识。

SDXL使用不同裁剪坐标获取具有裁剪效应的图像

图像尺寸条件化策略和图像裁剪参数条件化策略都能以在线方式应用,也可以很好的迁移到其他生成式模型的训练中。下图详细给出了两种策略的通用使用流程:

【三】多尺度训练

Stable Diffusion XL采用了多尺度训练策略,这个在传统深度学习时代头牌模型YOLO系列中常用的增强模型鲁棒性与泛化性策略,终于在AIGC领域应用并固化了,并且Stable Diffusion XL在多尺度的技术上,增加了分桶策略。

Stable Diffusion XL首先在256x256和512x512的图像尺寸上分别预训练600000步和200000步(batch size = 2048),总的数据量约等于 (600000 + 200000) x 2048 = 16.384亿

接着Stable Diffusion XL在1024x1024的图像尺寸上采用多尺度方案来进行微调,并将数据分成不同纵横比的桶(bucket),并且尽可能保持每个桶的像素数接近1024×1024,同时相邻的bucket之间height或者width一般相差64像素左右,Stable Diffusion XL的具体分桶情况如下图所示:

Stable Diffusion XL训练中使用的多尺度分桶训练策略

其中Aspect Ratio = Height / Width,表示高宽比。

在训练过程中,一个Batch从一个桶里的图像采样,并且我们在每个训练步骤中在不同的桶大小之间交替切换。除此之外,aspect ratio也会作为条件嵌入到U-Net(Base)模型中,让模型能够更好地学习到“多尺度特征”。完成了多尺度微调后,Stable Diffusion XL就可以进行不同aspect ratio的AI绘画了,不过Rocky推荐生成尺寸的base设置为1024x1024。

3 从0到1搭建使用Stable Diffusion XL进行AI绘画(全网最详细讲解)

目前能够加载Stable Diffusion XL模型并进行图像生成的框架有四种:

  1. ComfyUI框架
  2. SD.Next框架
  3. Stable Diffusion WebUI框架
  4. diffusers框架

接下来,为了让大家能够从0到1搭建使用Stable Diffusion XL这个当前性能最强的AI绘画基础大模型,Rocky将详细的讲解如何用这四个框架构建Stable Diffusion XL推理流程。那么,跟随着Rocky的脚步,让我们开始吧。

3.1 零基础使用ComfyUI搭建Stable Diffusion XL推理流程

ComfyUI是一个基于节点式的Stable Diffusion AI绘画工具。和Stable Diffusion WebUI相比,ComfyUI通过将Stable Diffusion模型生成推理的pipeline拆分成独立的节点,实现了更加精准的工作流定制和清晰的可复现性。

同时其完善的模型加载和图片生成机制,让其能够在2080Ti显卡上构建Stable Diffusion XL的工作流,并能生成1024x1024分辨率的图片,如此算力友好,可谓是初学者的福音。

目前ComfyUI已经能够兼容Stable Diffusion XL的Base模型和Refiner模型,下面两张图分别是Rocky使用ComfyUI来加载Stable Diffusion XL Base模型和Stable Diffusion XL Base + Refiner模型并生成图片的完整Pipeline:

ComfyUI加载Stable Diffusion XL Base模型
ComfyUI加载Stable Diffusion XL Base + Refiner模型

大家如果看了感觉复杂,不用担心,Rocky已经为大家保存了这两个工作流,大家只需关注Rocky的公众号WeThinkIn,并回复“ComfyUI”,就能获取这两个工作流以及文生图,图生图,图像Inpainting,ControlNet以及图像超分在内的所有Stable Diffusion经典工作流json文件,大家只需在ComfyUI界面右侧点击Load按钮选择对应的json文件,即可加载对应的工作流,开始愉快的AI绘画之旅。

话说回来,下面Rocky将带着大家一步一步使用ComfyUI搭建Stable Diffusion XL推理流程,从而实现上面两张图的生成过程。

首先,我们需要安装ComfyUI框架,这一步非常简单,在命令行输入如下代码即可:

git clone https://github.com/comfyanonymous/ComfyUI.git

安装好后,我们可以看到本地的ComfyUI文件夹。

ComfyUI框架安装到本地后,我们需要安装其依赖库,我们只需以下操作:

cd ComfyUI #进入下载好的ComfyUI文件夹中
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

完成这些配置工作后,我们就可以配置模型了,我们将Stable Diffusion XL模型放到ComfyUI/models/checkpoints/路径下。这样以来,等我们开启可视化界面后,就可以选择Stable Diffusion XL模型进行AI绘画了。

接下来,我们就可以启动ComfyUI了!我们到ComfyUI/路径下,运行main.py即可:

python main.py --listen --port 8888

运行完成后,可以看到命令行中出现的log:

To see the GUI go to: http://0.0.0.0:8888

我们将0.0.0.0:8888输入到我们本地的网页中,即可打开如上图所示的ComfyUI可视化界面,愉快的使用Stable Diffusion XL模型生成我们想要的图片了。

接下来就是ComfyUI的节点式模块讲解了,首先是只加载Base模型的情况:

Stable Diffusion XL Base模型使用的注释

Rocky已经进行了比较详细的注释,首先大家可以在红框中选择我们的模型(Stable Diffusion XL Base),接着填入Prompt和负向Prompt,并且配置生成推理过程的参数(迭代次数,CFG,Seed等),然后在绿色框中设置好生成图片的分辨率,然后在紫色框中点击Queue Prompt按钮,整个推理过程就开始了。等整个推理过程完成之后,生成的图片会在图中黄色箭头所指的地方进行展示,并且会同步将生成图片保存到本地的ComfyUI/output/路径下

完成了Stable Diffusion Base模型的推理流程,我们再来看看Base+Refiner模型的推理流程如何搭建:

Stable Diffusion XL Base+Refiner模型使用的注释

和Base模型的构建十分相似,首先大家可以在红框中选择我们的Refiner模型(Stable Diffusion XL Refiner),Refiner模型使用的Prompt和负向Prompt与Base模型一致,并且配置生成推理过程的参数(迭代次数,CFG,Seed等),绿色箭头表示将Base模型输出的Latent特征作为Refiner模型的输入,然后在蓝色框中点击Queue Prompt按钮,整个Refiner精修过程就开始了。等整个推理过程完成之后,生成的图片会在图中紫色箭头所指的地方进行展示,并且会同步将生成图片保存到本地的ComfyUI/output/路径下

到此为止,Rocky已经详细讲解了如何使用ComfyUI来搭建Stable Diffusion XL模型进行AI绘画,大家可以按照Rocky的步骤进行尝试。

3.2 零基础使用SD.Next搭建Stable Diffusion XL推理流程

SD.Next原本是Stable Diffusion WebUI的一个分支,再经过不断的迭代优化后,最终成为了一个独立版本。

SD.Next与Stable Diffusion WebUI相比,包含了更多的高级功能,也兼容Stable Diffusion, Stable Diffusion XL, Kandinsky, DeepFloyd IF等模型结构,是一个功能十分强大的AI绘画框架。

那么我们马上开始SD.Next的搭建与使用吧。

首先,我们需要安装SD.Next框架,这一步非常简单,在命令行输入如下代码即可:

git clone https://github.com/vladmandic/automatic

安装好后,我们可以看到本地的automatic文件夹。

SD.Next框架安装到本地后,我们需要安装其依赖库,我们只需以下操作:

cd automatic #进入下载好的automatic文件夹中
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

除了安装依赖库之外,还需要配置SD.Next所需的repositories插件,我们需要运行一下代码:

cd automatic #进入下载好的automatic文件夹中
python installer.py

如果发现extensions插件下载速度较慢,出现很多报错,大家可以直接使用Rocky已经配置好的资源包,可以快速启动SD.Next框架。SD.Next资源包可以关注公众号WeThinkIn,后台回复“SD.Next资源”获取。

在完成了依赖库和repositories插件的安装后,我们就可以配置模型了,我们将Stable Diffusion XL模型放到/automatic/models/Stable-diffusion/路径下。这样以来,等我们开启可视化界面后,就可以选择Stable Diffusion XL模型用于推理生成图片了。

完成上述的步骤后,我们可以启动SD.Next了!我们到/automatic/路径下,运行launch.py即可:

python launch.py --listen --port 8888

运行完成后,可以看到命令行中出现的log:

To see the GUI go to: http://0.0.0.0:8888

我们将0.0.0.0:8888输入到我们本地的网页中,即可打开如下图所示的SD.Next可视化界面,愉快的使用Stable Diffusion XL模型进行AI绘画了。

automatic可视化界面

进入SD.Next可视化界面后,我们可以在红色框中选择模型,然后需要修改Settings中的配置,来让SD.Next能够加载Stable Diffusion XL模型。

我们点击上图蓝色框中的Settings,进入Settings配置界面:

automatic框架配置修改【1】
automatic框架配置修改【2】

从上面图示中可以看到,我们需要做的修改是将Settings -> Stable Diffusion -> Stable Diffusion backend设置为diffusers,并在Stable Diffusion refiner栏中选择Refiner模型。

然后我们需要将Settings -> Diffusers Settings-> Select diffuser pipeline when loading from safetensors栏设置为Stable Diffusion XL。

完成了上述的配置修改后,我们就可以使用SD.Next加载Stable Diffusion XL进行AI绘画了!

3.3 零基础使用Stable Diffusion WebUI搭建Stable Diffusion XL推理流程

目前Stable Diffusion WebUI已经支持Stable Diffusion XL中的Base模型,但是对Refiner模型暂不支持。

Stable Diffusion WebUIAI绘画领域最为流行的框架,其生态极其繁荣,非常多的上下游插件能够与Stable Diffusion WebUI一起完成诸如AI视频生成,AI证件照生成等工作流,可玩性非常强。

接下来,咱们就使用这个流行框架搭建Stable Diffusion XL推理流程吧。

首先,我们需要下载安装Stable Diffusion WebUI框架,我们只需要在命令行输入如下代码即可:

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

安装好后,我们可以看到本地的stable-diffusion-webui文件夹。

下面我们需要安装其依赖库,我们进入Stable Diffusion WebUI文件夹,并进行以下操作:

cd stable-diffusion-webui #进入下载好的automatic文件夹中
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

和SD.Next的配置流程类似,我们还需要配置Stable Diffusion WebUI的repositories插件,我们需要运行下面的代码:

sh webui.sh

#主要依赖包括:BLIP CodeFormer generative-models k-diffusion stable-diffusion-stability-ai taming-transformers

如果发现repositories插件下载速度较慢,出现很多报错,don't worry,大家可以直接使用Rocky已经配置好的资源包,可以快速启动与Stable Diffusion XL兼容的Stable Diffusion WebUI框架。Stable Diffusion WebUI资源包可以关注公众号WeThinkIn,后台回复“WebUI资源”获取。

在完成了依赖库和repositories插件的安装后,我们就可以配置模型了,我们将Stable Diffusion XL模型放到/stable-diffusion-webui/models/Stable-diffusion/路径下。这样以来,等我们开启可视化界面后,就可以选择Stable Diffusion XL模型用于推理生成图片了。

完成上述的步骤后,我们可以启动Stable Diffusion WebUI了!我们到/stable-diffusion-webui/路径下,运行launch.py即可:

python launch.py --listen --port 8888

运行完成后,可以看到命令行中出现的log:

To see the GUI go to: http://0.0.0.0:8888

我们将0.0.0.0:8888输入到我们本地的网页中,即可打开如下图所示的Stable Diffusion WebUI可视化界面,愉快的使用Stable Diffusion XL模型进行AI绘画了。

Stable Diffusion WebUI可视化界面

进入Stable Diffusion WebUI可视化界面后,我们可以在红色框中选择SDXL模型,然后在黄色框中输入我们的Prompt和负向提示词,同时在绿色框中设置我们想要生成的图像分辨率(推荐设置成1024x1024),然后我们就可以点击Generate按钮,进行AI绘画了。

等待片刻后,图像就生成好了,并展示在界面的右下角,同时也会保存到/stable-diffusion-webui/outputs/txt2img-images/路径下,大家可以到对应路径下查看。

3.4 零基础使用diffusers搭建Stable Diffusion XL推理流程

在diffusers中能够非常好的构建Stable Diffusion XL推理流程,由于diffusers目前没有现成的可视化界面,Rocky将在Jupyter Notebook中搭建完整的Stable Diffusion XL推理工作流,让大家能够快速的掌握。

首先,我们需要安装diffusers库,并确保diffusers的版本 >= 0.18.0,我们只需要在命令行中输入一下命令进行安装即可:

pip install diffusers --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

显示如下log表示安装成功:
Successfully installed diffusers-0.18.2 huggingface-hub-0.16.4

命令中加入:-i pypi.tuna.tsinghua.edu.cn some-package 表示使用清华源下载依赖包,速度非常快!

接着,我们继续安装其他的依赖库:

pip install transformers==4.27.0 accelerate==0.12.0 safetensors==0.2.7 invisible_watermark -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

显示如下log表示安装成功:
Successfully installed transformers-4.27.0 accelerate==0.12.0 safetensors==0.2.7 invisible_watermark-0.2.0

注意:想要在diffusers中以fp16的精度加载Stable Diffusion XL模型,必须满足transformers库的版本>=4.27.0

完成了上述依赖库的安装,我们就可以搭建Stable Diffusion XL模型的完整工作流了。

我们先单独使用Stable Diffusion XL中的Base模型来生成图像:

# 加载diffusers和torch依赖库
from diffusers import DiffusionPipeline
import torch

# 构建Stable Diffusion XL Base模型的Pipeline,加载Stable Diffusion XL Base模型
pipe = DiffusionPipeline.from_pretrained("/本地路径/stable-diffusion-xl-base-0.9",torch_dtype=torch.float16, variant="fp16")
# "本地路径/stable-diffusion-xl-base-0.9"表示我们需要加载的Stable Diffusion XL Base模型,
# 大家可以关注Rocky的公众号WeThinkIn,后台回复:SDXL模型,即可获得资源链接
# "fp16"代表启动fp16精度。比起fp32,fp16可以使模型显存占用减半。

# 使用GPU进行Pipeline的推理
pipe.to("cuda")

# 输入提示词
prompt = "Watercolor painting of a desert landscape, with sand dunes, mountains, and a blazing sun, soft and delicate brushstrokes, warm and vibrant colors"

# 输入负向提示词,表示我们不想要生成的特征
negative_prompt = "(EasyNegative),(watermark), (signature), (sketch by bad-artist), (signature), (worst quality), (low quality), (bad anatomy), NSFW, nude, (normal quality)"

# 设置seed,可以固定构图
seed = torch.Generator("cuda").manual_seed(42)

# Pipeline进行推理
image = pipe(prompt, negative_prompt=negative_prompt,generator=seed).images[0]
# Pipeline生成的images包含在一个list中:[<PIL.Image.Image image mode=RGB size=1024x1024>]
#所以需要使用images[0]来获取list中的PIL图像

# 保存生成图像
image.save("test.png")

完成上面的整个代码流程,我们可以生成一张水彩风格的沙漠风景画,如果大家按照Rocky的参数进行操作,应该能确保生成下面的图片

Base模型生成的图片

接着,我们将Base模型和Refiner模型级联来生成图像:

from diffusers import DiffusionPipeline
import torch

pipe = DiffusionPipeline.from_pretrained("/本地路径/stable-diffusion-xl-base-0.9", torch_dtype=torch.float16, variant="fp16")

pipe.to("cuda")

prompt = "Watercolor painting of a desert landscape, with sand dunes, mountains, and a blazing sun, soft and delicate brushstrokes, warm and vibrant colors"

negative_prompt = "(EasyNegative),(watermark), (signature), (sketch by bad-artist), (signature), (worst quality), (low quality), (bad anatomy), NSFW, nude, (normal quality)"

seed = torch.Generator("cuda").manual_seed(42)

# 首先运行Base模型的Pipeline,输出格式为output_type="latent"
image = pipe(prompt=prompt, negative_prompt=negative_prompt, generator=seed, output_type="latent").images

# 构建Stable Diffusion XL Refiner模型的Pipeline,加载Stable Diffusion XL Refiner模型
pipe = DiffusionPipeline.from_pretrained("/本地路径/stable-diffusion-xl-refiner-0.9", torch_dtype=torch.float16, variant="fp16")
# "本地路径/stable-diffusion-xl-refiner-0.9"表示我们需要加载的Stable Diffusion XL Refiner模型,
# 大家可以关注Rocky的公众号WeThinkIn,后台回复:SDXL模型,即可获得资源链接

pipe.to("cuda")

images = pipe(prompt=prompt, negative_prompt=negative_prompt, generator=seed, image=image).images

images[0].save("test.png")

完成了上述的代码流程,我们再来看看这次Base模型和Refiner模型级联生成的图片:

Base模型和Refiner模型级联生成的图片

为了更加直观的对比,我们将刚才生成的两张图片放在一起对比:

我们可以清楚的看到,使用了Refiner模型之后,图片的整体质量和细节有比较大的增强,构图色彩更加柔和

当然,我们也可以单独使用Refiner模型对图片进行优化:

import torch
from diffusers import StableDiffusionXLImg2ImgPipeline
from diffusers.utils import load_image

pipe = DiffusionPipeline.from_pretrained("/本地路径/stable-diffusion-xl-refiner-0.9", torch_dtype=torch.float16, variant="fp16")

pipe = pipe.to("cuda")

image_path = "/本地路径/test.png"

init_image = load_image(image_path).convert("RGB")

prompt = "Watercolor painting of a desert landscape, with sand dunes, mountains, and a blazing sun, soft and delicate brushstrokes, warm and vibrant colors"

negative_prompt = "(EasyNegative),(watermark), (signature), (sketch by bad-artist), (signature), (worst quality), (low quality), (bad anatomy), NSFW, nude, (normal quality)"

seed = torch.Generator("cuda").manual_seed(42)

image = pipe(prompt, negative_prompt=negative_prompt, generator=seed, image=init_image).images[0]

image.save("refiner.png")

Rocky这里是使用了未来机甲风格的图片进行测试对比,可以从下图看到,Refiner模型优化图像质量的效果还是非常明显的,图像毛刺明显消除,整体画面更加自然柔和,细节特征也有较好的补充和重建。

3.5 Stable Diffusion XL生成示例

示例一:未来主义的城市风格

Prompt:Stunning sunset over a futuristic city, with towering skyscrapers and flying vehicles, golden hour lighting and dramatic clouds, high detail, moody atmosphere

Negative Prompt:(EasyNegative),(watermark), (signature), (sketch by bad-artist), (signature), (worst quality), (low quality), (bad anatomy), NSFW, nude, (normal quality)

Stable Diffusion XL Base+Refiner生成结果:

Stable Diffusion XL生成结果:未来主义的城市风格

示例二:天堂海滩风格

Prompt:Serene beach scene with crystal clear water and white sand, tropical palm trees swaying in the breeze, perfect paradise, seascape

Negative Prompt:(EasyNegative),(watermark), (signature), (sketch by bad-artist), (signature), (worst quality), (low quality), (bad anatomy), NSFW, nude, (normal quality)

Stable Diffusion XL Base+Refiner生成结果:

Stable Diffusion XL生成结果:天堂海滩风格

示例三:未来机甲风格

Prompt:Giant robots fighting in a futuristic city, with buildings falling and explosions all around, intense, fast-paced, dramatic, stylized, futuristic

Negative Prompt:(EasyNegative),(watermark), (signature), (sketch by bad-artist), (signature), (worst quality), (low quality), (bad anatomy), NSFW, nude, (normal quality)

Stable Diffusion XL Base+Refiner生成结果:

Stable Diffusion XL生成结果:未来机甲风格

示例四:马斯克风格

Prompt:Elon Musk standing in a workroom, in the style of industrial machinery aesthetics, deutscher werkbund, uniformly staged images, soviet, light indigo and dark bronze, new american color photography, detailed facial features

Negative Prompt:(EasyNegative),(watermark), (signature), (sketch by bad-artist), (signature), (worst quality), (low quality), (bad anatomy), NSFW, nude, (normal quality)

Stable Diffusion XL Base+Refiner生成结果:

Stable Diffusion XL生成结果:马斯克风格

4 从0到1上手使用Stable Diffusion XL训练自己的AI绘画模型(全网最详细讲解)

4.1 SDXL训练初识

Stable Diffusion系列模型的训练主要分成一下几个步骤,Stable Diffusion XL也不例外:

  1. 训练集制作:数据质量评估,标签梳理,数据清洗,数据标注,标签清洗,数据增强等。
  2. 训练文件配置:预训练模型选择,训练环境配置,训练步数设置,其他超参数设置等。
  3. 模型训练:运行SDXL模型/LoRA模型训练脚本,使用TensorBoard监控模型训练等。
  4. 模型测试:将训练好的自训练SDXL模型/LoRA模型用于效果评估与消融实验。

讲完SDXL训练的方法论,Rocky再向大家推荐一些SDXL训练资源:

  • github.com/qaneel/kohya(本文中主要的训练工程)
  • github.com/Linaqruf/koh(次项目中的kohya-trainer-XL.ipynb和kohya-LoRA-trainer-XL.ipynb可以用于制作数据集和配置训练参数)
  • github.com/bmaltais/koh(此项目可以GUI可视化训练)
  • Rocky整理优化过的SDXL完整训练资源SDXL-Train项目,大家只用在SDXL-Train中就可以完成SDXL的模型训练工作,方便大家上手实操。SDXL-Train项目资源包可以通过关注公众号WeThinkIn,后台回复“SDXL-Train”获取。

目前我们对SDXL的训练流程与所需资源有了初步的了解,接下来,就让我们跟随着Rocky的脚步,从0到1使用SDXL模型和训练资源一起训练自己的SDXL绘画模型与LoRA绘画模型吧!

4.2 配置训练环境与训练文件

首先,我们需要下载两个训练资源,只需在命令行输入下面的代码即可:

git clone https://github.com/qaneel/kohya-trainer.git

git clone https://github.com/Linaqruf/kohya-trainer.git

qaneel/kohya-trainer项目包含了Stable Diffusion XL的核心训练脚本,而我们需要用Linaqruf/kohya-trainer项目中的kohya-trainer-XL.ipynb和kohya-LoRA-trainer-XL.ipynb文件来生成数据集制作脚本和训练参数配置脚本

我们打开Linaqruf/kohya-trainer项目可以看到,里面包含了两个SDXL的.ipynb文件:

Linaqruf/kohya-trainer项目

接着我们再打开qaneel/kohya-trainer项目,里面包含的两个python文件就是我们后续的训练主脚本:

qaneel/kohya-trainer项目

正常情况下,我们需要运行Linaqruf/kohya-trainer项目中两个SDXL的.ipynb文件的内容,生成训练数据处理脚本(数据标注,数据预处理,数据Latent特征提取等)和训练参数配置文件。

我们使用数据处理脚本完成训练集的制作,然后再运行qaneel/kohya-trainer项目的训练脚本,同时读取训练参数配置文件,为SDXL模型的训练过程配置超参数。

完成上面一整套流程,SDXL模型的训练流程就算跑通了。但是由于Linaqruf/kohya-trainer项目中的两个.ipynb文件内容较为复杂,整个流程比较繁锁,对新手非常不友好,并且想要完成一整套训练流程,需要我们一直在两个项目之前切换,非常不方便。

所以Rocky这边帮大家对两个项目进行了整合归纳,总结了简单易上手的SDXL模型以及相应LoRA模型的训练流程,制作成SDXL完整训练资源SDXL-Train项目,大家只用在SDXL-Train中就可以完成SDXL的模型训练工作,方便大家上手实操。

SDXL-Train项目资源包可以通过关注公众号WeThinkIn,后台回复“SDXL-Train”获取。

下面是SDXL-Train项目中的主要内容,大家可以看到SDXL的数据处理脚本与训练脚本都已包含在内:

SDXL-Train:Stable Diffusion XL完整训练资源

我们首先进入SDXL-Train项目中,安装SDXL训练所需的依赖库,我们只需在命令行输入以下命令即可:

cd SDXL-Train

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

安装好所有SDXL训练所需的依赖库后,我们还需要设置一下SDXL的训练环境,我们主要是用accelerate库的能力,accelerate库能让PyTorch的训练和推理变得更加高效简洁。我们只需在命令行输入以下命令,并对每个设置逐一进行填写即可:

# 输入以下命令,开始对每个设置进行填写
accelerate config

In which compute environment are you running? # 选择This machine,即本机
This machine                                                                                                               
Which type of machine are you using? # 选择单卡或是多卡训练,如果是多卡,则选择multi-GPU,若是单卡,则选择第一个选项                                                                                       
multi-GPU                                                                                                                  
How many different machines will you use (use more than 1 for multi-node training)? [1]: 1 #几台机器用于训练                                
Do you wish to optimize your script with torch dynamo?[yes/NO]: # 输入回车即可                                                           
Do you want to use DeepSpeed? [yes/NO]:  # 输入回车即可                                                                                  
Do you want to use FullyShardedDataParallel? [yes/NO]:    # 输入回车即可                                                                 
Do you want to use Megatron-LM ? [yes/NO]:       # 输入回车即可                                                                          
How many GPU(s) should be used for distributed training? [1]:2 # 选择多少张卡投入训练
What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]:all # 输入all即可
Do you wish to use FP16 or BF16 (mixed precision)? # 训练精度,可以选择fp16
fp16                             

# 完成配置后,配置文件default_config.yaml会保存在/root/.cache/huggingface/accelerate下                                                                                   
accelerate configuration saved at /root/.cache/huggingface/accelerate/default_config.yaml

完成上述的流程后,接下来我们就可以进行SDXL训练数据的制作和训练脚本的配置流程了!

4.3 SDXL训练数据集制作

首先,我们需要对数据集进行清洗,和传统深度学习时代一样,数据清洗工作依然占据了AIGC时代模型训练70%-80%左右的时间

并且这个过程必不可少,因为数据质量决定了机器学习的上限,而算法和模型只是在不断逼近这个上限而已

我们需要筛除分辨率较低,质量较差(比如说768*768分辨率的图片< 100kb),存在破损,以及和任务目标无关的数据,接着去除数据里面可能包含的水印,干扰文字等,最后就可以开始进行数据标注了。

数据标注可以分为自动标注手动标注。自动标注主要依赖像BLIP和Waifu Diffusion 1.4这样的模型,手动标注则依赖标注人员。

(1)使用BLIP自动标注caption

我们先用BLIP对数据进行自动标注,BLIP输出的是自然语言标签,我们进入到SDXL-Trian/finetune/路径下,运行以下代码即可获得自然语言标签(caption标签):

cd SDXL-Trian/finetune/
python make_captions.py "/数据路径" --caption_weights “/本地BLIP模型路径” --batch_size=8 --beam_search --min_length=5 --max_length=75 --debug --caption_extension=".caption" --max_data_loader_n_workers=2

从上面的代码可以看到,我们第一个传入的参数是训练集的路径

--caption_weights:表示加载的本地BLIP模型,如果不穿入本地模型路径,则默认从云端下载BLIP模型。

--batch_size:表示每次传入BLIP模型进行前向处理的数据数量。

--beam_search:设置为波束搜索,默认Nucleus采样。

--min_length:设置caption标签的最短长度。

--max_length:设置caption标签的最长长度。

--debug:如果设置,将会在BLIP前向处理过程中,打印所有的图片路径与caption标签内容,以供检查。

--caption_extension:设置caption标签的扩展名,一般为".caption"。

--max_data_loader_n_workers:设置大于等于2,加速数据处理。

讲完了上述的运行代码以及相关参数,下面Rocky再举一个例子, 让大家能够更加直观的感受到BLIP处理数据生成caption标签的过程:

使用BLIP进行数据自动标注的形象例子

上图是单个图像的标注示例,整个数据集的标注流程也是同理的。等整个数据集的标注后,Stable Diffusion XL训练所需的caption标注就完成了

(2)使用Waifu Diffusion 1.4自动标注tag

接下来我们可以使用Waifu Diffusion 1.4进行自动标注,Waifu Diffusion 1.4输出的是tag关键词,我们依然进入到SDXL-Trian/finetune/路径下,运行以下代码即可获得tag自动标注:

cd SDXL-Trian/finetune/
python tag_images_by_wd14_tagger.py "/数据路径" --batch_size=8 --model_dir="/本地路径/wd-v1-4-moat-tagger-v2" --remove_underscore --general_threshold=0.35 --character_threshold=0.35 --caption_extension=".txt" --max_data_loader_n_workers=2 --debug --undesired_tags=""

从上面的代码可以看到,我们第一个传入的参数是训练集的路径

--batch_size:表示每次传入Waifu Diffusion 1.4模型进行前向处理的数据数量。

--model_dir:表示加载的本地Waifu Diffusion 1.4模型路径。

--remove_underscore:如果开启,会将输出tag关键词中的下划线替换为空格。

--general_threshold:设置常规tag关键词的筛选置信度。

--character_threshold:设置人物特征tag关键词的筛选置信度。

--caption_extension:设置tag关键词标签的扩展名,一般为".txt"。

-max_data_loader_n_workers:设置大于等于2,加速数据处理。

--debug:如果设置,将会在Waifu Diffusion 1.4模型前向处理过程中,打印所有的图片路径与tag关键词标签内容,以供检查。

--undesired_tags:设置不需要输出的tag关键词。

下面Rocky依然用美女图片作为例子, 让大家能够更加直观的感受到Waifu Diffusion 1.4模型处理数据生成tag关键词标签的过程:

使用Waifu Diffusion 1.4模型进行数据自动标注的形象例子

(3)补充标注特殊tag

完成了caption和tag的自动标注之后,如果我们需要训练一些特殊标注的话,还可以进行手动的补充标注。

SDXL-Trian项目中也提供了对数据进行补充标注的代码,Rocky在这里将其进行提炼总结,方便大家直接使用。

大家可以直接拷贝以下的代码,并按照Rocky在代码中提供的注释进行参数修改,然后运行代码即可对数据集进行补充标注:

import os

# 设置为本地的数据集路径
train_data_dir = "/本地数据集路径"

# 设置要补充的标注类型,包括[".txt", ".caption"]
extension   = ".txt" 

# 设置要补充的特殊标注
custom_tag  = "WeThinkIn"

# 若设置sub_folder = "--all"时,将遍历所有子文件夹中的数据;默认为""。
sub_folder  = "" 

# 若append设为True,则特殊标注添加到标注文件的末尾
append      = False

# 若设置remove_tag为True,则会删除数据集中所有的已存在的特殊标注
remove_tag  = False
recursive   = False

if sub_folder == "":
    image_dir = train_data_dir
elif sub_folder == "--all":
    image_dir = train_data_dir
    recursive = True
elif sub_folder.startswith("/content"):
    image_dir = sub_folder
else:
    image_dir = os.path.join(train_data_dir, sub_folder)
    os.makedirs(image_dir, exist_ok=True)

# 读取标注文件的函数,不需要改动
def read_file(filename):
    with open(filename, "r") as f:
        contents = f.read()
    return contents

# 将特殊标注写入标注文件的函数,不需要改动
def write_file(filename, contents):
    with open(filename, "w") as f:
        f.write(contents)

# 将特殊标注批量添加到标注文件的主函数,不需要改动
def process_tags(filename, custom_tag, append, remove_tag):
    contents = read_file(filename)
    tags = [tag.strip() for tag in contents.split(',')]
    custom_tags = [tag.strip() for tag in custom_tag.split(',')]

    for custom_tag in custom_tags:
        custom_tag = custom_tag.replace("_", " ")
        if remove_tag:
            while custom_tag in tags:
                tags.remove(custom_tag)
        else:
            if custom_tag not in tags:
                if append:
                    tags.append(custom_tag)
                else:
                    tags.insert(0, custom_tag)

    contents = ', '.join(tags)
    write_file(filename, contents)


def process_directory(image_dir, tag, append, remove_tag, recursive):
    for filename in os.listdir(image_dir):
        file_path = os.path.join(image_dir, filename)

        if os.path.isdir(file_path) and recursive:
            process_directory(file_path, tag, append, remove_tag, recursive)
        elif filename.endswith(extension):
            process_tags(file_path, tag, append, remove_tag)

tag = custom_tag

if not any(
    [filename.endswith(extension) for filename in os.listdir(image_dir)]
):
    for filename in os.listdir(image_dir):
        if filename.endswith((".png", ".jpg", ".jpeg", ".webp", ".bmp")):
            open(
                os.path.join(image_dir, filename.split(".")[0] + extension),
                "w",
            ).close()

# 但我们设置好要添加的custom_tag后,开始整个代码流程
if custom_tag:
    process_directory(image_dir, tag, append, remove_tag, recursive)

看完了上面的完整代码流程,如果大家觉得代码太复杂,don‘t worry,大家只需要复制上面的全部代码,并将train_data_dir ="/本地数据集路径"和custom_tag ="WeThinkIn"设置成自己数据集的本地路径和想要添加的特殊标注,然后运行代码即可,非常简单实用

还是以之前的美女图片为例子,当运行完上面的代码后,可以看到txt文件中,最开头的tag为“WeThinkIn”:

手动补充增加特殊tag标签

大家注意,一般我们会将手动补充的特殊tag放在第一位,因为和caption标签不同,tags标签是有顺序的,最开始的tag权重最大,越靠后的tag权重越小

到这里,Rocky已经详细讲解了在Stable Diffusion XL训练前,如何对数据集进行caption标注,tag标注以及补充一些关键标注的完整步骤与流程,在数据标注完毕后,接下来我们就要进入数据预处理的阶段了。

(4)数据预处理

首先,我们需要对刚才生成的后缀为.caption和.txt的标注文件进行整合,存储成一个json格式的文件,方便后续SDXL模型训练时调取训练数据与标注。

我们需要进入SDXL-Trian项目的finetune文件夹中,运行merge_all_to_metadata.py脚本即可:

cd SDXL-Trian
python ./finetune/merge_all_to_metadata.py "/本地数据路径" "/本地数据路径/meta_clean.json"

如下图所示,我们依旧使用之前的美图女片作为例子,运行完merge_all_to_metadata.py脚本后,我们在数据集路径中得到一个meta_clean.json文件,打开可以看到图片名称对应的tag和caption标注都封装在了文件中,让人一目了然,非常清晰。

meta_clean.json中封装了图片名称与对应的tag和caption标注

在整理好标注文件的基础上,我们接下来我们需要对数据进行分桶与保存Latent特征,并在meta_clean.json的基础上,将图片的分辨率信息也存储成json格式,并保存一个新的meta_lat.json文件。

我们需要进入SDXL-Trian项目的finetune文件夹中,运行prepare_buckets_latents.py脚本即可:

cd SDXL-Trian
python ./finetune/prepare_buckets_latents.py "/本地数据路径" "/本地数据路径/meta_clean.json" "/本地数据路径/meta_lat.json" "调用的SDXL模型路径" --batch_size 4 --max_resolution "1024,1024"

运行完脚本,我们即可在数据集路径中获得meta_lat.json文件,其在meta_clean.json基础上封装了图片的分辨率信息,用于SDXL训练时快速进行数据分桶。

meta_lat.json文件在meta_clean.json基础上封装了图片的分辨率信息

同时我们可以看到,美女图片的Latent特征保存为了.npz文件,用于SDXL模型训练时,快速读取数据的Latent特征,加速训练过程。

好的,到目前为止,我们已经完整的进行了SDXL训练所需的数据集制作与预处理流程。总结一下,我们在一张美女图片的基础上,一共获得了以下5个不同的训练配置文件:

  1. meta_clean.json
  2. meta_lat.json
  3. 自然语言标注(.caption)
  4. 关键词tag标注(.txt)
  5. 数据的Latent特征信息(.npz)
SDXL所需的训练配置文件

在完成以上所有数据处理过程后,接下来我们就可以进入SDXL训练的阶段了,我们可以对SDXL进行全参微调(finetune),也可以基于SDXL训练对应的LoRA模型。

4.4 SDXL微调(finetune)训练

微调(finetune)训练是让SDXL全参数重新训练的一种方法,理想的状态是让SDXL模型在原有能力的基础上,再学习到一个或几个细分领域的数据特征与分布,从而能在工业界,学术界以及竞赛界满足不同的应用需求。

Rocky为大家举一个形象的例子,让大家能够能好理解SDXL全参微调的意义。比如我们要训练一个真人写真SDXL模型,应用于写真领域。那么我们首先需要寻找合适的基于SDXL的预训练底模型,比如一个能生成真人图片的SDXL A模型。然后我们用A模型作为预训练底模型,并收集写真行业优质数据作为训练集,有了模型和数据,再加上Rocky为大家撰写的SDXL微调训练全流程攻略,我们就能训练获得一个能生成真人写真的SDXL行业模型,并作为真人写真相关产品的核心大模型

那么话不多说,下面Rocky将告诉大家从0到1使用SDXL模型进行微调训练的全流程攻略,让我们一起来训练属于自己的SDXL模型吧!

(1)SDXL 微调(finetune)数据集制作

在SDXL全参数微调中,SDXL能够学习到大量的主题,人物,画风或者抽象概念等信息特征,所以我们需要对一个细分领域的数据进行广泛的收集,并进行准确的标注。

Rocky这边收集整理了838张二次元人物数据,包含多样的人物,多样的画风,涵盖了大量的二次元专属信息特征,组成二次元人物数据集,作为本次SDXL微调训练的训练集。

二次元数据集

Rocky一开始收集了5000张数据,经过筛选只剩838张作为最后的模型训练集,数据集质量决定生成效果的上限,所以前期对数据集的清洗工作是非常重要的,Rocky总结了以下的用于SDXL全参微调的数据集筛选要求:

  1. 数据尺寸需要在512x512像素以上。
  2. 数据的大小最好大于300K。
  3. 数据种类尽量丰富,不同主题,不同画风,不同概念都要充分采集。
  4. 一个特殊tag对应的图像特征在数据集中需要一致,不然在推理过程触发这个tag时可能会生成多个特征的平均。
  5. 每个数据都要符合我们的审美和评判标准!每个数据都要符合我们的审美和评判标准!每个数据都要符合我们的审美和评判标准!

接下来,我们就可以按照本文4.3 Stable Diffusion XL数据集制作章节里的步骤,进行数据的清洗,自动标注,以及添加特殊tag。

Rocky认为对SDXL模型进行微调训练主要有两个目的增强SDXL模型的图像生成能力与增加SDXL对新prompt的触发能力

我们应该怎么理解这两个目的呢。我们拿二次元人物数据集为例,我们想要让SDXL模型学习二次元人物的各种特征,包括脸部特征,服装特征,姿势特征,二次元背景特征,以及二次元画风特征等。通过训练不断让SDXL模型“学习”这些数据的内容,从而增强SDXL模型生成二次元人物图片的能力。与此同时,我们通过自动标注与特殊tag,将图片的特征与标注信息进行对应,让SDXL在学习图片数据特征的同时,学习到对应的标注信息,能够在前向推理的过程中,通过二次元的专属标签生成对应的二次元人物图像

理解了上面的内容,咱们的数据处理部分就告一段落了。为了方便大家使用二次元人物数据集进行后续的SDXL模型微调训练,Rocky这边已经将处理好的二次元人物数据集开源(包含原数据,标注文件,读取数据的json文件等),大家可以关注公众号WeThinkIn,后台回复“二次元人物数据集”获取。

(2)SDXL 微调训练参数配置

本节中,Rocky主要介绍Stable Diffusion XL全参微调(finetune)训练的参数配置和训练脚本。

Rocky已经帮大家整理好了SDXL全参微调训练的全部参数与训练脚本,大家可以在SDXL-Trian项目的train_config文件夹中找到相应的训练参数配置(XL_config文件夹),并且可以在SDXL-Trian项目中运行SDXL_finetune.sh脚本,进行SDXL的全参微调训练。

接下来,Rocky将带着大家从头到尾走通SDXL全参微调训练过程,并讲解训练参数的意义。首先,我们可以看到XL_config文件夹中有两个配置文件config_file.toml和sample_prompt.toml,他们分别存储着SDXL的训练超参数与训练中的验证prompt。

XL_config文件夹中的配置文件config_file.toml和sample_prompt.toml

其中config_file.toml文件中的配置信息包含了sdxl_arguments,model_arguments,dataset_arguments,training_arguments,logging_arguments,sample_prompt_arguments,saving_arguments,optimizer_arguments八个维度的参数信息,下面Rocky为大家依次讲解各个超参数的作用:

[sdxl_arguments]
cache_text_encoder_outputs = true
no_half_vae = true
min_timestep = 0
max_timestep = 1000
shuffle_caption = false

cache_text_encoder_outputs:Stable Diffusion XL训练时需要打开,用于两个Text Encoder输出结果的缓存与融合。注:当cache_text_encoder_outputs设为true时,shuffle_caption将不起作用。

no_half_vae:当此参数为true时,VAE在训练中使用float32精度;当此为false时,VAE在训练中使用fp16精度。

min_timestep:Stable Diffusion XL Base U-Net在训练时的最小时间步长(默认为0)。

max_timestep:Stable Diffusion XL Base U-Net在训练时的最大时间步长(默认为1000)。

shuffle_caption:当设置为true时,对训练标签进行打乱,能一定程度提高模型的泛化性。

[model_arguments]
pretrained_model_name_or_path = "/本地路径/SDXL模型文件"
vae  = "/本地路径/VAE模型文件"

pretrained_model_name_or_path:读取本地Stable Diffusion XL预训练模型用于微调。

vae:读取本地VAE模型,如果不传入本参数,在训练中则会读取Stable Diffusion XL自带的VAE模型。

[dataset_arguments]
debug_dataset = false
in_json = "/本地路径/data_meta_lat.json"
train_data_dir = "/本地路径/训练集"
dataset_repeats = 10
keep_tokens = 0
resolution = "1024,1024"
caption_dropout_rate = 0
caption_tag_dropout_rate = 0
caption_dropout_every_n_epochs = 0
color_aug = false
token_warmup_min = 1
token_warmup_step = 0

debug_dataset:训练时对数据进行debug处理,不让破损数据中断训练进程。

in_json:读取数据集json文件,json文件中包含了数据名称,数据标签,数据分桶等信息。

train_data_dir:读取本地数据集存放路径。

dataset_repeats:整个数据集重复训练的次数。(经验分享:如果数据量级小于一千,可以设置为10;如果数据量级在一千与一万之前,可以设置为5;如果数据量级大于一万,可以设置为2

keep_tokens:在训练过程中,会将txt中的tag进行随机打乱。如果将keep tokens设置为n,那前n个token的顺序在训练过程中将不会被打乱。

resolution:设置训练时的数据输入分辨率,分别是width和height。

caption_dropout_rate:针对一个数据丢弃全部标签的概率,默认为0。

caption_tag_dropout_rate:针对一个数据丢弃部分标签的概率,默认为0。(类似于传统深度学习的Dropout逻辑

caption_dropout_every_n_epochs:每训练n个epoch,将数据标签全部丢弃。

color_aug:数据颜色增强,建议不启用,其与caching latents不兼容,若启用会导致训练时间大大增加

token_warmup_min:在训练一开始学习每个数据的前n个tag(标签用逗号分隔后的前n个tag,比如girl,boy,good)

token_warmup_step:训练中学习标签数达到最大值所需的步数,默认为0,即一开始就能学习全部的标签。

[training_arguments]
output_dir = "/本地路径/模型权重保存地址"
output_name = "sdxl_finetune_WeThinkIn"
save_precision = "fp16"
save_every_n_steps = 1000
train_batch_size = 4
max_token_length = 225
mem_eff_attn = false
xformers = true
max_train_steps = 100000
max_data_loader_n_workers = 8
persistent_data_loader_workers = true
gradient_checkpointing = true
gradient_accumulation_steps = 1
mixed_precision = "fp16"

output_dir:模型保存的路径。

output_name:模型名称。

save_precision:模型保存的精度,一共有[“None”, "float", "fp16", "bf16"]四种选择,默认为“None”,即FP32精度。

save_every_n_steps:每n个steps保存一次模型权重。

train_batch_size:训练Batch-Size,与传统深度学习一致。

max_token_length:设置Text Encoder最大的Token数,有[None, 150, 225]三种选择,默认为“None”,即75。

mem_eff_attn:对Cross Attention进行轻量化。

xformers:xformers插件可以使SDXL模型在训练时显存减少一半左右。

max_train_steps:训练的总步数。

max_data_loader_n_workers:数据加载的DataLoader worker数量,默认为8。

persistent_data_loader_workers:能够让DataLoader worker持续挂载,减少训练中每个epoch之间的数据读取时间,但是会增加内存消耗。

gradient_checkpointing:设为true时开启梯度检查,通过以更长的计算时间为代价,换取更少的显存占用。相比于原本需要存储所有中间变量以供反向传播使用,使用了checkpoint的部分不存储中间变量而是在反向传播过程中重新计算这些中间变量。模型中的任何部分都可以使用gradient checkpoint。

gradient_accumulation_steps:如果显存不足,我们可以使用梯度累积步数,默认为1。

mixed_precision:训练中是否使用混合精度,一共有["no", "fp16", "bf16"]三种选择,默认为“no”。

[logging_arguments]
log_with = "tensorboard"
logging_dir = "/本地路径/logs"
log_prefix = "sdxl_finetune_WeThinkIn"

log_with:选择训练log保存的格式,可以从["tensorboard", "wandb", "all"]三者中选择,也可以不设置。

logging_dir:设置训练log保存的路径。

log_prefix:增加log文件的文件名前缀,比如sdxl_finetune_WeThinkIn1234567890。

[sample_prompt_arguments]
sample_every_n_steps = 100
sample_sampler = "euler_a"

[saving_arguments]
save_model_as = "safetensors"

sample_every_n_steps:在训练中每n步测试一次模型效果。

sample_sampler:设置训练中测试模型效果时使用的sampler,可以选择["ddim","pndm","lms","euler","euler_a","heun","dpm_2","dpm_2_a","dpmsolver","dpmsolver++","dpmsingle", "k_lms","k_euler","k_euler_a","k_dpm_2","k_dpm_2_a"],默认是“ddim”。

save_model_as:每次模型权重保存时的格式,可以选择["ckpt", "safetensors", "diffusers", "diffusers_safetensors"],目前SD WebUI兼容"ckpt"和"safetensors"格式模型。

[optimizer_arguments]
optimizer_type = "AdaFactor"
learning_rate = 1e-7
train_text_encoder = false
max_grad_norm = 0
optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False",]
lr_scheduler = "constant_with_warmup"
lr_warmup_steps = 100

optimizer_type:AdamW (default),Lion, SGDNesterov,AdaFactor等。

learning_rate:训练学习率,单卡推荐设置2e-6,多卡推荐设置1e-7。

train_text_encoder:是否训练时微调Text Encoder。

max_grad_norm:最大梯度范数,0表示没有clip。

optimizer_args:设置优化器额外的参数,比如"weight_decay=0.01 betas=0.9,0.999 ..."。

lr_scheduler:设置学习率调度策略,可以设置成linear, cosine, cosine_with_restarts, polynomial, constant (default), constant_with_warmup, adafactor等。

lr_warmup_steps:在启动学习率调度策略前,先固定学习率训练的步数。

到这里,config_file.toml中八个维度的训练超参数就全部讲好了,大家可以根据自己的实际情况这些超参数进行调整。

除了config_file.toml之外,我们配置的文件还有sample_prompt.toml,其主要作用是在训练中阶段性验证模型的性能,里面包含了模型生成验证图片的相关参数:

[prompt]
width = 1024
height = 1024
scale = 7
sample_steps = 28
[[prompt.subset]]
prompt = "1girl, aqua eyes, baseball cap, blonde hair, closed mouth, earrings, green background, hat, hoop earrings, jewelry, looking at viewer, shirt, short hair, simple background, solo, upper body, yellow shirt"

现在我们已经对SDXL训练的整体参数有了比较充分的了解,下面Rocky再对一些关键参数进行深度的解析,让大家能够更好的理解。

(3)SDXL关键参数详解

【1】pretrained_model_name_or_path对SDXL模型微调训练的影响

pretrained_model_name_or_path参数中我们需要加载本地的SDXL模型作为训练底模型。

在SDXL全参数微调训练中,底模型的选择可以说是最为重要的一环。我们需要挑选一个生成能力分布与训练数据分布近似的SDXL模型作为训练底模型(比如说我们训练二次元人物数据集,可以选择生成二次元图片能力强的SDXL模型)。SDXL在微调训练的过程中,在原有底模型的很多能力与概念上持续扩展优化学习,从而得到底模型与数据集分布的一个综合能力。

【2】xformers加速库对SDXL模型微调训练的影响

当我们将xformers设置为true时,使用xformers加速库能对SDXL训练起到2倍左右的加速,因为其能使得训练显存占用降低2倍,这样我们就能增大我们的Batch Size数。

想要启动xformers加速库,需要先安装xformers库源,这也非常简单,我们只需要在命令行输入如下命令即可:

pip install xformers -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

【3】learning_rate对SDXL模型微调训练的影响

SDXL训练过程对学习率的设置非常敏感,如果我们将学习率设置的过大,很有可能导致SDXL模型训练跑飞,在前向推理时生成非常差的图片;如果我们将学习率设置的过小,可能会导致模型无法跳出极小值点

Rocky这里总结了相关的SDXL学习率设置经验,分享给大家。如果我们总的Batch Size(单卡Batch Size x GPU数)小于10,可以设置学习率2e-6;如果我们总的Batch Size大于10小于100,可以设置学习率1e-7

(4)SDXL模型训练

完成训练参数配置后,我们就可以运行训练脚本进行SDXL模型的全参微调训练了。

我们本次训练用的底模型选择了WeThinkIn_SDXL_二次元模型,大家可以关注Rocky的公众号WeThinkIn,后台回复“SDXL_二次元模型”获取模型资源链接。

我们打开SDXL_finetune.sh脚本,可以看到以下的代码:

accelerate launch \
  --config_file accelerate_config.yaml \
  --num_cpu_threads_per_process=8 \
  /本地路径/SDXL-Trian/sdxl_train.py \
  --sample_prompts="/本地路径/SDXL-Trian/train_config/XL_config/sample_prompt.toml" \
  --config_file="/本地路径/SDXL-Trian/train_config/XL_config/config_file.toml"

我们把训练脚本封装在accelerate库里,这样就能启动我们一开始配置的训练环境了,同时我们将刚才配置好的config_file.toml和sample_prompt.toml参数传入训练脚本中。

接下里,就到了激动人心的时刻,我们只需在命令行输入以下命令,就能开始SDXL的全参微调训练啦:

# 进入SDXL-Trian项目中
cd SDXL-Trian

# 运行训练脚本!
sh SDXL_finetune.sh

训练脚本启动后,会打印出以下的log,方便我们查看整个训练过程的节奏:

running training / 学習開始
  # 表示总的训练数据量,等于训练数据 * dataset_repeats: 1024 * 10 = 10240
  num examples / サンプル数: 10240  
  # 表示每个epoch需要多少step,以8卡为例,需要10240/ (2 * 8) = 640
  num batches per epoch / 1epochのバッチ数: 640
  # 表示总的训练epoch数,等于total optimization steps / num batches per epoch = 64000 / 640 = 100
  num epochs / epoch数: 100
  # 表示每个GPU卡上的Batch Size数,最终的Batch Size还需要在此基础上*GPU卡数,以8卡为例:2 * 8 = 16
  batch size per device / バッチサイズ: 2 
  #表示n个step计算一次梯度,一般设置为1
  gradient accumulation steps / 勾配を合計するステップ数 = 1 
  # 表示总的训练step数
  total optimization steps / 学習ステップ数: 64000

到此为止,Rocky已经将SDXL全参微调训练的全流程都做了详细的拆解,等训练完成后,我们就可以获得属于自己的SDXL模型了!

(5)加载自训练SDXL模型进行AI绘画

SDXL模型微调训练完成后,会将模型权重保存在我们之前设置的output_dir路径下。接下来,我们使用Stable Diffusion WebUI作为框架,加载SDXL二次元人物模型进行AI绘画

在本文3.3节零基础使用Stable Diffusion WebUI搭建Stable Diffusion XL推理流程中,Rocky已经详细讲解了如何搭建Stable Diffusion WebUI框架,未使用过的朋友可以按照这个流程快速搭建起Stable Diffusion WebUI。

要想使用SDXL模型进行AI绘画,首先我们需要将训练好的SDXL二次元人物模型放入Stable Diffusion WebUI的/models/Stable-diffusion文件夹下。

然后我们在Stable Diffusion WebUI中分别选用SDXL二次元人物模型即可:

完成上图中的操作后,我们就可以进行二次元人物图片的生成啦!

下面是使用本教程训练出来的SDXL二次元人物模型生成的图片:

SDXL二次元模型生成图片

到这里,关于SDXL微调训练的全流程攻略就全部展示给大家了,大家如果觉得好,欢迎给Rocky的劳动点个赞,支持一下Rocky,谢谢大家!

如果大家对SDXL全参数微调训练还有想要了解的知识或者不懂的地方,欢迎在评论区留言,Rocky也会持续优化本文内容,能让大家都能快速了解SDXL训练知识,并训练自己的专属SDXL绘画模型!

4.5 基于SDXL训练LoRA模型

目前Stable Diffusion XL全参微调的训练成本是Stable Diffusion之前系列的2-3倍左右,而基于Stable Diffusion XL训练LoRA的成本与之前的系列相比并没有太多增加,故训练LoRA依旧是持续繁荣SDXL生态的高效选择

在本节,Rocky将告诉大家从0到1使用SDXL模型训练对应的LoRA的全流程攻略,让我们一起来训练属于自己的SDXL LoRA模型吧!

(1)SDXL LoRA数据集制作

首先,我们需要确定数据集主题,比如说人物,画风或者某个抽象概念等。本次我们选择用Rocky自己搜集的人物主题数据集——猫女数据集来进行SDXL LoRA模型的训练。

猫女数据集

确定好数据集主题后,我们需要保证数据集的质量,Rocky总结了以下的SDXL LoRA训练数据集筛选要求:

  1. 当我们训练人物主题时,一般需要10-20张高质量数据;当我们训练画风主题时,需要100-200张高质量数据;当我们训练抽象概念时,则至少需要200张以上的数据。
  2. 不管是人物主题,画风主题还是抽象概念,一定要保证数据集中数据的多样性(比如说猫女姿态,角度,全身半身的多样性)。
  3. 每个数据都要符合我们的审美和评判标准!每个数据都要符合我们的审美和评判标准!每个数据都要符合我们的审美和评判标准!

所以Rocky这次挑选的猫女数据集一共有22张图片,包含了猫女的不同姿态数据,并且每张图也符合Rocky的审美哈哈。

接下来,我们就可以按照本文4.3 Stable Diffusion XL数据集制作章节里的步骤,进行数据的清洗,自动标注,以及添加特殊tag——即触发词。在这里,我们要在标注文件的开头添加“catwomen”作为猫女的触发词

除了对数据进行标注,我们还需要对数据的标注进行清洗,删除一些概念与触发词重合的标签为什么我们要进行数据标注的清洗呢?因为如果不对标注进行清洗,会导致训练时的tag污染。

我们拿猫女数据集为例,我们想要让SDXL LoRA模型学习猫女的主要特征,包括脸部特征,服装特征(最具猫女特点的黑色皮衣和黑色眼罩)等,我们想让“catwomen”学习到这些特征。但是自动标注会给数据打上一些描述脸部特征和服装特征的tag,导致猫女的主要特征被这些tag分走,从而导致tag污染。这样就会导致很多精细化的特征丢失在自动标注的tag中,使得SDXL LoRA在生成猫女图片时缺失黑色皮衣或者黑色眼罩等。

所以我们需要删除自动标注的脸部,服装等tag,从而使得保留下来的触发词等标签是SDXL LoRA模型着重需要学习的。

一张一张手动删除标签费时费力,Rocky这里推荐大家使用Stable Diffusion WebUI的一个数据标注处理插件:stable-diffusion-webui-dataset-tag-editor,可以对标签进行批量处理,非常方便。

完成上述步骤,咱们的数据处理部分就告一段落了。为了方便大家使用猫女数据集进行后续的LoRA训练,Rocky这边已经将处理好的猫女数据集开源(包含原数据,标注文件,读取数据的json文件等),大家可以关注公众号WeThinkIn,后台回复“猫女数据集”获取。

(2)SDXL LoRA训练参数配置

大家可以在SDXL-Trian项目中train_config/XL_LoRA_config路径下找到SDXL LoRA的训练参数配置文件config_file.toml和sample_prompt.toml,他们分别存储着SDXL_LoRA的训练超参数与训练中的验证prompt信息。

其中config_file.toml文件中的配置文件包含了sdxl_arguments,model_arguments,dataset_arguments,training_arguments,logging_arguments,sample_prompt_arguments,saving_arguments,optimizer_arguments以及additional_network_arguments九个个维度的参数信息。

训练SDXL_LoRA的参数配置与SDXL全参微调的训练配置有相同的部分(上述的前八个维度),也有LoRA的特定参数需要配置(additional_network_arguments)。

下面我们首先看看这些共同的维度中,有哪些需要注意的事项吧:

[sdxl_arguments] # 与SDXL全参微调训练一致
cache_text_encoder_outputs = true
no_half_vae = true
min_timestep = 0
max_timestep = 1000
shuffle_caption = false

[model_arguments] # 与SDXL全参微调训练一致
pretrained_model_name_or_path = "/本地路径/SDXL模型文件"
vae  = "/本地路径/VAE模型文件"  # 如果只使用模型自带的VAE,不读取额外的VAE模型,则需要将本行直接删除

[dataset_arguments] # 与SDXL全参微调训练不一致
#LoRA训练过程中取消了caption_dropout_rate = 0,caption_tag_dropout_rate = 0,
#caption_dropout_every_n_epochs = 0这三个参数,因为本身LoRA的模型容量较小,不需要再进行类标签Dropout的操作了。
debug_dataset = false
in_json = "/本地路径/data_meta_lat.json"
train_data_dir = "/本地路径/训练集"
dataset_repeats = 1
keep_tokens = 0
resolution = "1024,1024"
color_aug = false
token_warmup_min = 1
token_warmup_step = 0

[training_arguments] # 与SDXL全参微调训练不一致
# SDXL_LoRA增加了sdpa参数,当其设置为true时,训练中启动scaled dot-product attention优化,这时候就不需要再开启xformers了
output_dir = "/本地路径/模型权重保存地址"
output_name = "sdxl_lora_WeThinkIn"
save_precision = "fp16"
save_every_n_epochs = 1
train_batch_size = 4
max_token_length = 225
mem_eff_attn = false
sdpa = true
xformers = false
max_train_epochs = 100 #max_train_epochs设置后,会覆盖掉max_train_steps,即两者同时存在时,以max_train_epochs为准
max_data_loader_n_workers = 8
persistent_data_loader_workers = true
gradient_checkpointing = true
gradient_accumulation_steps = 1
mixed_precision = "fp16"

[logging_arguments] # 与SDXL全参微调训练一致
log_with = "tensorboard"
logging_dir = "/本地路径/logs"
log_prefix = "sdxl_lora_WeThinkIn"

[sample_prompt_arguments] # 与SDXL全参微调训练一致
sample_every_n_epochs = 1
sample_sampler = "euler_a"

[saving_arguments] # 与SDXL全参微调训练一致
save_model_as = "safetensors"

[optimizer_arguments] # 与SDXL全参微调训练不一致
optimizer_type = "AdaFactor"
learning_rate = 1e-5 # 训练SDXL_LoRA时,学习率可以调的大一些,一般比SDXL全参微调的学习率大10倍左右,比如learning_rate = 1e-5
max_grad_norm = 0
optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False",]
lr_scheduler = "constant_with_warmup"
lr_warmup_steps = 100

除了上面的参数,训练SDXL_LoRA时还需要设置一些专属参数,这些参数非常关键,下面Rocky将给大家一一讲解:

[additional_network_arguments]
no_metadata = false
network_module = "networks.lora"
network_dim = 32
network_alpha = 16
network_args = [ "conv_dim=32", "conv_alpha=16",]
network_train_unet_only = true

no_metadata:保存模型权重时不附带Metadata数据,建议关闭,能够减少保存下来的LoRA大小。

network_module:选择训练的LoRA模型结构,可以从["networks.lora", "networks.dylora", "lycoris.kohya"]中选择,最常用的LoRA结构默认选择"networks.lora"

network_dim:设置LoRA的RANK,设置的数值越大表示表现力越强,但同时需要更多的显存和时间来训练。

network_alpha:设置缩放权重,用于防止下溢并稳定训练的alpha值。

network_args:设置卷积的Rank与缩放权重。

下面表格中Rocky给出一些默认配置,大家可以作为参考:

network_category network_dim network_alpha conv_dim conv_alpha
LoRA 32 1 - -
LoCon 16 8 8 1
LoHa 8 4 4 1

如果我们想要训练LoRA,我们需要设置network_module = "networks.lora",同时设置network_dim和network_alpha,和上面的配置一致。

如果我们想要训练LoCon,我们需要设置network_module = "lycoris.kohya"和algo="locon",同时设置network_dim和network_alpha:

network_module = "lycoris.kohya"
algo = "locon"
network_dim = 32
network_alpha = 16
network_args = [ "conv_dim=32", "conv_alpha=16",]

如果我们想要训练LoHa,我们需要设置network_module = "lycoris.kohya"和algo="loha",同时设置network_dim和network_alpha:

network_module = "lycoris.kohya"
algo = "loha"
network_dim = 32
network_alpha = 16
network_args = [ "conv_dim=32", "conv_alpha=16",]

network_train_unet_only:如果设置为true,那么只训练U-Net部分。

(3)SDXL LoRA关键参数详解

【1】train_batch_size对SDXL LoRA模型训练的影响

和传统深度学习一样,train_batch_size即为训练时的batch size。

一般来说,较大的batch size往往每个epoch训练时间更短,但是显存占用会更,并且收敛得(需要更多epoch数)。较小的batch size每个epoch训练时间长,但是显存占用会更,并且收敛得(需要更少epoch数)。

但是有研究表明这个结论会在batch size大于8000的时候才会体现,所以在实际的训练时,如果GPU数不大于8卡的话,还是需要尽可能占满GPU显存为宜,比如64-96之间,训练一般都能取得不错效果。

【2】pretrained_model_name_or_path对SDXL LoRA模型训练的影响

pretrained_model_name_or_path参数中我们需要加载本地的SDXL模型作为训练底模型。

底模型的选择至关重要,SDXL LoRA的很多底层能力与基础概念的学习都来自于底模型的能力。并且底模型的优秀能力需要与我们训练的主题,比如说人物,画风或者某个抽象概念相适配。如果我们要训练二次元LoRA,则需要选择二次元底模型,如果我们要训练三次元LoRA,则需要选择三次元底模型,以此类推。

【3】network_dim对SDXL LoRA模型训练的影响

network_dim即特征维度,越高表示模型的参数量越大,设置高维度有助于LoRA学习到更多细节特征,但模型收敛速度变慢,同时也更容易过拟合,需要的训练时间更长。所以network_dim的设置需要根据任务主题去调整。

一般来说,在SDXL的1024*1024分辨率训练基础上,可以设置network_dimension = 128,此时SDXL LoRA大小约为686MB。

【4】network_alpha对SDXL LoRA模型训练的影响

network_alpha是一个缩放因子,用于缩放模型的训练权重  , �=���×���ℎ�/��� 。network_alpha设置的越高,LoRA模型能够学习更多的细节信息,同时学习速率也越快,推荐将其设置为network_dimension的一半。

(4)SDXL LoRA模型训练

完成训练参数配置后,我们就可以运行训练脚本进行SDXL_LoRA模型的训练了。

我们本次训练用的底模型选择了WeThinkIn_SDXL_真人模型,大家可以关注Rocky的公众号WeThinkIn,后台回复“SDXL_真人模型”获取模型资源链接。

我们打开SDXL_fintune_LoRA.sh脚本,可以看到以下的代码:

accelerate launch \
  --config_file accelerate_config.yaml \
  --num_cpu_threads_per_process=8 \
  /本地路径/SDXL-Train/sdxl_train_network.py \
  --sample_prompts="/本地路径/SDXL-Train/train_config/XL_LoRA_config/sample_prompt.toml" \
  --config_file="/本地路径/SDXL-Train/train_config/XL_LoRA_config/config_file.toml"

我们把训练脚本封装在accelerate库里,这样就能启动我们一开始配置的训练环境了,同时我们将刚才配置好的config_file.toml和sample_prompt.toml参数传入训练脚本中。

接下里,就到了激动人心的时刻,我们只需在命令行输入以下命令,就能开始SDXL_LoRA训练啦:

# 进入SDXL-Trian项目中
cd SDXL-Trian

# 运行训练脚本!
sh SDXL_fintune_LoRA.sh

(5)加载SDXL LoRA模型进行AI绘画

SDXL LoRA模型训练完成后,会将模型权重保存在我们之前设置的output_dir路径下。接下来,我们使用Stable Diffusion WebUI作为框架,加载SDXL LoRA模型进行AI绘画。

在本文3.3节零基础使用Stable Diffusion WebUI搭建Stable Diffusion XL推理流程中,Rocky已经详细讲解了如何搭建Stable Diffusion WebUI框架,未使用过的朋友可以按照这个流程快速搭建起Stable Diffusion WebUI。

要想使用SDXL LoRA进行AI绘画,首先我们需要将SDXL底模型和SDXL LoRA模型分别放入Stable Diffusion WebUI的/models/Stable-diffusion文件夹和/models/Lora文件夹下。

然后我们在Stable Diffusion WebUI中分别选用底模型与LoRA即可:

Stable Diffusion WebUI中使用SDXL LoRA流程

完成上图中的操作后,我们就可以进行猫女图片的生成啦!

【1】训练时的底模型+猫女LoRA

首先我们使用训练时的底模型作为测试底模型,应选用训练好的猫女LoRA,并将LoRA的权重设为1,看看我们生成的图片效果如何:

自训练SDXL LoRA生成猫女图片

我们可以看到,生成的猫女图片的完成度还是非常好的,不管是整体质量还是细节都能展现出猫女该有的气质与魅力。并且在本次训练中猫女的手部特征也得到了较好的学习,优化了一直困扰AI绘画的手部问题

【2】设置LoRA的不同权重

接下来,我们设置LoRA的权重分别为[0.2, 0.4, 0.6, 0.8, 1],进行对比测试,看看不同SDXL LoRA权重下的图片生成效果如何:

SDXL LoRA的权重分别为[0.2, 0.4, 0.6, 0.8, 1]时的图片生成效果

从上图的对比中可以看出,当SDXL LoRA设置的权重越高时,训练集中的特征越能载生成图片中展现,比如说猫女的人物特征,猫女的服装特征以及生成的猫女有无面罩等。但LoRA的权重也不是也高越好,当设置权重为0.6-0.8之间,生成的图片会有更多的泛化性

【3】切换不同的底模型

完成了在单个底模型上的SDXL LoRA不同权重的效果测试,接下来我们切换不同的底模型,看看会生成的猫女图片会有什么变化吧。

首先,我们将底模型切换成SDXL Base模型,使用猫女LoRA并设置权重为1:

SDXL Base模型 + 猫女LoRA生成图片

从上面的图中可以看出,使用SDXL Base模型作为底模型后,生成的猫女图片整体质感已经发生改变,背景也有了更多光影感

我们再使用SDXL的二次元模型作为底模型,同样使用猫女LoRA并设置权重为1:

SDXL 二次元模型+ 猫女LoRA生成图片

可以看到,换用二次元模型作为底模型后,生成的猫女图片整体质感开始卡通化。但是由于训练数据集中全是三次元图片,所以二次元底模型+三次元LoRA生成的图片并没有完全的二次元化。

【4】使用不同提示词改变图片风格

最后,我们再尝试通过有添加提示词prompt,来改变生成的猫女图片的风格。

首先,我们在提示词prompt中加入赛博朋克风格“Cyberpunk style”,这是生成的猫女图片中就会加入赛博朋克元素了:

赛博朋克风格的猫女

到这里,关于SDXL LoRA的全流程攻略就全部展示给大家了,大家如果觉得好,欢迎给Rocky的劳动点个赞,支持一下Rocky,谢谢大家!

如果大家对SDXL LoRA还有想要了解的知识或者不懂的地方,欢迎在评论区留言,Rocky也会持续优化本文内容,能让大家都能快速了解SDXL LoRA知识,并训练自己的专属LoRA模型!

4.6 SDXL训练结果测试评估

之前的章节讲述了SDXL模型微调和SDXL LoRA模型训练后的效果测试评估流程,那么在本小节,Rocky向大家介绍一下AI绘画模型测试评估的一些通用流程与技巧。

在进行AI绘画时,我们需要输入正向提示词(positive prompts)和负向提示词(negative prompts)。

正向提示词一般需要输入我们想要生成的图片内容,包括我们训练好的特殊tag等。

不过在正向提示词的开头,一般都需要加上提高生成图片整体质量的修饰词,Rocky这里推荐一套“万金油”修饰词,方便大家使用:

(masterpiece,best quality,ultra_detailed,highres,absurdres:1.2)

负向提示词一般需要输入我们不想生成的内容,在这里Rocky再分享一套基于SDXL的“万金油”负向提示词,方便大家使用:

(worst quality, low quality, ugly:1.4), poorly drawn hands, poorly drawn feet, poorly drawn face, out of frame, mutation, mutated, extra limbs, extra legs, extra arms, disfigured, deformed, cross-eye, blurry, (bad art, bad anatomy:1.4), blurred, text, watermark

但是,如果存在生成图片质量不好,生成图片样式单一或者生成图片崩坏的情况,就需要优化数据或者参数配置,重新训练了。

后续Rocky将持续把Stable Diffusion XL训练的全流程补充上来,大家先点赞收藏敬请期待!!!

5 生成式模型的性能测评

到目前为止,AIGC领域的测评过程整体上还是比较主观。Stable Diffusion XL在性能测评时使用了FID(Fréchet inception distance),CLIP score以及人类视觉系统(HVS)评价这三个指标作为文生图的标价指标,其中人类视觉系统依旧是占据主导地位

下面,跟着Rocky一起来看看各个评价指标的意义与特点,以及在不同的实际场景中,该如何对生成式模型做出有效的评估。

5.1 FID(Fréchet inception distance)

FID(Fréchet inception distance)表示生成图像与真实图像之间的相似性,即图像的真实度。FID表示的是生成图像的特征向量与真实图像的特征向量之间的距离,该距离越近(值越小),表明生成模型的效果越好,即图像的清晰度高,且多样性丰富。

FID是通过Inception模型进行计算的。主要流程是将生成图像和真实图像输入到Inception模型中,并提取倒数第二层的2048维向量进行输出,最后计算两者特征向量之间的距离。

由于Stable Diffusion XL模型是文生图模型,并不存在原本的真实图像,所以一般选用COCO验证集上的zero-shot FID-30K(选择30K的样本)与生成图像进行求FID操作,并将其中最小的FID用于不同模型之间的性能对比

但是有研究指出,FID对深入的文本理解,独特艺术风格之间的精细区分,以及明显的视觉美感等AIGC时代特有的特征不能很好的评估。同时也有研究表明,zero-shot FID-30K与视觉美学呈负相关

5.2 CLIP score

CLIP score可以用于评估文生图/图生图生成图像与输入Prompt文本以及生成图像与输入原图像的匹配度。以文生图为例,我们使用CLIP模型将Prompt文本和生成图像分别转换为特征向量,然后计算它们之间的余弦相似度。当CLIP Score较高时,表示生成图像与输入Prompt文本之间的匹配度较高;当CLIP Score较低时,表示生成图像与输入Prompt文本之间的匹配度较低。

Stable Diffusion XL比起之前的系列:FID上升,CLIP score提升

从上表可以看出,SDXL在CLIP score上得分最高,由于使用了两个CLIP Text Encoder进行约束,SDXL对文本内容的控制力确实强了不少。但是SDXL在FID指标上也同步上升了,并且比之前的系列都要高,刚才在介绍FID指标的内容中,Rocky已经阐述过很多研究都表明FID在AIGC时代不能很好的作为美学评价指标,甚至与视觉美学呈负相关,在SDXL的论文中更加证实了这一点。所以在此基础上,最后又增加了人类视觉系统作为评价指标,在人类评估者眼中,明显更加喜欢SDXL生成的图片,结果如下所示:

在人类评估者眼中,Stable Diffusion XL以48.44%的胜率超过之前的系列

5.3 Aesthetics Scorer(美学评分)

除了上述提到的三种评价指标,我们还可以用Aesthetics Scorer(美学评分)对Stable DIffusion系列模型生成的图片进行评分。Aesthetics Scorer背后的评价标准数据集是基于LAION-Aesthetics,也就是Stable Diffusion系列训练时有使用到的数据集,所以Aesthetics Scorer有一定的可靠性。

Aesthetics Scorer越高,表示图像美学质量越好

5.4 与Midjourney系列进行对比

完成和Stable Diffusion之前系列的对比之后,SDXL还与Midjourney v5.1和Midjourney v5.2进行了对比。

这里主要使用谷歌提出的文生图测试prompts:PartiPrompts(P2)作为测试基准。PartiPrompts(P2)包含了1600多个英文prompts,覆盖了不同的类别与复杂度,可以说是一个高价值基准。

PartiPrompts(P2)包含的prompts内容范围

在具体比较时,从PartiPrompts(P2)的每个类别中选择五个随机prompts,并由Midjourney v5.1和SDXL分别生成四张1024×1024分辨率的图像。然后将这些图像提交给AWS GroundTruth工作组,工作组根据图像与prompts的匹配度进行投票(Votes)。投票结果如下图所示,总体而言,SDXL的生成效果略高于Midjourney v5.1(54.9%:45.1%):

Stable Diffusion XL VS Midjourney v5.1

除了Midjourney v5.1之外,SDXL还与DeepFloyd IF、DALLE-2、Bing Image Creator和Midjourney v5.2进行了定性比较,这些都是AIGC领域的高价值与强生态模型,对比结果已经在下图展示,大家可以对比了解一下:

SDXL还与DeepFloyd IF、DALLE-2、Bing Image Creator和Midjourney v5.2的定性比较

总的来说,不管是在传统深度学习时代还是在AIGC时代,生成式模型的生成效果一直存在难以量化和难以非常客观评价的问题,需要人类视觉系统去进行兜底与约束。

那么,在不同的实际场景中,我们该如何对SDXL等生成式模型做出务实的评价呢?

5.5 不同实际场景的务实评估

其实在不同的实际场景中,最务实有效的AIGC模型评估手段是判断模型是否具备价值

从投资视角看,价值是有产生类ChatGPT效应或者类妙鸭相机流量的潜在势能,比如在团队内部或者让潜在投资人产生了“哇塞时刻”。

从CEO角度看,价值是在ToB领域能解决客户的问题;在ToC领域能获得用户的好评并存在成为爆款的潜在可能性。

从CTO角度看,价值是能够在严谨的验证中发表论文;能够在顶级算法竞赛中斩获冠军;能够作为产品解决方案的一部分,让产品“焕然一新”。

由于模型本身是“黑盒”,无法量化分析模型结构本身,而评估模型生成的内容质量的指标又离不开人类视觉系统的支持。那就把模型融入到产品中,融入到算法解决方案中,在一次次的实际“厮杀”中,来反馈验证模型的性能。

6 AI绘画领域的未来发展

6.1 AI绘画的“数据工厂”

看完本文的从0到1进行Stable Diffusion XL模型训练部分内容,大家可能都有这样一种感觉,整个数据处理流程占据了整个SDXL模型开发流程的60-70%甚至更多的时间,并且在数据量级不断增大的情况下,数据产生的护城河开始显现,模型的“数据飞轮”效应会给产品带来极大的势能

可以看到,数据侧是如此重要,AIGC时代也需要像传统深度学习时代一样,设立“数据工厂”为AIGC模型的优化迭代提供强有力的数据支持

在传统深度学习时代,数据工厂能够将图片中的目标类别进行精准标注;而到了AIGC时代,数据工厂的标注内容就发生了变化,需要对图片进行理解,并且通过文字与关键词描述出图片中的内容

但是除此之外,数据工厂的数据收集,数据整理,数据供给等功能都是跨周期的需求,在传统深度学习时代已经证明,数据工厂能大大增强算法团队的工作效率,为整个AI算法解决方案的开发,迭代,交付提供有力支持。

Rocky相信,未来AIGC时代的数据工厂会是一个非常大的机会点,作为AIGC领域的上游产业,不管是大厂自建数据工厂,还是专门的AIGC数据工厂公司,都会像在传统深度学习时代那样,成为AIGC产业链中不可或缺的关键一环

6.2 AI绘画的“工作流”产品

2022年可以说是AIGC元年,各路大模型争先恐后的发布,“百模大战”一触即发

但是,市场真的需要这么多大模型吗?用户真的需要这么多大模型吗?

答案显而易见是否定的。并且大模型并不是万能的,有着明显的能力边界,单个大模型不足以形成足够的技术与产品普惠

历史不总是重复,但是会押韵。从AIGC之前的深度学习时代,也有非常多的公司迷信当时的人脸检测,人脸识别,目标检测,图像分类算法。但时间告诉我们,深度学习时代的红利与价值,最后只赋能了互联网行业,安防行业,智慧城市行业以及智慧工业等强B端行业

那么,AIGC时代和深度学习时代的区别是什么呢?

也很简单,类似移动互联网时代那样的ToC可能性。因为不管是开源社区,还是AIGC时代的互联网大厂和AI公司,亦或者是绘画领域专业的个人,都开始尝试大模型+辅助工具的“工作流”产品,并且让这些产品触达每个用户。像妙鸭相机等APP已经显现移动互联网时代的快速商业与流量闭环。

Rocky在这里再举一些热门AI绘画“工作流”产品例子:

  • Stable Diffusion + LoRA + ControlNet的“三巨头”组合。
  • Stable Diffusion + 其他生成式模型(ChatPT,GAN等)的组合。
  • Stable Diffusion + 深度学习模型(分类,分割,检测等)的组合。
  • Stable Diffusion + 视频组件的组合。
  • Stable Diffusion + 数字人组件的组合。
  • ......

这些“工作流”式的AIGC产品,不管是对ToB,还是ToC,都有很强的普惠性与优化迭代可能性。同时可以为工业界,学术界以及竞赛界的AI绘画未来发展带来很多的势能与“灵感”,Rocky相信其会成为AI绘画行业未来持续繁荣的核心关键。

6.3 AI绘画模型未来需要突破的瓶颈

SDXL虽然是目前最先进的开源AI绘画模型,但是其同样存在一些需要突破的瓶颈。

SDXL有时仍难以处理涉及详细空间安排和详细描述的非常复杂的提示词。同时手部生成依旧存在一定的问题,会出现多手指,少手指,鸡爪指,断指以及手部特征错乱等情况。除此之外,两个概念的互相渗透,互相混淆,或者是概念溢出等问题还是需要更多的约束。

下图中展示了这些问题,左上角的图片展示了手部生成失败的例子;左下角和右下角的图片展示了概念渗透,互相混淆的例子;右上角的图片展示了对复杂描述与详细空间安排的提示词生成失败的例子:

SDXL生成的一些失败案例与瓶颈

更多内容后续补充,大家敬请期待!码字确实不易,希望大家能一键三连,多多点赞!

7 推荐阅读

Rocky会持续分享AIGC的干货技术教程,经典模型讲解,实用的工具应用以及对AIGC行业的深度思考,欢迎大家多多点赞,喜欢,收藏,给Rocky的义务劳动多一些动力吧,谢谢各位!

7.1 深入浅出完整解析Stable Diffusion核心基础知识

在此之前,Rocky也对Stable Diffusion的核心基础知识作了比较系统的梳理与总结:

7.2 深入浅出完整解析Stable Diffusion中U-Net核心基础知识

同时对Stable Diffusion中最为关键U-Net结构进行了深入浅出的分析,包括其在传统深度学习中的形态和AIGC中的形态:

7.3 深入浅出完整解析LoRA核心基础知识

对于AIGC时代中的“ResNet”——LoRA,Rocky也进行了讲解,大家可以按照Rocky的步骤方便的进行LoRA模型的训练,繁荣整个AIGC生态:

7.4 AIGC产业深度思考与分析

2023年3月21日,微软创始人比尔·盖茨在其博客文章《The Age of AI has begun》中表示,自从1980年首次看到图形用户界面(graphical user interface)以来,以OpenAI为代表的科技公司发布的AIGC模型是他所见过的最具革命性的技术进步。

Rocky也认为,AIGC及其生态链,会成为AI行业重大变革的主导力量。AIGC会带来一个全新的红利期,未来随着AIGC的全面落地和深度商用,会深刻改变我们的工作,生活,学习以及交流方式,许多行业都将被重新定义,过程会非常有趣。

2023年的“疯狂三月”,世界上主要科技公司与研究机构们争先恐后发布关于AIGC的最新进展,让人目不暇接,吃瓜群众们纷纷惊呼不已。那么,在狂欢过后,我们该如何更好的审视AIGC的未来?我们该如何更好地拥抱AIGC引领的革新?接下来Rocky准备从技术,产品,长期主义等维度分享一些个人的核心思考与观点,希望能帮助各位读者对AIGC有一个全面的了解。

7.5 算法工程师的独孤九剑秘籍

为了便于大家实习,校招以及社招的面试准备与技术基本面的扩展提升,Rocky将符合大厂和潜力独角兽价值的算法高频面试知识点撰写总结成《三年面试五年模拟之独孤九剑秘籍》,并制作成pdf版本,大家可在公众号WeThinkIn后台【精华干货】菜单或者回复关键词“三年面试五年模拟”进行取用。

Rocky一直在运营技术交流群(WeThinkIn-技术交流群),这个群的初心主要聚焦于AI行业话题的讨论与研究,包括但不限于算法,开发,竞赛,科研以及工作求职等。群里有很多AI行业的大牛,欢迎大家入群一起交流探讨~(请添加小助手微信Jarvis8866,邀请大家进群~)

发布于 2023-07-14 00:36・IP 属地浙江
本文来自网络,不代表本站立场,转载请注明出处:万道一,Wonder One » 深入浅出完整解析Stable Diffusion XL(SDXL)核心基础知识
莫要搞事情哦
你喜欢的人刚好也未喜欢你
张学友刘德华邓紫琪已关注
赞(0) 打赏

赏点小费吧客倌

微信扫一扫打赏