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

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

背景

AIGC是人工智能计算领域里发展迅速的重要业务。Stable Diffusion 是其中最热门的开源模型,受到广泛关注。然而,随着应用场景不断扩大,Stable Diffusion所面临的推理时延和计算成本问题也越来越突出。

简介

PAI-Blade是 PAI 推出的通用推理优化工具,可以通过模型系统联合优化,使模型达到最优推理性能。PAI-Blade依托于完全动态尺寸的AI编译器BladeDISC 和 基于深度学习自动调度的高性能计算库BlaDNN, 为包括图像生成模型Stable Diffsuion, 大语言模型LLM, 大规模稀疏推荐模型CTR, 语音识别模型ASR等等在内的众多模型提供自动的高性能推理优化。

BladeDISC 是一款支持完全动态尺寸的AI编译器,前端支持Pytorch和Tensorflow模型。对于Pytorch模型能够支持 TorchScript 和 TorchDynamo 两种输入模式,后端通过 AStitch 大尺度算子融合技术和高效的 codegen 逻辑提升模型访存密集算子的执行效率。BladeDISC现已在github开源,项目地址:https://github.com/alibaba/BladeDISC 。

BlaDNN 是基于深度学习自动调度的高性能计算库。BlaDNN 作为Ansor的升级版,不仅生成的kernel性能超过Ansor,而且可以完全依赖DNN自动调度而不使用Tuning调优,使得Dynamic Shape业务场景的在线自动调度成为可能,基于DNN自动调度生成的GPU计算密集算子的平均性能达到极致tuning性能的99.39%,通过模型系统联合优化DNN推理延时低至2us, 并且只使用一个CPU Core,从而不会对GPU模型本身的性能造成任何抖动。

通过采用 PAI-Blade 加速推理优化技术,对访存密集型算子进行大尺度融合及优化代码生成,对计算密集型算子进行自动调度,可以大幅度降低Stable Diffusion的推理延迟和显存占用,从而减少计算成本。使用 PAI-Blade 优化Stable Diffusion 具有以下三点优势:

  1. 高性能,使用Blade可以降低 Text2Img、Img2Img 等推理流程的端到端延迟 2.42-3.05 倍,同时可降低省显存占用至多 5.27 倍,超过TensorRT-8.5等业内SOTA优化手段。
  2. 完全动态shape支持,一次优化后,可以支持任意形状、batch size的输入。
  3. 易用性、可扩展性:仅需数行代码即可在多类pipeline中启用 Blade优化,同时能支持LoRA等推理方案的优化。

使用示例

本文接下来以社区流行的 "runwayml/stable-diffusion-v1-5" 的 Text2Img pipeline 为例,详细介绍 PAI-Blade 在各类使用场景下的使用方法。

环境安装

下述示例完整的运行脚本及相关环境已集成到 registry.cn-beijing.aliyuncs.com/blade_demo/blade_diffusion docker 中。在该docker中,直接通过 python /blade/blade_diffusion.py 即可运行推理示例。

官方模型优化

使用 PAI-Blade 优化 Stable Diffusion 模型可以分为以下几个步骤。

首先,加载预训练的模型。

from diffusers import StableDiffusionPipeline

device = torch.device("cuda:0")
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", revision="fp16", torch_dtype=torch.float16).to(device)

第二步,使用 PAI-Blade 进行优化。注意,由于 PAI-Blade 是完全动态shape的优化工具,优化完成后可使用任意shape进行推理。

import torch_blade

opt_cfg = torch_blade.Config()
opt_cfg.enable_fp16 = True
with opt_cfg, torch.no_grad():
    encoder = blade_optimize(pipe.text_encoder, model_inputs=encoder_inputs, allow_tracing=True)
    unet = blade_optimize(pipe.unet, model_inputs=unet_inputs, allow_tracing=True)
    decoder = blade_optimize(pipe.vae.decoder, model_inputs=decoder_inputs, allow_tracing=True)

最后,使用优化好的模型替换原始模型,后续即可以原始 pipeline 同样的方式进行推理。

@dataclass
class UNet2DConditionOutput:
    sample: torch.FloatTensor

class TracedUNet(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.config = pipe.unet.config
        self.in_channels = pipe.unet.in_channels
        self.device = pipe.unet.device

    def forward(self, latent_model_input, t, encoder_hidden_states, **kwargs):
        sample = unet(latent_model_input.half(), t.half(), encoder_hidden_states.half())["sample"]
        return UNet2DConditionOutput(sample=sample)

class TracedEncoder(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.config = pipe.text_encoder.config
        self.device = pipe.text_encoder.device
        self.dtype = torch.half

    def forward(self, input_ids, **kwargs):
        embeddings = encoder(input_ids.long())
        return [embeddings["last_hidden_state"]]

class TracedDecoder(torch.nn.Module):
    def forward(self, input):
        return decoder(input.half())

pipe.text_encoder = TracedEncoder()
pipe.unet = TracedUNet()
pipe.vae.decoder = TracedDecoder()

A100 性能对比

image size samplesteps Time of Pytorch(s) Time of PAI-Blade(s) speedup Pytorch memory usage (GB) PAI-Blade memory usage (GB)
1024x1024 50 13.26 4.34 3.06X 32.91 6.25
768x768 50 5.65 2.00 2.83X 14.99 5.91
512x512 50 2.24 0.84 2.67X 6.60 5.42

A10 性能对比

image size samplesteps Time of Pytorch(s) Time of PAI-Blade(s) speedup Pytorch memory usage (GB) PAI-Blade memory usage (GB)
1024x1024 50 OOM 13.86 - OOM 6.89
768x768 50 13.13 5.61 2.34X 12.60 6.22
512x512 50 4.53 2.11 2.15X 6.28 5.47

推理结果验证

使用PAI-Blade优化后,生成的图像与Pytorch原始输出对比,观察优化结果是否正确。左图为Pytorch eager模式输出,右图为PAI-Blade优化后的模型输出。

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

已验证的pipeline类型

  1. StableDiffusionPipeline
  2. StableDiffusionImg2ImgPipeline
  3. StableDiffusionInpaintPipeline
  4. AltDiffusionPipeline

LoRA优化

LoRA 是指在原始模型基础上,添加额外的低秩矩阵来微调预训练的模型,并且只训练那些新添加的权重,从而大幅降低微调成本。可以通过 diffusers官方训练代码 微调得到 LoRA 权重。diffusers 加载使用 LoRA 后,模型运行方式与原始模型略有不同,带来额外计算开销。

PAI-Blade 目前已适配 huggingface/diffusers 中 LoRA 优化方式。同样的,Blade 针对同一pipeline,只需优化一次,即可使用任意的 LoRA 权重进行推理。我们将在下一篇文章中介绍PAI-Blade 优化 LoRA 的使用方式,敬请期待。

展望

目前,Stable Diffusion相关技术仍在不断演化中,PAI-Blade 团队也时刻关注社区趋势,将优化适配到各种工具中去。目前团队主要集中在:

  1. 将相关优化集成到 stable-diffusion-webui 中;
  2. 优化 finetune 训练速度。

原文链接

本文为阿里云原创内容,未经允许不得转载文章来源地址https://www.toymoban.com/news/detail-489631.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

领红包