通过GPU云服务器快速生成特定物体图片
本实验介绍如何使用GPU云服务器搭建Stable Diffusion模型,并基于ControlNet框架,快速生成特定物体图片。
场景简介
阿里云不对第三方模型的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。
您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。
本实验介绍如何使用GPU云服务器搭建Stable Diffusion模型,并基于ControlNet框架,快速生成特定物体图片。
背景知识
Stable Diffusion
Stable Diffusion(简称SD)是一种AI模型,它经过训练可以逐步对随机高斯噪声进行去噪以生成所需要的图像。
DreamBooth是一种定制化text2image模型的方法,只需提供特定物体的3~5张图片,就能生成该物体的图片。我们使用DreamBooth对模型进行Finetune,并利用阿里云AI加速器中的AIACC-AGSpeed加速Finetune,同时引入ControNet增加生成图片的多样性。
ControlNet是一组网络结构,通过对SD添加额外的Condition来控制SD,目前提供的预训练Condition包括:Canny Edge,M-LSD Lines,HED Boundary,User Scribbles,Fake Scribbles,Human Pose,Semantic Segmentation,Depth,Normal Map,Anime Line Drawing。您可以同时添加多个ControlNet进行多Condition的控制。训练其他Condition来控制SD的具体操作,请参见Train a ControlNet to Control SD。
GPU云服务器
GPU云服务器(GPU Cloud Computing,GPU)是提供 GPU 算力的弹性计算服务,具有超强的计算能力,服务于深度学习、科学计算、图形可视化、视频处理多种应用场景。阿里云作为亚太第一的云服务提供商,随时为您提供触手可得的算力,有效缓解计算压力,提升您的业务效率,助您提高企业竞争力。
了解更多信息,详情请参见基于AIACC加速器快速实现Stable Diffusion生成特定物体图片。
前提条件
云起实验室将在您的账号下开通本次实操资源,资源按量付费,需要您自行承担本次实操的云资源费用。
本实验预计两个小时产生费用20元,其中0.8元/G公网流量。如果您调整了资源规格、使用时长,或执行了本方案以外的操作,可能导致费用发生变化,请以控制台显示的实际价格和最终账单为准。
进入实操前,请确保阿里云账号满足以下条件:
创建专有网络VPC和交换机
在实验室页面右侧的操作区中,勾选我已阅读并同意《阿里云云起实践平台服务协议》,单击开始实操。
前往专有网络管理控制台。
在左侧导航栏中,单击专有网络。

在专有网络页⾯,单击创建专有网络。

在创建专有网络页⾯,根据下方参数说明配置1个专有网络(VPC)和1台交换机,然后单击确定。更多关于创建专有网络和交换机信息,详情请参见创建和管理专有网络。
配置项
说明
专有网络
地域
本实验以华东1(杭州)为例。
名称
自定义名称。
IPv4网段
选择手动输入IPv4地址段。
输入IPv4网段
输入IPv4网段,建议您使用RFC私网地址作为专有网络的网段如
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。交换机
名称
自定义名称。
可用区
选择杭州可用区J。
IPv4网段
使用默认的IPv4网段即可。


在创建专有网络页面,您可查看到创建的专有网络VPC和交换机的ID、实例名称等信息。

创建ECS实例
前往实例创建页。
在云服务器购买页面,参考如下说明配置参数,未提及的配置保持默认或按需修改,然后选中右侧的我已阅读并同意云服务器(按量付费)专属条款、镜像商品使用条款,单击确认下单。
参数
示例
付费类型
选择按量付费。
地域
本实验以华东1(杭州)为例。
网络及可用区
选择您创建的专有网络和交换机。
实例
选择ecs.gn7i-c8g1.2xlarge(单卡NVIDIA A10)。
镜像
使用云市场镜像,名称为aiacc-train-solution,您可以直接通过名称搜索该镜像,选择最新版本即可。
公网IP
开启分配公网IPv4地址。
带宽计费模式
选择按使用流量。
本教程以按使用流量为例,您可根据实际情况选择按固定带宽或按使用流量。
带宽峰值
带宽峰值设置为100 Mbps。以加快模型下载速度。
安全组
选择新建安全组。
安全组类型
选择普通安全组
开通IPv4端口/协议
保持默认即可。
登录凭证
为当前ECS实例设置登录密码,选择自定义密码。
登录密码
自定义设置登录密码。
确认密码
再次输入登录密码。




在ECS实例创建页面,选中服务协议,单击确认下单。

在创建成功对话框中,单击管理控制台。

在实例页面,等待状态变为运行中后,即可使用该云服务器ECS。

添加安全组规则。
在ECS实例安全组的入方向添加安全组规则并放行7860端口。
在实例页面,单击实例ID。

在实例详情页签,单击安全组。

在安全组页签,单击安全组ID。

在访问规则区域的入方向中,添加7860端口,单击保存,开放该端口后可以访问WebUI。
重要添加端口时,授权对象建议选择您的本机IP地址。
配置模型
前往云服务器ECS控制台。
在左侧导航栏中,选择。

