文档

Stable Diffusion AIACC加速版部署文档

更新时间:
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

Stable Diffusion可以通过使用文字生成图片,在整个pipeline中,包含CLIP或其他模型从文字中提取隐变量;通过使用UNET或其他生成器模型进行图片生成。通过逐步扩散(Diffusion),逐步处理图像,使得图像的生成质量更高。通过本文,客户可以搭建一个stable diffusion的webui框架,并使用aiacctorch加速图片生成速度。在512x512分辨率下,AIACC加速能将推理时间从1.91s降低至0.88s,性能提升至2.17倍,同时AIACC支持任意多LORA权重加载,且不影响性能。

功能概述

aiacctorch支持优化基于Torch框架搭建的模型,通过对模型的计算图进行切割,执行层间融合,以及高性能OP实现,大幅度提升PyTorch的推理性能。您无需指定精度和输入尺寸,即可通过JIT编译的方式对PyTorch框架下的深度学习模型进行推理优化。更多信息,请参见手动安装AIACC-Inference(AIACC推理加速)Torch版1.png

计算巢实例创建

创建实例

  1. 单击Stable diffusion DeepGPU(AIACC)加速社区版,进入服务实例创建页面。

  2. 在创建服务实例界面,配置服务实例信息。

    1. 选择服务实例所需版本。

      可选单机版或多集群版。2.png

    2. 选择服务实例部署地域和付费方式。3.png

    3. 选择ECS实例类型并设置实例密码。4.png

    4. 设置登录信息,填写软件登录的用户名和密码。

      重要

      用户名和密码在后续登录软件时使用,请妥善保存。

      5.png

  3. 单击下一步:确认订单

  4. 在确认界面,勾选我已阅读并同意《计算巢服务协议》,然后单击立即创建

    稍等片刻,等待服务实例部署完成。6.png

图片生成测试

登录软件

  1. 完成服务实例创建后,可单击创建的服务实例名称,进入服务实例详情页。

  2. 在概览页签中,单击Endpoint后的网址,进入登录页面。7.png

  3. 在登录界面的弹窗中,输入创建服务实设置的软件登录用户名和密码。8.png

测试软件

  1. 输入登录用户名和密码,进入测试页面。9.png

  2. 在界面的提示词处,输入文字内容,然后单击生成/Generate,即可生成图片。

    重要

    由于taiyi中文模型很久没有更新,不适配webui1.6以上版本,因此将其移除。

    输入内容示例如下:

    city made out of glass : : close shot : : 3 5 mm, realism, octane render, 8 k, exploration, cinematic, trending on artstation, realistic, 3 5 mm camera, unreal engine, hyper detailed, photo - realistic maximum detail, volumetric light, moody cinematic epic concept art, realistic matte painting, hyper photorealistic, concept art, volumetric light, cinematic epic, octane render, 8 k, corona render, movie concept art, octane render, 8 k, corona render, cinematic, trending on artstation, movie concept art, cinematic composition, ultra - detailed, realistic, hyper - realistic, volumetric lighting, 8 k

    生成图片:10.png

    此处我们使用了aiacctorch加速了模型,可以看到单张图片推理时间为0.88s

    重要

    首次应用aiacctorch进行图片生成,或者切换模型后的首次图片生成,会多占用10s时间,以进行aiacctorch模型加载。

切换模型

在测试镜像中,我们预装了7个模型:

  • 512-base-ema.safetensors:512x512 Stable Diffusion 2.0模型

  • 768-v-ema.safetensors:768x768 Stable Diffusion 2.0模型

  • openjourneyV4.ckpt:openjourney模型

  • sd_xl_base_1.0_0.9vae.safetensors:SDXL base模型

  • sd_xl_refiner_1.0_0.9vae.safetensors:SDXL refiner模型

  • v1-5-pruned-emaonly.safetensors:Stable Diffusion 1.5模型

  • v2-1_768-ema-pruned-fp16.safetensors:Stable Diffusion 2.1模型

  1. 我们可以根据输入文字以及生成图片风格,切换模型进行模型推理。此处我们通过左上方的选项卡,选择512-base-ema.safetensors模型。11.png

  2. 输入如下提示词,然后单击生成/Generate,生成图像。

    city made out of glass : : close shot : : 3 5 mm, realism, octane render, 8 k, exploration, cinematic, trending on artstation, realistic, 3 5 mm camera, unreal engine, hyper detailed, photo - realistic maximum detail, volumetric light, moody cinematic epic concept art, realistic matte painting, hyper photorealistic, concept art, volumetric light, cinematic epic, octane render, 8 k, corona render, movie concept art, octane render, 8 k, corona render, cinematic, trending on artstation, movie concept art, cinematic composition, ultra - detailed, realistic, hyper - realistic, volumetric lighting, 8 k

    12.png

LORA功能试用

aiacctorch支持LORA加速,可以在提示词中加入LORA支持文本:<lora:iuV35.uv1P:1>13.png

从上图中可见,在aiacctorch加速优化下,LORA加载后性能与加载前相同。

