使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)

这篇具有很好参考价值的文章主要介绍了使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

上一篇中,我们使用了 PAI-Blade 优化了 diffusers 中 Stable Diffusion 模型。本篇,我们继续介绍使用 PAI-Blade 优化 LoRA 和 Controlnet 的推理流程。相关优化已经同样在 registry.cn-beijing.aliyuncs.com/blade_demo/blade_diffusion镜像中可以直接使用。同时,我们将介绍 Stable-Diffusion-webui 中集成 PAI-Blade 优化的方法。

LoRA优化

PAI-Blade优化LoRA的方式,与前文方法基本相同。包括:加载模型、优化模型、替换原始模型。以下仅介绍与前文不同的部分。

首先,加载Stable DIffusion模型后,需要加载LoRA权重。

pipe.unet.load_attn_procs("lora/")

使用LoRA时,用户可能需要切换不同的LoRA权重,尝试不同的风格。因此,PAI-Blade需要在优化配置中,传入freeze_module=False,使得优化过程中,不对权重进行编译优化,从而不影响模型加载权重的功能。通过这种方式,PAI-Blade优化后的模型,依然可以使用pipe.unet.load_attn_procs()方式加载LoRA的权重,而不需要重新编译优化。

由于模型权重未进行优化流程,一些对常量的优化无法进行,因此会损失部分优化空间。为了解决性能受损的问题,PAI-Blade中,使用了部分patch,对原始模型进行python层级的替换,使得模型更适合PAI-Blade优化。通过在优化前,使用 torch_blade.monkey_patch优化 Stable Diffusion 模型中的 unet和vae部分,能更好的发挥PAI-Blade能力。

from torch_blade.monkey_patch import patch_utils

patch_utils.patch_conv2d(pipe.vae.decoder)
patch_utils.patch_conv2d(pipe.unet)

opt_cfg = torch_blade.Config()
...
opt_cfg.freeze_module = False
with opt_cfg, torch.no_grad():
    ...

如果没有LoRA权重切换的需求,可以忽略上述步骤,获得更快的推理速度。

Benchmark

我们在A100/A10上测试了上述对LoRA优化的结果,测试模型为 runwayml/stable-diffusion-v1-5,测试采样步数为50。

使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)

使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)

ControlNet适配

根据 ControlNet 的模型结构图以及diffusers中ControlNet实现,可以将ControlNet的推理分为两部分。

使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)

  1. ControlNet部分,其input blocks和 mid block 结构与Stable DiffusionUnet的前半部分相同,剩余部分为卷积。ControlNet所有输出传入到Stable DIffusion的Unet中,作为输入;
  2. Stable Diffusion 的Unet除了原始输入外,额外增加了ControlNet的输出作为输入。

根据上述特点,我们可以做出以下的优化:

首先,优化ControlNet,

controlnet = torch_blade.optimize(pipe.controlnet, model_inputs=tuple(controlnet_inputs), allow_tracing=True)

在优化unet模型时,由于torch2.0之前的版本,torch.jit.trace不支持使用dict作为输入,所以我们使用Wrapper包装Unet后便于trace和优化。同时,使用优化后的ControlNet执行一次推理,将其输出添加到Unet输入中。

class UnetWrapper(torch.nn.Module):
    def __init__(self, unet):
        super().__init__()
        self.unet = unet

    def forward(
        self,
        sample,
        timestep,
        encoder_hidden_states,
        down_block_additional_residuals,
        mid_block_additional_residual,
    ):
        return self.unet(
            sample,
            timestep,
            encoder_hidden_states=encoder_hidden_states,
            down_block_additional_residuals=down_block_additional_residuals,
            mid_block_additional_residual=mid_block_additional_residual,
        )

...
down_block_res_samples, mid_block_res_sample = controlnet(*controlnet_inputs)
unet_inputs += [tuple(down_block_res_samples), mid_block_res_sample]
unet = torch_blade.optimize(UnetWrapper(pipe.unet).eval(), model_inputs=tuple(unet_inputs), allow_tracing=True)

结合上述功能,可以同时实现:

  1. LoRA权重替换;
  2. ControlNet权重替换,来使用不同ControlNet model。

benchmark

我们在A100/A10上测试了上述对ControlNet优化的结果,测试模型为 runwayml/stable-diffusion-v1-5,测试采样步数为50。

使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)

