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最新活动。想要了解更多精彩直播/观看课程回放的同学,可以扫描下方海报中的二维码/点击观看,均可观看完整课程回放。