Controlnet功能试用

Controlnet可以帮助我们生成与原始图相似风格或相似布局的图片,这里以canny为例介绍controlnet功能。

  1. 打开Controlnet选项卡,选择controlTypeCanny,并上传一张图片。此处以LENA图为例,进行设置。14.png

  2. 单击生成/Generate,生成图像。15.png

    从上图中可见性能为1.27s。

禁用AIACC加速

我们也可以在settings中禁用aiacctorch。

  1. 点击settings选项卡,选中aiacctorch,去勾选Apply Aiacctorch in Unet to speedup the whole network inference when loading models,然后单击应用设置/Apply settings16.png

  2. 在计算巢控制台服务实例的运维管理页签中,单击重启服务。等待服务重启即可。17.png

推理性能数据汇总

以下是在A10上使用webUI测得到的AIACC同pytorch的性能比例。

说明

以下数据为关闭了生成图输出到文件的过程时间。

18.png

模型finetune

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

  1. 安装sd_dreambooth_extension。

    1. 登录服务实例详情页,单击资源页签,然后单击远程连接19.png

    2. 在弹窗中开启会话管理,并单击免密登录20.png

    3. 进入终端并切换成root用户。

      sudo su
    4. 下载如下Git链接,并将该项目放到路径/root/stable-diffusion-webui/extensions中。

      若git clone速度较慢,可使用代理,使用代理时需将Git链接改成:https://github.com/d8ahazard/sd_dreambooth_extension.git。

      警告

      阿里云不对您在镜像上使用的第三方模型的合法性、安全性、准确性进行任何保证,并不对由此引发的任何损害承担责任;您应自觉遵守在镜像上安装的第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

    5. 安装完成后,/root/stable-diffusion-webui/extensions文件夹下包含sd_dreambooth_extension文件夹,然后执行如下命令:

      pip install tensorflow
      wget https://aiacc-training.oss-cn-hangzhou.aliyuncs.com/yaoxing/train_dreambooth.py -O /root/stable-diffusion-webui/extensions/sd_dreambooth_extension/dreambooth/train_dreambooth.py
      wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/sd_utils/utils.py -O /root/stable-diffusion-webui/extensions/sd_dreambooth_extension/dreambooth/utils/utils.py
      wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/sd_utils/image_utils.py -O /root/stable-diffusion-webui/extensions/sd_dreambooth_extension/dreambooth/utils/image_utils.py
      wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/sd_utils/log_parser.py -O /root/stable-diffusion-webui/extensions/sd_dreambooth_extension/helpers/log_parser.py
      wget https://aiacc-training.oss-cn-hangzhou.aliyuncs.com/yaoxing/compiler.py -O /workspace/miniconda/lib/python3.10/site-packages/triton/compiler.py
    6. 执行完命令后,按照登录软件的步骤登录页面,并选择扩展插件按钮对插件进行调整(若未发现sd_dreambooth_extension插件可点击重启用户界面的按钮)。将sd_dreamboooth_extension插件勾选,并取消LoRA/Lora插件勾选(sd_dreamboooth_extension中自带lora)。

      训练完成后,进行推理时需要设置回原来的配置(即取消sd_dreamboooth_extension插件勾选,并勾选LoRA/Lora插件)。21.png

    7. 在终端输入命令重启服务然后重新单击endpoint进入服务。

      • systemctl stop sdwebui

      • systemctl start sdwebui

    8. 上述步骤完成后,此时若界面中出现Dreambooth选项,则说明安装成功。22.png

  2. 单击DreamBooth按钮进入Dreambooth finetune界面,然后单击Create按钮进入模型创建界面,并输入待生成的模型权重名称和生成权重的来源(已经预先准备了一个权重v1-5-pruned-emaonly.safetensors [6ce0161689]),然后单击Create按钮生成模型权重。23.png

  3. 生成模型权重后,点击Select按钮,选择之前生成的模型权重。然后在Input页签中单击Settings按钮进行训练参数选择,勾选Use LORA按钮,并调整训练的迭代次数epoch(默认为100,可根据实际需要调整)和训练数据的batch size(一般设为1或2)。

    若希望finetune流程快一些,可将Save Model Frequency (Epochs)和“Save Preview(s) Frequency (Epochs)”选项调大(如果设置的值较小会导致finetune时间较长并且不稳定),不超过最大的epoch数(=迭代次数epoch x 图片数量N)即可。24.png

  4. 在页面的下部分中,取消Gradient Checkpointing的勾选,并在Optimizer中选择AdamW,然后在Mixed Precision处选择fp16或者no,Memory Attention选择xformers或者no(当Precision选fp16时才能选择xformers)。25.png

  5. 之后点击Concepts按钮,进入训练数据集选择。在Dataset DIrectory中填入ECS服务器中的数据集路径(需要将数据集提前上传至服务器当中,同一物体的图片即可,也可以下载https://ghproxy.com/https://github.com/google/dreambooth.git中的图片进行试用),Instance Prompt中填入对数据集物体的描述(输入可以简单设为“a <物体名称> <物体类别>”,如云小宝公仔的Instance Prompt为“a yunxiaobao doll”),并在Class Prompt中填入数据集物体的类别(输入可以简单设为“a <物体类别>”,如云小宝公仔的Class Prompt为“a doll”),在Sample Image Prompt中填入和Instance Prompt一致的内容。26.png

  6. 填完上述信息后,点击Train按钮对我们的数据集进行Finetune(第一次运行可能会出现数据集路径错误的提示,重跑一次即可),训练完成后会在Output界面显示如下信息。

    27.png

图片生成

  1. Dreambooth

    finetune完成后,可以通过一些文字生成特定物体的图像(下文流程与第二节推理流程一致)。首先需要取消sd_dreamboooth_extension插件勾选,并勾选LoRA/Lora插件,然后单击重启按钮。然后输入命令重启服务。

    • systemctl stop sdwebui

    • systemctl start sdwebui

    28.png

    单击Stable DIffusion checkpoint中的刷新按钮,然后从Stable DIffusion checkpoint中的下拉框中选择之前finetune好的模型权重,并点击txt2img按钮,在Prompt框中输入之前finetune使用的Instance Prompt的内容,然后点击右侧的Generate按钮,即可生成对应的物体图片。3.png

    若选择finetune前的权重,生成的图片如下。30.png

    用于finetune的原图片如下图所示。

    可见finetune后的模型能够很好地生成所需图片,而finetune前的模型则无法生成所需要的云小宝玩偶图片。31.png

  2. Dreambooth + 新的prompt

    通过修改Prompt可以对特定的物体添加不同的装饰和背景。例如,将“a yunxiaobao doll”改成“a yunxiaobao doll wearing a red hat”,可以生成戴着红帽子的云小宝玩偶。32.png

性能提升

性能配置如下:

ecs.gn7i-c32g1.32xlarge 4卡A10 + 4pictures + 200epoch

eager性能如下:33.png

agspeed性能如下:34.png

对比可知,加入AIACC-AGSpeed后,在A10上finetune4张图片,200epoch,并且将“Save Model Frequency (Epochs)”选项和“Save Preview(s) Frequency (Epochs)”设置成1000以减少文件保存对时间统计的影响,训练性能提升了18%(e2e的时间提效果没有训练时间显著是由于e2e除了训练流程外还有其他的流程,同时agspeed刚开始编译需要消耗一定的时间)。如果想要获取极致的加速性能,可在webui界面处将“Training Steps Per Image (Epochs)”选项调大一些(默认100,可调成200或更高)。 “Save Model Frequency (Epochs)”选项和“Save Preview(s) Frequency (Epochs)”选项设置。35.png

F&Q

如何重启服务?

  • 可使用如下命令停止服务。

    systemctl stop sdwebui 
  • 可使用如下命令打开服务。

    systemctl start sdwebui

如何查看日志?

可使用如下命令查看日志。

cat /var/log/sdwebui.log

出现:AttributeError: 'NoneType' object has no attribute 'loaded_loras'如何解决?

若使用dreambooth库,则会导致内置的lora模块失效,则会出现如下问题。36.png

需要解决这个问题,需先关闭sd_dreambooth_extension。

37.png

然后应用并重启界面后重启服务。

systemctl stop sdwebui
systemctl start sdwebui

如何设置服务进程退出后自动重启?

修改/lib/systemd/system/sdwebui.service,将Restart设置成always,则服务进程异常退出后会立刻重启。

38.png

如何预编译模型?

  • aiacctorch通过编译优化的方式进行模型加速。当切换模型时,aiacctorch也会同步编译模型。如果我们希望将已有的模型全部进行编译,则可以通过webui的切换模型的API进行。

  • 请注意,切换模型时请确保webui已经打开,由于webui是单进程模式,单个机器请执行单个切换模型的操作。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed May 24 11:13:15 2023

@author: lyuniqi
"""

import requests
import random
import base64

ip_address = "http://localhost:5001"


url_option = ip_address + "/sdapi/v1/options"
url_sd_models = ip_address + "/sdapi/v1/sd-models"
url_txt2img = ip_address + "/sdapi/v1/txt2img"

models = [x['title'] for x in requests.get(url_sd_models).json()]

def change_option(model_name):
    print(f"change to {model_name}")
    option = {"sd_model_checkpoint":model_name}
    requests.post(url_option, json=option)

for model in models:
    change_option(model)

如何保存预编译模型?

预编译模型放置在~/.cache/aiacctorch/eng_models/当中,如果需要将预编译模型放置在其他位置,则可使用软链接的方式进行。例如将预编译模型放置在/root/prebuild_models。

#新建文件夹
mkdir -p /root/prebuild_models
#移动目录
mv ~/.cache/aiacctorch/* /root/prebuild_models
#创建软链接
rm  ~/.cache/aiacctorch/ && ln -s /root/prebuild_models ~/.cache/aiacctorch/
  • 本页导读 (0)