在实例页面,找到目标ECS实例,单击其右侧操作列下的远程连接。

在远程连接对话框中,单击通过Workbench远程连接区域下的立即登录。

在登录实例对话框中,输入用户自定义密码,单击确定。

返回如下页面,表示已成功远程连接云服务器ECS。

下载1.0.13版本sd_dreambooth_extension项目代码到
/root/stable-diffusion-webui/extensions目录。单击tags。

在Tags页签,单击1.0.13版本的tar.gz,下载1.0.13版本sd_dreambooth_extension项目代码至本地。

返回至ECS终端页签,在顶部菜单栏左上角处,选择 。

在文件列表中,进入
/root/stable-diffusion-webui/extensions目录,然后在列表上方单击上传文件。
选择sd_dreambooth_extension-1.0.13.tar.gz文件并上传。
弹出如下上传成功提示框时,表示上传完成。

关闭新文件管理页签。

执行以下命令,进入
/root/stable-diffusion-webui/extensions目录,解压sd_dreambooth_extension-main.tar.gz文件并将文件名改为sd_dreambooth_extension。cd /root/stable-diffusion-webui/extensions tar -zxvf sd_dreambooth_extension-1.0.13.tar.gz mv sd_dreambooth_extension-1.0.13 sd_dreambooth_extension
依次执行以下命令,下载文件。
wget https://aiacc-training.oss-cn-hangzhou.aliyuncs.com/sd_utils/train_dreambooth.py -O /root/stable-diffusion-webui/extensions/sd_dreambooth_extension/dreambooth/train_dreambooth.py wget https://aiacc-training.oss-cn-hangzhou.aliyuncs.com/sd_utils/utils.py -O /root/stable-diffusion-webui/extensions/sd_dreambooth_extension/dreambooth/utils/utils.py wget https://aiacc-training.oss-cn-hangzhou.aliyuncs.com/sd_utils/image_utils.py -O /root/stable-diffusion-webui/extensions/sd_dreambooth_extension/dreambooth/utils/image_utils.py wget https://aiacc-training.oss-cn-hangzhou.aliyuncs.com/sd_utils/log_parser.py -O /root/stable-diffusion-webui/extensions/sd_dreambooth_extension/helpers/log_parser.py
启动并访问WebUI服务
依次执行以下命令,启动WebUI服务。
重要WebUI服务启动后请不要关闭,否则无法访问WebUI页面。
cd /root/stable-diffusion-webui export HF_ENDPOINT=https://hf-mirror.com source /root/stable-diffusion-webui/venv/bin/activate python ./launch.py --listen --port 7860 --enable-insecure-extension-access --disable-safe-unpickle --xformersWebUI服务成功启动后,回显信息类似如下所示。

在本地机器的浏览器地址栏中,输入
http://<ECS实例公网IP地址>:7860,访问WebUI。说明您可在云服务器ECS控制台的实例页面查看目标ECS实例公网IP。

模型微调(Finetune)
仅使用预训练的权重的模型,只能生成预训练数据集相似的图片。若您希望生成自定义的图片,可以通过Finetune自定义物体图片,使得模型生成所对应物体的图片。
创建模型权重。
单击DreamBooth页签,在Model区域,单击Create。

在Model区域,输入待生成的模型权重名称,例如:
aliyun_example,并选择创建模型权重的来源v1-5-pruned-emaonly.safetensors [6ce0161689])。
在Model区域,单击Create Model,创建模型权重。

等待模型权重创建完成后,在Output区域会显示
Checkpoint successfully extracted to models/dreambooth/aliyun_example/working。
设置训练参数。
在Model区域,单击Select,选择生成的模型权重
aliyun_example。
选择Input区域,在Settings页签下,选中Use LORA,并调整训练参数。
Training Steps Per Image (Epochs):指训练的迭代次数。默认为100,可根据实际需要调整。
Batch Size:训练数据的大小。默认为1,一般设置为1或2。
如果您希望Finetune流程更快,可将Save Model Frequency (Epochs)和Save Preview(s) Frequency (Epochs)参数值调大(如果设置的值较小,可能会导致Finetune时间较长且不稳定),不超过最大的Epochs数即可,最大的Epochs数=每张图片训练迭代次数Epochs*图片数量N。关于性能提升的更多信息,请参见Aiacc-training性能提升。

滚动鼠标将页面下拉,取消选中Gradient Checkpointing。

在Optimizer中选择Torch AdamW,Mixed Precision选择fp16或者no,Memory Attention选择xformers或者no,当Mixed Precision选择fp16时,才能选择xformers。

选择训练数据集。
在Input区域的Concepts页签下,在Dataset DIrectory中填入云服务器ECS中的数据集路径。
您可以将10张以内同一物体的图片上传到指定路径。
本实验中上传图片的路径为
/root/stable-diffusion-webui/test_imgs。
在Training Prompts和Sample Prompts区域,配置以下参数。
Instance Prompt:输入对数据集物体的描述,格式例如:a <物体名称> <物体类别>。本实验输入
a yunxiaobao doll。Class Prompt:输入数据集物体的类别,格式例如:a <物体类别>,本实验输入
a doll。Sample Image Prompt:输入和Instance Prompt参数一致的内容。本实验输入
a yunxiaobao doll。

