经过前两个task的学习,对于文生图的基本原理,技术支持,模型微调,工作流程等有了一定的了解,尤其是在prompt工程上面,提示词的质量决定着生成图像的流畅性和观赏性,AI大模型在这一方面为学习者们提供了非常大的帮助,通过大模型生成和优化提示词,能实现学习者自我创作连环画的目的。
在Task3中,我们将进一步学习关于微调Lora模型的原理和知识,了解基本参数的概念以达到更好的效果,还有一个工作流平台Comfyui帮助我们生成更高质量图片
一、工作流平台工具ComfyUI
1.1ComfyUI的基本概念
ComfyUI是一种GUI,GUI是“Graphical User Interface”的缩写,一种有图标和按钮的交互界面。
ComfyUI基于节点来进行工作,具有操作图像的生成技术,它主要采用的是一种模块化的设计,这样可以分解图像生成的过程为许多小步骤,这些小步骤被称为节点,所有节点集成起来形成生成图像的工作流,用户可以操作这些节点来生成他们理想的图片。
1.2ComfyUI的核心模块
核心模块:模型加载器,提示词管理器,采样器,解码器
下图展示的是模型加载器,这里我选用的是kolors和chatglm3的模型,精度选择的是fp16
显而易见模型加载器可以用来加载基础的模型文件,通常会包含Model,CLIP和VAE
下图是CLIP模块,它的作用是可以将文本输入转化成为模型文件可以理解的latent space embedding(潜在空间嵌入)作为模型的输入形式
下图是VAE模块,它的作用是将latent space中的embedding解码成为像素级别的图片
下图是采样器,可以看到这里有很多参数,分别是
width--像素图片的宽度 height--像素图片的高度
seed--控制噪声产生的随机种子
control_after_generate--控制seed在每次生成后得变化(这里设置为fixed固定不变)
steps--降噪的迭代步数,数值越大则信号越精准,随之生成时间增加
cfg--叫做classifier free guidance,决定prompt对生成图像的影响程度,数值越大,prompt的表现越明显
scheduler--降噪参数
denoise_strength--被噪声覆盖的内容大小
1.3ComfyUI的工作流程
下图展示了ComfyUI的工作全过程,当我们选好了模型之后,参数会随之自动调配出来,我们只需要动动手指将节点拼接起来,最后点击生成图片,等待出片就行了
1.4快速安装&体验ComfyUI
这里我们依旧是用到了魔搭平台:https://www.modelscope.cn/home
我们进入实例(这是之前搭建好的),点击启动,进入实例
打开实例之后,将下面的代码进行复制到终端中并执行,这里包含了ComfyUI的执行文件,以及微调之后的Lora文件
git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors_test_comfyui.git
mv kolors_test_comfyui/* ./
rm -rf kolors_test_comfyui/
mkdir -p /mnt/workspace/models/lightning_logs/version_0/checkpoints/
mv epoch=0-step=500.ckpt /mnt/workspace/models/lightning_logs/version_0/checkpoints/
打开ComfyUI文件,点击执行,等待大约15分钟左右
复制URL链接到任意网站上,可以进入ComfyUI界面进行操作了
安装完ComfyUI之后,我们可以浅浅尝试以下我们的工作流平台,这里我们可以引入模型,我尝试的是带Lora的工作流
从图中我们可以看到我们加载的模型为kolors,精度为fp16,同时还有lora模型文件的地址,后续还有一系列采样器的参数
按一下左上角的Queue Prompt按钮,节点就会按流程工作,然后你就会得到一张非常可爱的图片(当然你可以拥有自己的风格)
二、LoRA微调
一些背景:现在有很多大语言模型(GPT,BERT等)因为参数量十分巨大,对其进行微调一般都需要大量计算资源和存储空间。而在实际应用中,我们所拥有的资源往往是有限的,那么我们定制模型的成本将会耗费甚多。
一些挑战:一些微调模型的方法通常是需要对所有参数进行更改,这就导致需要大量的计算资源和空间,稍有不慎还会导致模型过拟合,反而丧失了原有良好的泛化能力。
2.1 关于LoRA
LoRA(Low-Rank Adaptation)是一种对大型预训练模型进行高效微调的方法。通过引入可训练的低秩矩阵在模型的每一层,LoRA可以在不改变原有模型权重的情况下对其进行微调。这种方法不仅节省了资源,而且让模型具有良好的泛化能力。故LoRA在大型预训练模型的领域中发挥着重要的作用。
2.2 LoRA的核心
低秩矩阵:首先LoRA将原始模型的权重矩阵分解为低秩矩阵,方法很巧妙,它将低秩矩阵插入到模型的每一层中进行训练,这样在模型微调过程中只需要调整少量参数并且不影响原始权重。
参数调整效率:通过使用低秩矩阵,相比于传统的微调方法,LoRA显著减少了微调的参数数量,降低显存占用和计算需求,即使在资源有限的情况下,依旧可以对大模型进行微调。
2.3 LoRA实现方法
矩阵分解:
在每一层中,LoRA会将权重矩阵W分解为两个低秩矩阵A和B,故有W = A x B,A的维度是d x r, B的维度r x k,r是一个远小于d和k的数,这样就能保持低秩。
微调过程中,LoRA只对两个低秩矩阵进行更新,原始矩阵W保持不变,在模型的前向传播中,使用LoRA的权重可用公式计算。
微调公式:W=W0+ΔW=W0+α×(A×B),α是一个缩放系数,通常是超参数,通常是控制低秩矩阵对原始矩阵的影响。
插入LoRA模块:
LoRA可以插入到任何线性层(自注意力机制中的投影层或全连接层),一般情况下,LoRA会针对Transformer模型中自注意力机的‘to_q(query)’,‘to_k(key)’,‘to_v(value)’,‘to_out’等位置进行插入操作。
在每个目标层中插入的时候会利用两个低秩矩阵替换普通的线性层。
训练过程:
在微调开始之前,A和B的参数会设置为随机数(正态分布初始化)初始化,保证模型在初始状态时不会偏离预训练模型的表现。
在训练过程中,标准的反向传播算法会同时更新A和B的参数,由于A和B的参数量小,效率也将高于全量微调。
对于超参数α的调整也是重要的,通过调节α,可以控制低秩矩阵对原始矩阵的影响程度,甚至可以达到微调有效性和模型原始能力的平衡。
2.4 LoRA的优点
高效性:LoRA大大减少了微调所需要的计算资源和存储空间,微调更加轻量级
保留原始模型能力:原始权重将保持不变,LoRA也可以令模型灵活的适应新任务,拥有良好的泛化能力
模块化设计:LoRA可以应用于各种不同的预训练模型,不需要对每个模型进行非常大的结构调整
总的来说,LoRA是一种非常比较高效且友好的微调方法,节省大量的计算资源和存储空间,即使在资源有限的情况下,依然对大型预训练模型的调整具有良好的效果,未来LoRA还可以与其他的模型或者微调技术融合,集成为更高效,更完善的应用技术。同时自动化的方法也可以自动调节LoRA的参数和选择优化方法,简化微调模型的过程。