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

news2025/1/13 10:07:45

背景

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 sizesamplestepsTime of Pytorch(s)Time of PAI-Blade(s)speedupPytorch memory usage (GB)PAI-Blade memory usage (GB)
1024x10245013.264.343.06X32.916.25
768x768505.652.002.83X14.995.91
512x512502.240.842.67X6.605.42

A10 性能对比

image sizesamplestepsTime of Pytorch(s)Time of PAI-Blade(s)speedupPytorch memory usage (GB)PAI-Blade memory usage (GB)
1024x102450OOM13.86-OOM6.89
768x7685013.135.612.34X12.606.22
512x512504.532.112.15X6.285.47

推理结果验证

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

image.png

已验证的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 训练速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/558008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可视化搭建 - 自动批处理与冻结

性能在可视化搭建也是极为重要的,如何尽可能减少业务感知,最大程度的提升性能是关键。 其实声明式一定程度上可以说是牺牲了性能换来了可维护性,所以在一个完全声明式的框架下做性能优化还是非常有挑战的。我们采取了两种策略来优化性能&…

我的创作纪念日,成为创作者的第256天!

机缘 一年前刚开始学习编程,在网上查找资料的过程中才了解到了CSDN开发者社区。在csdn认识了很多技术大牛,他们的文章记录了他们的学习路径,看到他们从小白一步一步成长为大牛,这激起了我创作的热情。刚开始写博客完全是日常学习…

广域通信网 - HDLC 高级数据链路控制协议

文章目录 1 概述2 HDLC2.1 帧类型2.2 帧结构 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-JEuFH1qP4tY5jI5p {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JEuFH1qP4tY5jI5p .error-icon{fill:#552222;}#mermaid-…

快看!ChatGPT的4个不为人知却非常实用的小功能

文 / 高扬(微信公众号:量子论) 今天重点介绍四个ChatGPT很实用的小功能。 一、停止生成 如果在ChatGPT输出内容的过程中,我们发现结果不是自己想要的,可以直接点击“Stop generating”按钮,这样它就会立即停…

小鱼说|城市产业带与供应链系统的结合模式(2)

上一篇讲到城市产业带 的形成以及讲到 它与供应链的关系 那么我们继续把 这个话题深化一下 从原厂地到供应商 到供应链再到商城平台 城市产业带是供货的源地 经过最多二级的供应商上架 到供应链再经过最多二级的 经销商流入到各大商业平台 由于一个供应链可对接多个城市产业带 …

公网远程访问本地jupyter notebook服务 - 内网穿透

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 转载自cpolar的文章:公网远程访问Jupyter Notebook【Cpolar内网穿透】 前言 Jupyter Notebook&am…

ChatGPT为一位英语女教师做了这件事

文 / 高扬(微信公众号:量子论) 今天有位网友加我微信,是某中学的英语老师,通过“量子论”公众号知晓了ChatGPT的一些有趣玩法,询问是否有办法帮她做个提示词,依据一个单词生成配套学习资料。 即…

代码实战深度理解RabbitMQ 5 种消息模型

5种消息模式 简单消息模式:1个生产者 1个队列 1个消费者;生产者只负责生产,消费者只负责消费,两者在同一个队列中操作工作队列消息模式:1个生产者 1个队列 多个消费者; 一条消息只能被消费一次订阅消息…

AI作曲都这么厉害了,AI生成音乐

人工智能(AI)正在越来越多地应用于音乐、电影和绘画等艺术领域。在之前海森大数据已经为大家介绍了AI生成绘画,今天带大家了解一下AI生成音乐。 在当下的应用中,AI音乐生成已经相对成熟,AI已经可以影响音乐制作过程的…

annoconda安装使用及镜像源的添加,提高软件下载速度

1 annoconda下载 文件地址列表,选择版本下载https://repo.anaconda.com/archive/ win10版本: Anaconda3-2023.03-1-Windows-x86_64 linux版本: Anaconda3-2023.03-1-Linux-x86_64 win10下执行exe按向导安装,linu…

人工智能和物联网:如何将传感器和设备数据与机器学习相结合

第一章:引言 人工智能(Artificial Intelligence, AI)和物联网(Internet of Things, IoT)是当今科技领域最引人注目的技术之一。随着传感器和设备的普及,我们能够收集到大量的实时数据。然而,这…

chatgpt赋能Python-python_head__

Python的head()方法 什么是head()方法? head()方法是Python编程语言中的一个函数,它用于获取一个序列的前几项。它的用法如下: head(n, iterable)其中,n表示需要返回的序列前n项,iterable表示需要获取前n项的序列对…

2023年海彼特全国幼儿篮球联赛·总决赛圆满落幕

5月21日,由北京海彼特教育科技院主办的“2023年海彼特全国幼儿篮球联赛总决赛”。在河北体育馆隆重举行,精彩的比赛效果使体育馆顿时成为幼儿篮球界最高端、大气的舞台。 本次盛会联合举办方有: 河北体育馆 亚洲少儿体育协会 北京海彼特文…

【Linux】signal 和 sigaction 两个信号捕捉函数

目录 signal 信号捕捉函数1、函数解析2、代码示例 sigaction 信号捕捉函数1、函数解析2、代码示例 内核实现信号捕捉的过程 sigaction的用法要复杂一些,但一般都是用sigaction,signal依据不同的标准可能有不同的用法变化,sigaction比较稳定&a…

易基因:全基因组DNA甲基化分析揭示DNMT1在斑马鱼模型听觉系统发育中的作用 | 胚胎发育

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 听力障碍通常与内耳发育不全或损伤有关,是影响生活质量的严重健康问题。因此研究听觉器官发生过程中的关键基因对于探索听力损伤的潜在策略至关重要。斑马鱼模型在理解内耳发…

C++ Primer笔记——查找算法

目录 一.简单查找 ①find(first, last, val); ②find_if & find_if_not ③count & count_if ④all_of & any_of & none_of 二.重复值的查找 ①adjacent_find(first, end); ②search_n(first, end, count, val); 三.查找子序列 ①search(first1, end1,…

基于html+css的图展示86

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Redis事务和Redis管道

什么是Redis事务:Redis事务是指将多条命令加入到队列里面,一次批量执行多条命令,每一条命令会按顺序执行,在事务执行过程中不会受到客户端所传入的命令请求的影响 1)单独的隔离操作:Redis的事务仅仅保证事务 里面的操作会被连续独占的执行&am…

【Rust 日报】2023-05-21 Helix 23.05发布

Helix 23.05发布 Helix 是个文本编辑器: 新版本功能: 为 LSP 引用请求添加一个配置选项,用于排除声明(#6886)。根据文件扩展名和 shebang 启用语言注入(#3970)。通过最近…

Vision-CAIR/MiniGPT-4:使用先进的大型语言模型增强视觉-语言理解

Vision-CAIR/MiniGPT-4:使用先进的大型语言模型增强视觉-语言理解 摘要 视觉-语言理解是人工智能领域的一个重要方向,它涉及到图像和文本之间的复杂交互。近年来,大型语言模型(LLM)在自然语言处理(NLP&am…