单击Train,在弹出的对话框中单击确定。
训练大约需要3分钟,请您耐心等待。训练完成后,在Output区域显示类似如下图片。
说明训练时间和实例规格、带宽峰值及其相关配置有关,这里的训练时间仅供参考。

生成图片
Finetune完成后,您可以通过以下方法生成图片。
一、使用Dreambooth生成图片
Finetune完成后,可以通过一些文字生成特定物体的图像。
单击Stable DIffusion checkpoint中的
按钮,从下拉框中选择之前Finetune好的模型权重。例如:aliyun_example/aliyun_example_400_lora.safetensors [5b28fda46c]。单击txt2img,在Prompt框中输入之前Finetune使用的Instance Prompt的内容。例如:
a yunxiaobao doll。在Batch count后输入生成图片的数量,默认为1。
单击右侧的Generate,即可生成对应的物体图片。

单击Save,保存图片。
您也可以单击Zip,压缩后保存图片,然后单击Download下载图片。

如果您选择Finetune前的模型权重v1-5-pruned-emaonly.safetensors [6ce0161689],生成的图片类似如下图所示。

用于Finetune的原图片如下图所示,可见Finetune后的模型能够很好地生成所需图片,而Finetune前的模型则无法生成所需要的云小宝玩偶图片。

二、使用Dreambooth+新的prompt生成图片
使用Dreambooth生成图片后,您可以通过修改Prompt可以对特定的物体添加不同的装饰和背景。例如:将a yunxiaobao doll改成a yunxiaobao doll wearing a red hat,可以生成戴着红帽子的云小宝玩偶。
单击txt2img,在Prompt框中输入
a yunxiaobao doll wearing a red hat。单击右侧的Generate,即可生成类似下图的图片。

三、使用DreamBooth+ControlNet生成图片
使用Dreambooth生成图片后,您可以使用ControlNet生成特定姿态的图片。ControlNet通过Prompt+ControlNet Condition生成该Condition下特定姿态的图片。本示例通过ControlNet可以生成特定姿态的云小宝,操作步骤如下:
在txt2img页签下,单击ControlNet,然后上传希望生成的姿态的图片。
选中Enable,单击
按钮,在Preprocessor下拉选项中选择Openpose。在Model下拉选项中,选择control_sd15_openpose。
根据Condition的不同,Preprocessor和Model的选择也不同,Openpose相关选项用于姿态的调整,其余设置与Dreambooth中的设置相同。
单击Generate,即可生成对应姿态的云小宝玩偶图片。

(可选)Aiacc-training性能提升
本实验以ECS实例的规格为ecs.gn7i-c32g1.32xlarge(4卡A10),Finetune4张图片,Training Steps Per Image(Epochs)设置为200为例,使用eager和AIACC-AGSpeed训练时间对比如下所示:
eager(原生训练方式)

AIACC-AGSpeed

从上图可以看出,加入AIACC-AGSpeed后,将Save Model Frequency (Epochs)和Save Preview(s) Frequency (Epochs)设置为1000,以减少保存文件的时间对整体时间统计的影响,训练性能提升大约18%。如果您想要获取极致的加速性能,可在WebUI页面修改以下参数值:
Training Steps Per Image (Epochs):默认值为100,可修改为150或200。
Save Model Frequency (Epochs):默认值为25,可修改为1000。
Save Preview(s) Frequency (Epochs):默认值为5,可修改为1000。
清理及后续
在完成实验后,如果无需继续使用资源,请根据以下步骤,先删除相关资源后,再结束实操。
删除云服务器ECS。
进入云服务器ECS控制台。
在左侧导航栏中,选择。

在实例页面,找到目标ECS实例,选择其右侧操作列下的。

在释放对话框中,选择立即释放,单击下一步。

在释放对话框中,勾选我已知晓即将释放的资源与关联资源,并了解相关数据风险,单击确认。

删除安全组。
前往云服务器ECS控制台。
在左侧导航栏中,选择。

在安全组页面,找到目标安全组,单击其右侧操作列下的删除。

在删除安全组对话框中,单击确定。

删除VPC和交换机。
前往专有网络管理控制台。
在左侧导航栏中,单击交换机。

在单击交换机右侧的删除按钮。

在弹出的删除交换机对话框中,单击确定。

在左侧导航栏中,单击专有网络。

单击VPC右侧删除按钮。

在删除专有网络对话框中,单击确定。

删除相关资源后,选择不保留资源,单击结束实操。在结束实操对话框中,单击确定。

在完成实验后,如果需要继续使用资源,选择付费保留资源,单击结束实操。在结束实操对话框中,单击确定。请随时关注账户扣费情况,避免发生欠费。



































按钮,从下拉框中选择之前Finetune好的模型权重。例如:


按钮,在Preprocessor下拉选项中选择Openpose。















