通过GPU云服务器快速生成特定物体图片

更新时间:
复制为 MD 格式

本实验介绍如何使用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公网流量。如果您调整了资源规格、使用时长,或执行了本方案以外的操作,可能导致费用发生变化,请以控制台显示的实际价格和最终账单为准。

进入实操前,请确保阿里云账号满足以下条件:

  • 已通过实名认证并且账户余额大于100。

  • 云资源产生的费用需您自行承担,云起实验室不会向您征收额外费用。

  • 所有实验操作将保留至您的账号,请谨慎操作。

  • 实操结束后,您可以选择继续付费保留资源,或参考手册自动/手动释放资源。

创建专有网络VPC和交换机

  1. 在实验室页面右侧的操作区中,我已阅读并同意《阿里云云起实践平台服务协议》,单击开始实操

  2. 前往专有网络管理控制台

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

    image

  4. 专有网络页⾯,单击创建专有网络

    image

  5. 创建专有网络页⾯,根据下方参数说明配置1个专有网络(VPC)和1台交换机,然后单击确定。更多关于创建专有网络和交换机信息,详情请参见创建和管理专有网络

    配置项

    说明

    专有网络

    地域

    本实验以华东1(杭州)为例。

    名称

    自定义名称。

    IPv4网段

    选择手动输入IPv4地址段

    输入IPv4网段

    输入IPv4网段,建议您使用RFC私网地址作为专有网络的网段如10.0.0.0/8172.16.0.0/12192.168.0.0/16

    交换机

    名称

    自定义名称。

    可用区

    选择杭州可用区J。

    IPv4网段

    使用默认的IPv4网段即可。

    Image 21.png

    Image 23.png

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

    Image 24.png

创建ECS实例

  1. 前往实例创建页

  2. 在云服务器购买页面,参考如下说明配置参数,未提及的配置保持默认或按需修改,然后选中右侧的我已阅读并同意云服务器(按量付费)专属条款、镜像商品使用条款,单击确认下单

    参数

    示例

    付费类型

    选择按量付费

    地域

    本实验以华东1(杭州)为例。

    网络及可用区

    选择您创建的专有网络和交换机。

    实例

    选择ecs.gn7i-c8g1.2xlarge(单卡NVIDIA A10)。

    镜像

    使用云市场镜像,名称为aiacc-train-solution,您可以直接通过名称搜索该镜像,选择最新版本即可。

    公网IP

    开启分配公网IPv4地址

    带宽计费模式

    选择按使用流量

    本教程以按使用流量为例,您可根据实际情况选择按固定带宽或按使用流量。

    带宽峰值

    带宽峰值设置为100 Mbps。以加快模型下载速度。

    安全组

    选择新建安全组

    安全组类型

    选择普通安全组

    开通IPv4端口/协议

    保持默认即可。

    登录凭证

    为当前ECS实例设置登录密码,选择自定义密码

    登录密码

    自定义设置登录密码。

    确认密码

    再次输入登录密码。

    image

    image

    image

    image

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

    image

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

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

    image

  6. 添加安全组规则。

    ECS实例安全组的入方向添加安全组规则并放行7860端口。

    1. 实例页面,单击实例ID

      image

    2. 实例详情页签,单击安全组

      image

    3. 安全组页签,单击安全组ID

      image

    4. 访问规则区域的入方向中,添加7860端口,单击保存开放该端口后可以访问WebUI。

      重要

      添加端口时,授权对象建议选择您的本机IP地址

      image

配置模型

  1. 前往云服务器ECS控制台

  2. 在左侧导航栏中,选择实例与镜像 > 实例

    image

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

    image

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

    image

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

    image

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

    image

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

    1. 访问sd_dreambooth_extension

    2. 单击tags

      image

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

      image

    4. 返回至ECS终端页签,在顶部菜单栏左上角处,选择文件 > 打开新文件管理

      image

    5. 在文件列表中,进入/root/stable-diffusion-webui/extensions目录,然后在列表上方单击上传文件

      image

    6. 选择sd_dreambooth_extension-1.0.13.tar.gz文件并上传。

      弹出如下上传成功提示框时,表示上传完成。

      image

    7. 关闭新文件管理页签。

      image

    8. 执行以下命令,进入/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
  1. 依次执行以下命令,下载文件。

    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服务

  1. 依次执行以下命令,启动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 --xformers

    WebUI服务成功启动后,回显信息类似如下所示。

    image

  1. 在本地机器的浏览器地址栏中,输入http://<ECS实例公网IP地址>:7860,访问WebUI。

    说明

    您可在云服务器ECS控制台的实例页面查看目标ECS实例公网IP。

    image

模型微调(Finetune)

