技术分享 | 如何基于阿里云 AIACC 加速 Stable-Diffusion AI 绘画
2023 年 6 月 28 日,阿里云与智东西公开课联合出品的系列课程「阿里云弹性计算技术公开课」正式播出,当前系列课程共 7 节课,阿里云弹性计算高级开发工程师吕倪祺作为第二位课程主讲人,带来了主题为《基于神龙 AI 加速 AIACC 加速 Stable-Diffusion AI 绘画》的课程分享。
AIACC 是基于阿里云 IaaS 资源推出的神龙 AI 性能加速套件,用于优化基于 AI 主流计算框架搭建的模型,能显著提升训练和推理性能。AIACC 神龙 AI 推理加速套件由 AIACC-Torch(Pytorch 推理加速引擎)、AIACC-MLIR(MLIR 推理加速引擎)、AIACC-HRT(AIACC 算子深度加速引擎)等组件构成。AIACC 神龙 AI 性能加速套件能够为 Stable-Diffusion 提供加速优化支持,在 512x512 分辨率下,可将单张图片的延迟从 2 秒降低至 0.88 秒,吞吐提速至原来的 2.2 倍。
本篇文章根据吕倪祺的课程整理而成,供读者阅览。
大家好,我是来自阿里云弹性计算团队的吕倪祺,今天希望可以和大家一起体验如何使用阿里云计算巢平台去搭建一个包含 AIACC 神龙 AI 加速套件的 Stable-Diffusion 的部署环境,并进行测试使用。
一、基于计算巢搭建 Stable-Diffusion 开发环境
Stable-Diffusion 是目前 AIGC 在生图方向上集质量高、速度快、成本低等众多优点于一身的,可以说是目前 AI 生图领域的六边形战士,综合实力非常强大。通过使用 Diffusion Model(扩散模型),其在保证高分辨率创作图的同时,极大地降低了资源消耗量。同时在文生图、图生图等多个场景,都有不错的表现。
同时要强调的是:Stable-Diffusion 的模型和整体框架都是开源的,因此 Stable-Diffusion 可以发展成一个大型的开源社区。我们可以从 Civitai 上下载所需要的模型,然后从 Github 上去安装一些需要的插件,也可以嵌入自己的修改模型。这对于开发者或者进阶的使用者提供了更多的可能性。
由于此篇内容的分享主要是基于已经训练好的 Stable-Diffusion 模型来进行推理,因此接下来我将着重介绍 Stable-Diffusion 的推理流程。
以文生图场景为例,文字首先通过一个特殊的 Transformer 语言模型(Cli 模型),将文字进行编码,编码为 token embeddings 的向量。经过 Clip 后,我们就可以用 embeddings 去控制图片的生成,所谓的"DIffusion"过程也是指的这⼀部分。我们会从⼀个随机⽣成的隐变量开始,通过循序渐进的⽅式,逐步扩散,直⾄图⽚变为⼀个清晰的图⽚。
Image Information Creator 包含两部分,UNet 和 Scheduler。Unet 是⼀个噪声预测器,也就是我们⽹上下载到的模型的主要部分。通过将前⽂中的 embeddings 加⼊cross attention 层的计算,我们可以预测每⼀个 step 的噪声,并使这个噪声更贴合我们输⼊的⽂字。
Scheduler 在 Web UI 中也被称之为采样器,它控制了 unet 的输出结果的处理方式。⼀个好的 Scheduler 可以⽤更少的 step 数获得更好的效果。 通过若⼲次 Unet 和 Scheduler 的迭代,我们最终得到了⼀个⽆噪的隐变量。我们还需要将这个隐变量恢复成⼀个⾁眼可⻅的图⽚。这时就需要 Autoencoder 上线了,我们可以使⽤ Autoencoder 的 decoder 部分去解码这个隐变量,变成⼀个最终的图⽚。
神龙 AI 加速套件 AIACC 是基于阿里云 IaaS 资源推出的 AI 加速套件,用于优化基于 AI 主流计算框架搭建的模型,能显著提升训练和推理性能。当前 AIACC 推理引擎包含 AIACC-Torch(Pytorch 推理加速引擎)、AIACC-MLIR(MLIR 推理加速引擎)、AIACC-HRT(AIACC 算子深度加速引擎)几个组件。
AIACC-Torch(Pytorch 推理加速引擎)主要用于业界主流的 PyTorch 模型的推理加速引擎;AIACC-MLIR(MLIR 推理加速引擎)是基于 MLIR 用于优化 tensorflow 的加速引擎;AIACC-HRT(AIACC 算子深度加速引擎)是阿里云底层高性能的限制加速库。在 Stable-Diffusion 的场景中,我们使用了 AIACC-Torch 和 AIACC-HRT 两大组件进行了优化加速的支持。
上图左侧是 AIACC-Torch 的架构图,在使用 AIACC-Torch 时,首先会将原始的 PyTorch 模型训练成一个 Toy scribe 的模型,然后在 Toy scribe 的 AR 上进行一系列优化,包括图融合等,然后就可以得到一个更干净、更高效的一个图片。之后通过 PyTorch Operation Parser 自动将底层模型转化成 AIACC-HRT 模型,以提供一个极致的性能加速。加速后的模型会跟原始模型一样,可以通过 torch.jit.load 的方式进行加载。总体来讲,使用是比较方便的,而且支持动态的尺寸。
针对 Stable-Diffusion 这个场景中,我们使用了 AIACC-Torch 和 AIACC-HRT 这两大组件进行了优化加速支持。在 512×512 的分辨率下,我们将单图推理延迟从 1.88s 降低至 0.78s,吞吐提速至原有的 2.4 倍,相较 xformers 也可降低 44%的延迟,同时我们⽀持了 Lora 的性能⽆损加速,⽀持任意多的 Lora 权重加载,且不损失性能。⽽原始的 Web UI 性能会随着 Lora 权重的变多⽽下降。使用 controlnet 时,AIACC-Torch 可吞吐提升至原有的 2.37 倍,单张图片推理时间低至 1.28s。
如果有更多的除了 Stable-Diffusion 之外的模型的推理优化需求,可以参考如下通用文档:https://help.aliyun.com/document_detail/317822.html
阿里云计算巢是一个面向 ISV、SI 和 MSP(统称为服务商)的云集成 PaaS 平台,方便 ISV 服务商更好地将自身产品、服务和阿里云的产品集成,借助云原生的能力提升软件服务在交付、部署及后续管理等环节的效率和用户体验。最终用户可以通过计算巢管理其在阿里云上订阅的各类软件服务。计算巢为服务商和最终用户提供了一个云原生的服务交付平台和连接器,提供更高效、便捷、安全的软件服务和使用体验。
《Stable diffusion AIACC 加速社区版》现已作为推荐服务,上线计算巢。为了方便客户使用,推荐使用计算巢进行服务搭建。
接下来我介绍一下如何在计算巢上搭建 Stable-Diffusion 服务实例并访问实例。
第一步,创建实例。可以选择在计算巢的推荐服务栏目中,直接点击《Stable diffusion AIACC 加速社区版》的“正式创建”按钮开始创建,也可点击以下链接进行创建:https://computenest.console.aliyun.com/user/cn-hangzhou/serviceInstanceCreate
第二步,地域、付费方式及实例类型选择。可以根据自己的需要选择北京、上海、杭州等国内地域,或者日本、新加坡等海外地域部署 ECS 实例,建议选择按量付费使用,在不使用时,可以选择停机不收费的模式,以节省开支。
可预选实例均为单卡 A10 实例,规格为 ecs.gn7i-c16g1.4xlarge、ecs.gn7i-c32g1.8xlarge、ecs.gn7i-c48g1.12xlarge 三种,主要区别是 CPU 及内存大小的不同。当部署大量模型时,大规格实例可以减少由于内存不足导致的 OOM 问题,大家可以根据需求选择适合自己的实例进行部署。
第三步,密码及网络设置。实例密码用于 ECS 登录,当我们需要下载模型或检查系统运行状态时,我们可以使用此密码登录实例背后的 ECS 机器。而软件登录名及软件登录密码用于网页访问。由于创建的 ECS 将会暴露在公网上面,因此我们加入了 nginx 组件,进行网页鉴权,以避免网页被不明用户登录。此密码用于访问 stable-diffusion 网页客户端。
可用区配置则用于选择新创建的 ECS 所在的可用区。如有多机器部署需求,需要注意此选项,同一可用区内实例之间的网络延时更小。当希望将机器创建于已有 VPC 环境中时,可以关闭新建 VPC 选项,否则默认将新建 VPC。当两台 ECS 处于相同 VPC 时,内部网络可以互通,而新建的 VPC 的内部网络则会和其他 VPC 隔离。
第四步,配置完成后点击创建就可以进入到控制界面,查看服务部署状态,等待部署完成,用时大概消耗 3-5 分钟。部署完成后,点击实例 ID,可以看到“EndPoint”公网地址,点击访问此公网地址,可以打开登录界面。输入软件登录名及软件登录密码(也就是步骤三中软件的登录名 &密码),点击登录,即可打开 Web UI 界面。
第五步,登录实例所在 ECS。
而当我们需要检查 Stable-diffsion 运行状态,下载软件/模型,或者查看 Stable-diffsion 运行日志时,我们可以登录 ECS 实例进行查看,进入“服务实例详情”的资源选项卡,点击远程连接,点击免密登录,即可进入网页 terminal。
实例中的 Stable-diffusion 位于/root/stable-diffusion-webui/。如果需要重启服务,可以使用 sudo systemctl stop sdwebui 命令停止服务,而后使用 sudo systemctl start sdwebui 命令启动服务,日志文件会被写入/var/log/sdwebui.log,大家也可任意查看。
二、文生图和图生图的基础操作与使用
SD 模型选择:当有下载新的模型或者需要切换模型的时候,下拉此选项卡进行选择。镜像里预装了 4 个模型,包含 Taiyi 中文模型、Taiyi 动漫中文模型、Stable-diffusion 1.5 基准模型和 OpenJourney 模型。
提示词和反向提示词:提示词由多部分组成,以英文逗号分隔,提示词应尽量具象,指明场景、事物、事件、风格等。这是文生图中最重要的可选参数,直接控制了生成图片的质量效果和生成图片的场景和物体。提示词由多个部分组成,用英文逗号分隔。建议大家使用提示词时,尽量具象的指明场景、事务、事件或是风格。
采样器和迭代步数:采样器用于控制 Unet 输出结果使用方式。迭代步数越高,最终出图的清晰度和画质就越好。
扩散度设置:CFG Scale,AI 自由创作度,越小越保守,越大越开放。如果扩散度设置越大,它就会生成更多的多样性;反之如果越小,它就会越符合你的限制。
如上图所示,底部是图片生成种子。如果你从网上看到一张别人的比较优秀的这个图片,可以把它的种子填到这个地方。这样能保证在相同的参数配置下,你生成的图片和别人的是一样或是相似的。图片生成种子的右侧是图片保存设置。这里可以将你生成的图片发送到文图生图的地方去重新生成或者做局部绘制。
下面我们以预装的 Taiyi 中文模型作为例子,来演示如何去使用文生图,具体步骤见上图:
首先,输入如下提示词,词语之间用逗号隔开。提示词:铁马冰河入梦来,概念画,科幻,玄幻,3D。反向提示词留空,其他选项均为默认选项,点击生成,即可生成一张与提示词描述相近的图片。此外可见当使用 AIACC 加速时,生成一张与提示词描述相近的图片,分辨率为 512x512,用时为 0.78s。
作为对比,如需禁用 AIACC 加速,我们可以在设置选项卡的 AiaccTorch 选项中关闭“Apply Aiacctorch”选项,并点击应用设置,重新执行一个图片生成。如需打开 AIACC,也可在此界面打开“Apply Aiacctorch”选项,并点击应用设置。禁用 AIACC 性能加速后进行相同图片生成的时间则增加至 1.88s。因此可见,AIACC 能缩短 58%的推理时间,或增加图片生成的吞吐量至原有的 2.41 倍。
我们也可以用相同的操作在不同模型下进行图片生成,比如在 Taiyi 中文动漫模型中进行测试,见上图。
首先,输入提示词。提示词:1 个女孩,绿眼,棒球帽,金色头发,闭嘴,帽子,看向阅图者,短发,简单背景,单人,上半身,T 恤。
然后,输入反向提示词。反向提示词:水彩,漫画,扫描件,简朴的画作,动画截图,3D,像素风,原画,草图,手绘,铅笔。其他选项均为默认选项,点击生成。
可见通过 AIACC 加速生成一张动漫风格的图片,分辨率为 512x512,用时为 0.77s。点击页面中的“图生图”按钮,我们可以将此图片发送至图生图选项卡,进行下一步骤。
进入图生图选项卡,我们使用文字和图片共同引导图片生成。同样,输入提示词。提示词:1 个男孩。输入反向提示词。反向提示词:水彩,漫画,扫描件,简朴的画作,动画截图,3D,像素风,原画,草图,手绘,铅笔。
可以观察到输出图片仍然保留了输入图片的布局和风格,但中间的人物已经从女孩换成了男孩。由图可见,当使用 AIACC 加速时,单张图片耗时仅 0.69s,而不做任何加速时,则需要 1.59s,降低了 56%的延迟。
三、Stable-Diffusion 高级特性使用
接下来主要介绍 Stable-Diffusion 的一些高级特性,包含如何去使用 Lora 修改生成图片的细节,如何使用 ControlNet 来控制图片的形状;同时也会介绍如何通过 API 调用的方式执行图生图和文生图的操作。
Lora 权重,全称是 Low-Rank Adaptation,原本应用于大语言模型 LLM (Large Language Models)但由于其训练成本低、参数量少、使用方便,在 Stable-diffusion 模型中也有较多应用。点击右侧的附加网络按钮,打开附加网络选项,点击下方的 Lora 权重,如果选择一个 Lora 权重,权重配置字段会自动填入上方的提示词中。
Lora 权重的格式为权重名:权重比例大小>,Lora 权重可以同时选中多个进行叠加。在 Web UI 中,Lora 权重是可以同时选择多个进行叠加,但建议所有权重之和不要超过 1,因为过大的 Lora 权重可能会导致中间某些层的输出结果溢出。
使用 Lora 权重之后,我们可以针对性的修改图片的某些风格和效果,例如上图的左图和右图,使用相同的 A Girl, best quality, ultra-detailed, masterpiece, finely detail, highres, 8k wallpaper 提示词,seed=10,使用 iuV35.uv1P 这一 Lora 权重之后的生成图有明显的东亚女生的特征。
同时,AIACC 也支持性能无损的 Lora 权重计算功能,使用 Lora 权重时,仍能维持 0.78 秒的单张图片生成时间。而与之相对应的使用 torch 进行推理时,需要 2.06 秒,且推理时间随 Lora 权重数量增加而增加。
ControlNet 组件实际上是为我们提供了一种精确控制 Stable-diffusion 生成图片的方式。我们可以选择不同的预处理,通过边缘检测、姿态检测等方式,使用参考图控制去噪过程,ControlNet 有如下几个关键的可选项:
· 控制类型:通过选择控制类型,可以选择我们想要进行的操作;
· 预处理器:设置处理参考图的方式,例如 canny 则可用 canny 算子进行边缘检测;
· 模型:设置生成图片所用的 ControlNet 模型;
· 控制权重:设置 ControlNet 所作用的权重,默认为 1。
上图是以计算机视觉中常用的 Lenna 图为例,使用 ControlNet 的 Canny 预处理器和模型进行图片生成。设置提示词:A Girl, best quality, ultra-detailed, masterpiece, finely detail, highres, 8k wallpaper,模型为 control_v11p_sd15_canny,其他选项为默认选项,点击生成可生成图片。
可见生成的图片与输入的参考图的整体布局十分相似,使用 ControlNet 这种方式,我们可以非常精确地控制所生成的图片。由图可见,当使用 AIACC 加速时,单张图片耗时仅 1.28s,而不做任何加速时,则需要 3.04s,降低了 57%的延迟,AIACC 大幅提升了生图性能。
此外对于有远程使用或是命令行调用的场景而言,Stable-Diffusion 的 Web UI 还可使用 API 的方式进行调用。点击 Weui 的主界面最下角的“API”链接,即可跳转到 API 说明文档和可测试文档。
上图是两个简单的代码示例,分别是文生图和图生图。对于文生图场景来说,可以用 POST 请求 url 加上/sdapi/vi/txt2img 这样一个 API。在使用计算巢的时候,需要注意与标准的 Stable-Diffusion 的 Web UI 所不同的地方。首先创建一个 session,然后去配置用户名和密码。这是因为在计算巢的实例中,使用了 nginx 去做了端口的转发和健全以避免恶意的访问。所以当使用 Web UI 调用的时候,需要使用 session 的接口把用户名跟密码加上。
随后的操作就与 Stable-Diffusion 官方的操作比较相似了,如上图示例,输入非常简单的提示词,即 A Girl,然后设置 seed 的数等于 1,然后去 POST 之后,会返回一个 response。我们用 JSON 去把这个 response 重新加载回来,然后可以看到它的 image 是在这样一个数据当中,然后用 base64 编码过的。所以我还需要用 base64 去解码这个 image,然后将它写入到一个文件当中,这个文件就是我们是已经生产的这个文件了。
图生图与文生图类似,不同的是需要用 base64 的编码去编码输入的图片。示例中用了 open CV 去读取这个图片,然后用 base64 去编码图片。之后就跟文生图类似,去请求/sdapi/vi/txt2img 这样的 API。然后将这个读取的图片放入到这个 images 这样一个字段当中,然后去请求。对生成图片也是一样的,也会存在一个用 base64 做个编码的这样一个格式的这个字段当中,最后把它写入到文件就 ok 了。
想要关注阿里云 AIGC 方案的同学可以钉钉扫描上图左侧二维码入群,同时也可以扫描右侧二维码关注阿里云 AIGC 最新活动。想要了解更多精彩直播/观看课程回放的同学,可以扫描下方海报中的二维码/点击观看,均可观看完整课程回放。
版权声明: 本文为 InfoQ 作者【阿里云弹性计算】的原创文章。
原文链接:【http://xie.infoq.cn/article/e8e37152a41ac3b1c916c4d14】。文章转载请联系作者。
评论