前提条件
- 大模型学习机预装了Llama 2-7b-chat模型与stable-diffuison-base-v2.1模型, 以及配套的开源服务框架text-generation-webui与stable-diffuison-webui,使您不需单独进行下载模型与配置环境。
- 云主机开通与如何登录网页页面参见部署文档。
1. 模型微调简介
由于基础大模型参数量极多,训练需要的资源量极大,因此基于基础大模型进行微调的技术应运而生。针对StableDiffusion进行微调的技术主流的有4种,分别是:
(1)Textual Inversion:不改变原模型结构与参数,只增加新的关键词并训练新的输入embedding。生成的新模型很小,大约几十KB。由于没有影响原模型的结构与参数,因此调整能力有限。
(2)Hypernetwork:在原模型的cross-attention网络结构中插入一层新网络,与原模型结构串行执行。由于新网络会平均作用在整个模型上,因此更适宜训练绘画风格。模型大小约几十MB。
(3)LoRA:在原模型的cross-attention网络结构中插入多个小网络结构,与原模型结构并行执行。实践证明这种结构的效果要优于Hypernetwork,因此LoRA是当前最主流的微调方案。模型大小约几十MB。
(4)Dreambooth:对整个原模型的参数进行微调,训练成本高,生成的模型相当于一个新的基础大模型。模型大小约几GB。
已有LoRA模型如何加载可参考图像生成模型使用最佳实践。
本文以Textual Inversion方式为例,介绍通过私有数据微调模型并进行图像生成的流程。如果您有微调新的LoRA模型的需求,本文也给出了相关插件的安装说明。
2. 准备训练数据
2.1 图片文件准备
准备一批用于训练的图片,可以是同一人物/物体的不同视角,也可以是同一种绘画风格。
本示例中采用了同一只狗狗的不同视角图片。
2.2 图片文件上传与裁切
在Extras页面的Batch Process下点击文字,选择图片文件。
选择Scale to将图片裁切到512x512的大小。
点击generate按钮,等待图片上传完毕。
注意目前某些镜像中尚未预装deepbooru功能所需的模型。当您首次上传图片时,系统会访问github进行模型下载,该模型大小为614MB。依据您的网络带宽,这可能需要几分钟的时间。
上传完成的图片在云主机的 /root/stable-diffusion-webui/output/extras-images
目录下。
建议您将文件通过mv命令移动到其他文件夹,方便区分不同的训练文件。例如:
cd /root/stable-diffusion-webui
mkdir -p train/picdata1
mv output/extras-images/* train/picdata1
您还可查看每张图片生成的txt文件,检查反推出来的提示词是否符合预期,并删除识别错误的提示词。
例如本示例中模式识别的提示词中有一个多余的”shiba inu”,需要将其删除。
3 启动训练
stable-diffusion-webui框架在启动时默认已经加载好了基础大模型,无需做额外操作。
3.1 生成初始模型文件
首先需要在Train页面的Create embedding标签下,创建一个空的初始模型文件。
- Name: 小模型的名称,也是未来使用小模型时需要用到的专有提示词名称。例如我们为训练图片中的狗狗取名字叫”八四”,因此模型的Name可以叫”dogbasi”,未来使用模型时也需要用”dogbasi”触发。注意这里的名称必须是特有的,避免和模型已有的关键词重复。
- Number of vectors per token: 小模型参数的维度,数值越大模型拟合能力越强,但也可能导致拟合过强。推荐设置在3-7左右。如果是学习绘画风格,一般设置尽量小一些; 如果是学习具体物体,可以设置大一些。
3.2 调整训练配置
在Train页面的Train标签页,修改如下设置:
- Embedding: 选择3.1步骤中创建过的初始embedding模型。
- Dataset directory: 填写2.2步骤中上传与调整过的训练图片目录。
- Prompt templete: 如果期望训练绘画风格,选择style_filewords.txt;如果期望训练具体物体,选择subject_filewords.txt。
- Max Steps: 训练的总轮次,一般在图片数量不大的情况下(10张图左右),推荐设置为1000及以上,以保证训练质量。
3.3 启动训练
点击页面底部Train Embedding按钮开始训练,等待进度条结束。
注意在batch size默认设置为1的情况下,训练需要消耗6G显存。
3.4 加载微调过的模型
在txt2img页面的Textual inversion标签下,点击右侧的刷新按钮,如果看到新训的小模型即代表成功。
3.5 使用模型示例
在提示词prompt中附加上微调过的小模型名称,即可生成类似训练数据的新图片。如果发现图片质量不佳,可以尝试加大训练时的Max Steps,或者加大Create embedding时的Number of vectors per token,或者准备更多高质量的训练图片(数据最关键)。
4. 微调新LoRA模型插件安装
stable-diffusion-webui本体没有微调LoRA模型的功能,需要安装Dreambooth插件。下面将以此为例介绍如何在本框架中安装插件。
stable-diffusion-webui本身提供了自动下载和安装插件的功能(见extensions页),但由于github和pip库访问受限,自动下载无法成功。因此本文采用了手动安装的方式。
手动安装需要您通过ssh或远程登录等方式登录到云主机系统内,您可以参考[修改大模型学习机登录密码]的相关内容。
同时,由于涉及到服务运行环境的修改,因此所有操作都将在docker 容器内执行 。进入容器的方式参考:
# 检查容器状态
docker ps -a
# 进入容器
docker exec -it stable_diffusion bash
注意执行完进入容器的命令后,命令行界面并不会有明显变化,您可以通过执行命令docker ps是否能成功,来判断当前在容器内还是云主机内。
4.1 配置github地址(可选)
如果您在执行git clone时始终因为网络问题无法成功,则可参考本节内容。
(1) 获取可用的ip地址
注意1. IP地址并不会一直固定,未来如无法访问github,您需要重新确认最新的IP地址。
2. 可以使用代理服务器彻底解决问题,但注意如果设置了http_proxy系统变量,需要在使用完毕后取消设置,或者在/root/stable-diffusion-webui/run.sh启动脚本中增加一项`--share \`,否则webui服务会报错无法访问localhost。
(2) 修改hosts文件
请确保当前在docker容器内。
通过vim编辑器修改/etc/hosts文件,添加如下内容:
# 从ipaddress查到的真实ip地址
140.82.114.3 github.com
完成配置后,访问github相关链接成功概率提升(但不保证一定成功)。
4.2 下载插件文件
请确保当前在docker容器内。
进入到/root/stable-diffusion-webui/extensions目录下,并下载dreambooth插件。
cd /root/stable-diffusion-webui/extensions
git clone https://github.com/d8ahazard/sd_dreambooth_extension.git
遇到连接失败可以多重试几次,如果始终失败,则参考4.1节的内容手动配置github地址。
4.3 安装插件需要的依赖库
请确保当前在docker容器内。
stable-diffusion-webui采用了python venv的方式进行环境隔离,首先需要进入到虚拟环境。
cd /root/stable-diffusion-webui
source venv/bin/activate
执行成功后,命令行界面开头将出现(venv)标识。
然后在插件文件夹内安装依赖库。由于pip库访问受限问题,这里采用了清华的镜像源。
cd /root/stable-diffusion-webui/extensions/sd_dreambooth_extension
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
安装成功后将出现如下提示:
4.4 重启服务以应用插件
如果您当前在docker容器环境中,可直接执行exit命令退出到云主机内。
参考[大模型学习机服务启停最佳实践]文档,重启stable-diffusion-webui服务:
sh /root/restart_sd_webui.sh
4.5 确认插件安装完毕
重新登录页面后,应多出Dreambooth页面:
Dreambooth插件的使用方式和上文训练Textual Inversion是一致的。
(1)在Create页面创建一个空模型。内容参考下图。
(2)首次创建时,插件会从github额外下载一些辅助模型,大小约几百MB。建议您提前自行下载并放到/root/stable-diffusion-webui/models/GFPGAN目录下,避免等待太长时间。
cd /root/stable-diffusion-webui/models/GFPGAN
wget
https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth
wget https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth
(3)插件还需要从huggingface网站下载StableDiffusion模型的部分内容,因此需要删除/root/stable-diffusion-webui/run.sh脚本中的内容:
# 删除这一行可恢复对huggingface的连接
export HF_HUB_OFFLINE=1 #can not access to
huggingface.io
参考4.1节对github真实ip的配置,也需要对huggingface.co进行相关配置,否则无法访问。
下载模型数据需要占据大量磁盘空间,建议额外购买50G-100G大小的数据盘,并挂载到/root/stable-diffusion-webui/models/dreambooth目录下(也可先将当前model文件夹改名,然后直接将数据盘挂载为新的model文件夹,最后将老数据mv进去)。
说明即使配置了真实ip,在访问huggingface.co时也依然会失败,建议您使用代理服务器进行连接。配置代理服务器和http_proxy环境变量后,需要在/root/stable-diffusion-webui/run.sh脚本中增加 `--share \`,否则webui服务会报错无法访问localhost。
(4)在Concepts页面设置样本路径。
(5)在Parameters页开启LoRA训练。
其他训练相关的参数您可自行查看和调整(例如训练轮次,学习率等),本文不再一一赘述。