使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)

小结

在上述部分,我们使用了PAI-Blade优化了Stable DIffusion模型的encoder、unet、decoder部分,大幅降低推理延时的同时,减少了显存占用,从而降低Stable DIffusion模型推理成本。同时,PAI-Blade支持了LoRA、ControlNet等常用功能,扩展了PAI-Blade的实用性。

webui适配

stable-diffusion-webui 是 Stable DIffusion非常热门的应用,PAI-Blade 同样提供了对其优化支持。目前,PAI-Blade已经支持了模型权重切换、LoRA、ControlNet等webui中常用的功能,同时通过 extension 的形式集成,可以便于用户使用。目前,相关优化已经集成到 PAI-EAS 的 eas-registry.cn-hangzhou.cr.aliyuncs.com/pai-eas/sdwebui-inference:0.0.2-py310-gpu-cu117-ubuntu2204-blade 镜像,可以通过PAI_EAS直接体验PAI-Blade的优化能力。

下面介绍该插件中,PAI-Blade在webui中优化方式和性能。webui优化原理与diffusers大致相同,以下是几个主要不同点:

分模块优化Unet和ControlNet

由于webui中,ControlNet需要逐个调用Unet的子模块,为了兼顾ControlNet,PAI-Blade并没有像diffusers中一样,优化整个Unet和ControlNet。而是采取逐个子模块优化的方法,将Unet、ControlNet中所有的down blocks、 mid block、up blocks分别进行优化和替换。经过测试,此种优化方式几乎不影响模型推理速度。

不冻结权重

webui的网页上,可以快捷的切换模型权重。因此,PAI-Blade采取和diffusers中LoRA优化同样的方法,不对权重进行优化。

LoRA优化

webui中,多个LoRA会逐个调用LoRA计算,计算时间随LoRA数量增多而变长。PAI-Blade 在加载LoRA权重时,将多个LoRA的权重与scale预先fuse,减少了运行时的开销。加载和fuse的开销,经测试可忽略不计。

Benchmark

我们在A10上测试了webui中,Stable DIffusion V1 模型在 batch size为1,分辨率为512*512条件下的推理速度。由于webui中涉及到网络传输等模型无关部分的延迟,因此本部分只测试了模型部分耗时。结果如下:

steps

eager

xformers

PAI-Blade

no LoRAs

+ 2 LoRAs

ControlNet

no LoRAs

+ 2 LoRAs

ControlNet

any LoRAs

ControlNet

20

2.03

2.94

2.75

1.57

2.46

2.14

1.15

1.62

50

4.77

7.17

6.64

3.63

5.86

5.06

2.59

3.75

100

9.45

14.18

13.13

7.10

11.54

9.90

4.96

7.35

由该表可知,webui在eager和xformers模式下,推理时间随LoRA数量增加而延长,而PAI-Blade将所有LoRA的权重融合到基础模型,所以推理时间与LoRA数量无关。

总结

这两篇文章中,我们介绍了PAI-Blade 在Stable DIffusion模型上的优化经验,目前已经支持了Diffusers和Stable-DIffusion-webui 两种主流推理方式。

我们调研了相关公开的竞品对Stable Diffusion的支持情况,结果如下:

框架/模型 Base Model LoRA ControlNet webui
xformers
AITemplete
OneFlow
TensorRT
PAI-Blade

根据公开性能数字和业务实测,PAI-Blade对Stable DIffusion模型,不仅支持最为全面,同时性能和显存使用也是最佳水平。

原文链接

本文为阿里云原创内容,未经允许不得转载。文章来源地址https://www.toymoban.com/news/detail-483729.html