仅使用预训练的权重的模型,只能生成预训练数据集相似的图片。若您希望生成自定义的图片,可以通过Finetune自定义物体图片,使得模型生成所对应物体的图片。

  1. 创建模型权重。

    1. 单击DreamBooth页签,在Model区域,单击Create

      image

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

      image

    3. Model区域,单击Create Model,创建模型权重。

      image

      等待模型权重创建完成后,在Output区域会显示Checkpoint successfully extracted to models/dreambooth/aliyun_example/working

      image

  2. 设置训练参数。

    1. Model区域,单击Select,选择生成的模型权重aliyun_example

      image

    2. 选择Input区域,在Settings页签下,选中Use LORA,并调整训练参数。

      • Training Steps Per Image (Epochs):指训练的迭代次数。默认为100,可根据实际需要调整。

      • Batch Size:训练数据的大小。默认为1,一般设置为12。

      如果您希望Finetune流程更快,可将Save Model Frequency (Epochs)Save Preview(s) Frequency (Epochs)参数值调大(如果设置的值较小,可能会导致Finetune时间较长且不稳定),不超过最大的Epochs数即可,最大的Epochs数=每张图片训练迭代次数Epochs*图片数量N。关于性能提升的更多信息,请参见Aiacc-training性能提升

      image

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

      image

    4. Optimizer中选择Torch AdamWMixed Precision选择fp16或者noMemory Attention选择xformers或者no,当Mixed Precision选择fp16时,才能选择xformers

      image

  3. 选择训练数据集。

    1. Input区域的Concepts页签下,在Dataset DIrectory中填入云服务器ECS中的数据集路径。

      您可以将10张以内同一物体的图片上传到指定路径。

      本实验中上传图片的路径为/root/stable-diffusion-webui/test_imgs

      image

    2. Training PromptsSample Prompts区域,配置以下参数。

      • Instance Prompt:输入对数据集物体的描述,格式例如:a <物体名称> <物体类别>。本实验输入a yunxiaobao doll

      • Class Prompt:输入数据集物体的类别,格式例如:a <物体类别>,本实验输入a doll

      • Sample Image Prompt:输入和Instance Prompt参数一致的内容。本实验输入a yunxiaobao doll

      image

  4. 单击Train,在弹出的对话框中单击确定

    训练大约需要3分钟,请您耐心等待。训练完成后,在Output区域显示类似如下图片。

    说明

    训练时间和实例规格、带宽峰值及其相关配置有关,这里的训练时间仅供参考。

    image

生成图片

Finetune完成后,您可以通过以下方法生成图片。

一、使用Dreambooth生成图片

Finetune完成后,可以通过一些文字生成特定物体的图像。

  1. 单击Stable DIffusion checkpoint中的按钮,从下拉框中选择之前Finetune好的模型权重。例如:aliyun_example/aliyun_example_400_lora.safetensors [5b28fda46c]

  2. 单击txt2img,在Prompt框中输入之前Finetune使用的Instance Prompt的内容。例如:a yunxiaobao doll

  3. Batch count后输入生成图片的数量,默认为1。

  4. 单击右侧的Generate,即可生成对应的物体图片。

    image

  5. 单击Save,保存图片。

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

    image

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

image

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

image

二、使用Dreambooth+新的prompt生成图片

使用Dreambooth生成图片后,您可以通过修改Prompt可以对特定的物体添加不同的装饰和背景。例如:将a yunxiaobao doll改成a yunxiaobao doll wearing a red hat,可以生成戴着红帽子的云小宝玩偶。

  1. 单击txt2img,在Prompt框中输入a yunxiaobao doll wearing a red hat

  2. 单击右侧的Generate,即可生成类似下图的图片。

    image

三、使用DreamBooth+ControlNet生成图片

使用Dreambooth生成图片后,您可以使用ControlNet生成特定姿态的图片。ControlNet通过Prompt+ControlNet Condition生成该Condition下特定姿态的图片。本示例通过ControlNet可以生成特定姿态的云小宝,操作步骤如下:

  1. txt2img页签下,单击ControlNet,然后上传希望生成的姿态的图片。

  2. 选中Enable,单击按钮,在Preprocessor下拉选项中选择Openpose

  3. Model下拉选项中,选择control_sd15_openpose

    根据Condition的不同,PreprocessorModel的选择也不同,Openpose相关选项用于姿态的调整,其余设置与Dreambooth中的设置相同。

  4. 单击Generate,即可生成对应姿态的云小宝玩偶图片。

    image

(可选)Aiacc-training性能提升

本实验以ECS实例的规格为ecs.gn7i-c32g1.32xlarge(4A10),Finetune4张图片,Training Steps Per Image(Epochs)设置为200为例,使用eagerAIACC-AGSpeed训练时间对比如下所示:

  • eager(原生训练方式)

  • AIACC-AGSpeed

从上图可以看出,加入AIACC-AGSpeed后,将Save Model Frequency (Epochs)和Save Preview(s) Frequency (Epochs)设置为1000,以减少保存文件的时间对整体时间统计的影响,训练性能提升大约18%。如果您想要获取极致的加速性能,可在WebUI页面修改以下参数值:

  • Training Steps Per Image (Epochs):默认值为100,可修改为150200。

  • Save Model Frequency (Epochs):默认值为25,可修改为1000。

  • Save Preview(s) Frequency (Epochs):默认值为5,可修改为1000。

清理及后续

  • 在完成实验后,如果无需继续使用资源,请根据以下步骤,先删除相关资源后,再结束实操。

    • 删除云服务器ECS。

      1. 进入云服务器ECS控制台

      2. 在左侧导航栏中,选择实例与镜像 > 实例

        image

      3. 实例页面,找到目标ECS实例,选择其右侧操作列下的image图标 > 实例状态 > 释放

        image

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

        image

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

    • 删除安全组。

      1. 前往云服务器ECS控制台

      2. 在左侧导航栏中,选择网络与安全 > 安全组

        image

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

        image

      4. 删除安全组对话框中,单击确定

        image

    • 删除VPC和交换机。

      1. 前往专有网络管理控制台

      2. 在左侧导航栏中,单击交换机

        image

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

        image

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

        image

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

        image

      6. 单击VPC右侧删除按钮。

        image

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

        image

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

      image

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

    image