到了这里,关于使用 PAI-Blade 优化 Stable Diffusion 推理流程(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里云PAI-Diffusion功能再升级,全链路支持模型调优,平均推理速度提升75%以上

    随着Stable Diffusion模型在AI圈的爆火,AI生成内容(AI Generated Content,AIGC)的应用呈现出井喷式的增长趋势。其中,文图生成(Text-to-image Generation)任务是最流行的AIGC任务之一,旨在生成与给定文本对应的图像。在先前的工作中,阿里云机器学习PAI团队开源了PAI-Diffusion系列模型

    2024年01月17日
    浏览(26)
  • 阿里云 PAI 免费试用搭建 stable-diffusion-WebUI

    最近玩 stable-diffusion 一直在 Colab 上,前几天发现阿里云的 PAI 有免费试用,就玩了一下,发现速度比 Colab 还快,然后可以免费试用三个月(如果不关机的话估计就只能玩 1 个月)。 首先在阿里云首页免费试用菜单下面点击了解更多: 然后在最下方找到 PAI-DSW 的免费试用,点

    2024年02月10日
    浏览(39)
  • 基于 PAI-EAS 一键部署 Stable Diffusion AIGC 绘画

    人工智能平台PAI完成云上Stable Diffusion以文生图应用搭建, 支持两种方式: 使用交互式建模 PAI-DSW 使用模型在线服务 PAI-EAS 两种部署适用人群: 1.使用交互式建模 PAI-DSW 部署Stable Diffusion 亮点: Notebook经典界面,对习惯代码操作的开发者更加友好; 支持微调训练等操作,灵

    2024年01月20日
    浏览(35)
  • Stable Diffusion在阿里云PAI DSW平台实践,送浩浩妈妈二次元

    内容 说明 镜像 stable-diffusion-webui-develop:1.0-pytorch2.0-gpu-py310-cu117-ubuntu22.04 镜像区域 杭州、上海、北京、深圳 环境安装 在DSW Gallery中找到“AI扩图神器,放飞你的想象力”,点击“在DSW中打开”按钮,进入后已提供了额库下载、基础模型下载、webui运行等基础 在WebUI中进入扩展

    2024年04月26日
    浏览(27)
  • 云服务器免费领用,体验PAI-EAS 5分钟部署Stable Diffusion webUI

    最近发现大家都在体验AIGC的Stable Diffusion 文生图模型,很多博主也分享了详细的本地部署保姆级教程。 为什么选择本地部署Stable Diffusion 因为没有生成数量的限制,不用花钱,不用被NSFW约束,生成时间快,不用排队,自由度高,插件丰富,功能众多,可以调试和个性化的地方

    2024年02月16日
    浏览(38)
  • 使用stable diffusion 生成作品流程

      AOTUDL 云部署 1.算力市场选用RTX3090/RTX A5000 2.点击算法镜像noval ai 3.0和Lora scripts 配置python环境及其他 3.启动stable diffusion和Lora scripts 4.装配模型:可在如Civitai上下载标注有 CKPT 的模型,有模型才能作画。下载的模型放入下载后文件路径下的 models/Stable-diffusion 目录。 5.Stable D

    2024年02月10日
    浏览(24)
  • stable diffusion推理过程代码梳理

    最近在看stable diffusion,想梳理一下代码流程,以便之后查阅 从txt2img.py开始看 1.首先是对文本进行编码 (1)调用的是 stable-diffusion/ldm/models/diffusion/ddpm.py的get_learned_conditioning函数 (2) 第555行表示使用CLIP的文本编码器对输入的文本进行编码,调用的是stable-diffusion/ldm/modules

    2024年02月11日
    浏览(31)
  • 【Stable Diffusion/NovelAI Diffusion的AMD GPU加速推理探索】

    测试机子配置: 1:AMD RX6600(显存8g)+i5 12600KF 16g内存 (台式机) 2:RTX 3070 laptop(显存8g)+i7 10870H 32g内存 (HP暗夜精灵笔记本) 两台电脑平均性能差不多,当然N卡肯定更好一点 这边我们还是MS大发好,用MS的DirectML推理框架推理,虽然据小道消息反馈DML推理效率远不如Cuda,但是要知道

    2024年02月01日
    浏览(27)
  • 在英特尔 CPU 上加速 Stable Diffusion 推理

    前一段时间,我们向大家介绍了最新一代的 英特尔至强 CPU (代号 Sapphire Rapids),包括其用于加速深度学习的新硬件特性,以及如何使用它们来加速自然语言 transformer 模型的 分布式微调 和 推理。 英特尔至强处理器: https://www.intel.com/content/www/us/en/products/details/processors/xeon/scal

    2024年02月09日
    浏览(43)
  • 基于onnx模型和onnx runtime推理stable diffusion

    直接用diffusers的pipeline: 在pipeline_onnx_stable_diffusion的基础上修改得到的直接调用onnx模型版本,可以用于其他推理引擎推理参考: pipe_onnx_simple.py onnx_utils_simple.py 生成1张512x512图的shape信息

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包