基于 NNCF 和 Optimum 面向 Intel CPU 对 Stable Diffusion 优化

news2024/10/7 4:31:48

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟!

基于隐空间的扩散模型 (Latent Diffusion Model),是解决文本到图片生成问题上的颠覆者。Stable Diffusion 是最著名的一例,广泛应用在商业和工业。Stable Diffusion 的想法简单且有效: 从噪声向量开始,多次去噪,以使之在隐空间里逼近图片的表示。

但是,这样的方法不可避免地增加了推理时长,使客户端的体验大打折扣。众所周知,一个好的 GPU 总能有帮助,确实如此,但其损耗大大增加了。就推理而言,在 2023 年上半年 (H1’23),一个好 CPU 实例 (r6i.2xlarge,8 vCPUs ,64 GB 内存) 价格是 0.504 $/h,同时,类似地,一个好 GPU 实例 (g4dn.2xlarge,NVIDIA T4,16 GB 内存) 价格是 0.75 $/h ,是前者的近 1.5 倍。

这就使图像生成的服务变得昂贵,无论持有者还是用户。该问题在面向用户端部署就更突出了: 可能没有 GPU 能用!这让 Stable Diffusion 的部署变成了棘手的问题。

在过去五年中,OpenVINO 集成了许多高性能推理的特性。其一开始为计算机视觉模型设计,现今仍在许多模型的推理性能上取得最佳表现,包括 Stable Diffusion。然而,对资源有限型的应用,优化 Stable Diffusion 远不止运行时的。这也是 OpenVINO NNCF(Neural Network Compression Framework) 发挥作用的地方。

在本博客中,我们将理清优化 Stable Diffusion 模型的问题,并提出对资源有限的硬件 (比如 CPU) 减负的流程。尤其是和 PyTorch 相比,我们速度提高了 5.1 倍,内存减少了 4 倍。

Stable Diffusion 的优化

在 Stable Diffusion 的 管线 中,UNet 的运行是最计算昂贵的。因此,对模型的推理速度,针对 UNet 的优化能带来足够的效益。

然而事实表明,传统的模型优化方法如 8-bit 的后训练量化,对此不奏效。主要原因有两点: 其一,面向像素预测的模型,比如语义分割、超分辨率等,是模型优化上最复杂的,因为任务复杂,参数和结构的改变会导致无数种变数; 其二,模型的参数不是很冗余,因为其压缩了其数以千万计的 数据集 中的信息。这也是研究者不得不用更复杂的量化方法来保证模型优化后的精度。举例而言,高通 (Qualcomm) 用分层知识蒸馏 (layer-wise Knowledge Distillation) 方法 (AdaRound) 来 量化 Stable Diffusion。这意味着,无论如何,模型量化后的微调是必要的。既然如此,为何不用 量化感知的训练 (Quantization-Aware Trainning, QAT),其对原模型的微调和参数量化是同时进行的?因此,我们在本工作中,用 token 合并 (Token Merging) 方法结合 NNCF, OpenVINO 和 Diffusers 实践了该想法。

优化流程

我们通常从训练后的模型开始优化。在此,我们从宝可梦数据集 (Pokemons dataset,包含图片和对应的文本描述) 上微调的 模型。

我们对 Stable Diffusion 用 Diffusers 中的 图片 - 文本微调之例,结合 NNCF 中的 QAT (参见训练的 脚本)。我们同时改变了损失函数,以同时实现从源模型到部署模型的知识蒸馏。该方法与通常的知识蒸馏不同,后者是把源模型蒸馏到小些的模型。我们的方法主要将知识整理作为附加的方法,帮助提高最后优化的模型的精度。我们也用指数移动平均方法 (Exponential Moving Average, EMA) 让我们训练过程更稳定。我们仅对模型做 4096 次迭代。

基于一些技巧,比如梯度检查 (gradient checkpointing) 和 保持 EMA 模型 在内存 (RAM) 而不是虚拟内存 (VRAM) 中。整个优化过程能用一张 GPU 在一天内完成。

量化感知的训练之外呢 ?

量化模型本身就能带来模型消耗、加载、内存、推理速度上的显著提高。但量化模型蛮大的优势在能和其他模型优化方法一起,达到加速的增益效果。

最近,Facebook Research 针对视觉 Transformer 模型,提出了一个 Token Merging 方法。该方法的本质是用现有的方法 (取平均、取最大值等) 把冗余的 token 和重要的 token 融合。这在 self-attention 块之前完成,后者是 Transformer 模型最消耗算力的部分。因此,减小 token 的跨度能减少 self-attention 块消耗的时间。该方法也已被 Stable Diffusion 模型 采用,并在面向 GPU 的高分辨率优化上有可观的表现。

我们改进了 Token Merging 方法,以便用 OpenVINO,并在注意力 UNet 模型上采用 8-bit 量化。这包含了上述含知识蒸馏等的所有技术。对量化而言,其需要微调,以保证数值精度。我们也从 宝可梦数据集 上训练的 模型 开始优化和微调。下图体现了总体的优化工作流程。

94d371f4dd22a5e4831969503571d23e.png

结果的模型在有限资源的硬件上是高度有效的,如客户机或边缘 CPU。如上文所述,把 Token Merging 方法和量化方法叠加能带来额外的推理增益。

f4f67afe6eb5bd1e8eb32859353db35f.png
PyTorch FP32,推理时长:230.5 秒,内存消耗:3.44 GB
ea7bd7680ba396a840e0de9a1fc53b62.png
OpenVINO FP32,推理时长:120 秒 ( 1.9 倍),内存消耗:3.44 GB
a27fd998e9e7ea4125e42a6c646c455e.png
OpenVINO 8-bit,推理市场:59 秒 ( 3.9 倍),内存消耗:0.86 GB( 0.25 倍)
61ab039633ac8ba91a7a6b30ba714459.png
ToMe + OpenVINO 8-bit, 推理速度:44.6 秒 ( 5.1 倍),内存消耗:0.86 GB ( 0.25 倍)

用不同模型优化方法的图片生成的结果 展示。输入提示词为 “cartoon bird”,随机种子为 42。模型用 OpenVINO 2022.3,来自 Hugging Face Space,用“CPU 升级”的实例: 第三代 Intel® Xeon® Scalable Processors,和 Intel® 深度学习加速技术。

结果

我们用优化模型不完整的流程以得到两种模型: 基于 8-bit 量化的和基于 Token Merging 量化的,并和 PyTorch 作为基准比较。我们也把基准先转化成 vanilla OpenVINO (FP32) 的模型,以用以分析性比较。

上面的结果图展示了图像生成和部分模型的特性。如你所见,仅转化成 OpenVINO 就带来大的推理速度提高 ( 1.9 倍)。用基于 8-bit 的量化加速和 PyTorch 相比带来了 3.9 倍的推理速度。量化的另外一个重要提高在于内存消耗减少,0.25 倍之于 PyTorch,同时也提高了加载速度。在量化之上应用 Token Merging (ToME) (融合比为 0.4) 带来了 5.1 倍 的提速,同时把模型内存消耗保持在原水平上。我们不提供输出结果上的质量改变,但如你所见,结果还是有质量的。

下面我们展示将最终优化结果部署在 Intel CPU 上代码。

from optimum.intel.openvino import OVStableDiffusionPipeline

# Load and compile the pipeline for performance.
name = "OpenVINO/stable-diffusion-pokemons-tome-quantized-aggressive"
pipe = OVStableDiffusionPipeline.from_pretrained(name, compile=False)
pipe.reshape(batch_size=1, height=512, width=512, num_images_per_prompt=1)
pipe.compile()

# Generate an image.
prompt = "a drawing of a green pokemon with red eyes"
output = pipe(prompt, num_inference_steps=50, output_type="pil").images[0]
output.save("image.png")

在 Hugging Face Optimum Intel 库中你可以找到训练和量化 代码。比较优化过的和原模型的 notebook 代码在 这里。你可以在 Hugging Face Hub 上找到 OpenVINO 下的 许多模型。另外,我们在 Hugging Face Spaces 上建了一个 demo,以运行带第三代 Intel Xeon Scalable 的 r6id.2xlarge 实例。

一般的 Stable Diffusion 模型呢?

正如我们在宝可梦图像生成任务中展现的一样,仅用小量的训练资源,对 Stable Diffusion 管线实现高层次的优化是可能的。同时,众所周知,训练一般的 Stable Diffusion 模型是一个 昂贵的任务。但是,有充足的资金和硬件资源,用上述方法优化一般的模型生成高分辨率的模型是可能的。我们唯一的警告是关于 Token Merging 方法,其会减弱模型容忍性。这里衡量标准是,训练数据越复杂,优化模型时的融合比就该越小。

如果你乐于读本博客,那你可能对另外一篇 博客 感兴趣,它讨论了在第四代 Intel Xeon CPU 上其他互补的 Stable Diffusion 模型优化方法。

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟!


英文原文: https://hf.co/blog/train-optimize-sd-intel

作者: Alexander, Yury Gorbachev, Helena, Sayak Paul, Ella Charlaix

译者: Vermillion

审校/排版: zhongdongy (阿东)

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

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

相关文章

【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块3

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

2023机器人操作系统(ROS)暑期学校预热-线下时间/地点-(转发)

原文地址: https://mp.weixin.qq.com/s/McjBgCpecL6OMgpcrPyY_Q 中国机器人操作系统(ROS)暑期学校自2015年举办以来,被中国机器人业界和学界,以及ROS开源基金会誉为除了ROSCon之外规模最大、参与人数最多、最成功的RO…

Redis的4种分布式限流算法

限流 服务系统流量多,的确是一件好事,但是如果过载,把系统打挂了,那大家都要吃席了。 所以,在各种大促活动之前,要对系统进行压测,评估整个系统的峰值QPS,要做一些限流的设置,超过一定阈值,就拒绝处理或者延后处理,避免把系统打挂的情况出现。 限流和熔断有什么区…

ES6、ES7、ES8、ES9、ES10、ES11、ES12都增加了哪些新特性?

摘要: 前端开发的都知道,JavaScript经历了不同标本的迭代,从1到12的不断完善中会添加不同的新特性来解决前一个阶段的瑕疵,让我们开发更加便捷与写法更加简洁! 我记得我第一次接触js的时候是从大学的《21天精通JavaScr…

syri软件的安装

目录 1. 下载syri软件 ​2. 其他软件的安装和环境配置 3. plotsr软件的安装 1. 下载syri软件 网址:syri 该软件基于 3.5 版本 python,请提前使用 conda 创建 python 3.5 版本 环境并安装依赖模块 点击 view project on github 点击 9 release 我选择…

Matplotlib入门与实践(一)

Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误…

[Docker] Docker镜像管理和操作实践(二) 文末送书

前言: Docker镜像是容器化应用程序的打包和分发单元,包含了应用程序及其所有依赖项,实现了应用程序的可移植性和一致性。 文章目录 使用Dockerfile创建自定义镜像实践练手1. 创建基于ubuntu的自定义镜像,并安装nginx2. 配置Redis容…

React中 Real DOM 和 Virtual DOM 的区别?优缺点?

一、是什么 Real DOM,真实 DOM,意思为文档对象模型,是一个结构化文本的抽象,在页面渲染出的每一个结点都是一个真实 DOM 结构,如下: Virtual Dom,本质上是以 JavaScript 对象形式存在的对 DOM …

mysql索引的简单使用

删除 goods 表中的 goods_desc 字段及货号字段,并增加 click_count 字段 在 goods_name 列上加唯一性索引(用alter table方式) alter table add unique index uniqididx(goods_name);去查看索引 发现有goods_name的唯一索引 在 shop_price 列上加普通…

视频分类(Classification)和摘要(Captioning)总结

论文:Deep Learning for Video Classification and Captioning 视频分类是指将大量的视频数据按照一定的标准和规则进行分类和归类,以便于用户快速找到自己感兴趣的视频内容。视频分类可以基于不同的特征和属性进行,例如内容主题、风格、语言…

服务器数据恢复-HP服务器双循环校验raid5数据恢复案例

服务器数据恢复环境: 一台HP ProLiant DL系列某型号服务器,hp smart array控制器,挂载了一台国产磁盘阵列,磁盘阵列中是一组由十几块SCSI硬盘组建的RAID5,RAID中的冗余采用双循环的校验方式。 服务器操作系统为LINUX&a…

机器学习实战:Python基于LASSO回归进行正则化(十二)

文章目录 1 前言1.1 LASSO的介绍1.2 LASSO的应用 2. diabetes数据集实战演示2.1 导入函数2.2 导入数据2.3 拟合模型(AIC/BIC)2.4 AIC/BIC可视化2.5 拟合交叉验证模型及可视化 3. Hitters数据集实战演示3.1 导入函数3.2 导入数据3.3 数据预处理3.4 定义变…

Git全栈体系(二)

第四章 Git 分支操作 一、什么是分支 在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主…

STM32 DMA 传输类型调试记录

外设到内存 模式:单次、外设地址不自增,内存地址自增 hdma_usart1_rx.Instance DMA1_Channel5; // 使用通道 5 hdma_usart1_rx.Init.Direction DMA_PERIPH_TO_MEMORY; // 方向:外设 to 内存 hdma_usart1_rx.Init.PeriphInc DMA_PINC…

云开发校园微社区-二手交易兼职交友微信小程序

云开发校园微社区微信小程序开源源码,这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码,可以给你提供快捷方便的校园生活,有很多有趣实用的板块和功能,如:闲置交易、表白交友、疑问互答、任务兼职…

css3其他效果

1)媒体查询 不同分辨率下不同的样式,适应不同的屏幕 最大宽度,最小宽度 2)颜色渐变 渐变之后是一张图片 background-image 默认效果是从上到下(to bottom)的渐变 linear-gradient是线性渐变 要是想改变方…

udp如何传输大数据附udp高速传输技术解决方案

当遇到UDP传输大数据时,首先需要考虑使用专业的大数据传输软件或工具来满足UDP传输大数据的需求。其次,需要对UDP大数据传输的各个方面进行分析和优化,以确保传输的快速、安全、稳定和高效。 什么是UDP? UDP(用户数据…

算法和算法评价

1 算法的基本概念 1.1 算法是什么? 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每条序列指令表示一个或多个操作。 举例:程序 数据结构(要处理的信息) 算法(处理信息的步骤…

VMware vCenter Server 8.0安装并添加ESXi 7.0主机(含ESXi 6.7版本升级至7.0版本)

目录 一、VMware vSphere虚拟化方案名词梳理 1、VMware Workstation:虚拟化工具 2、VMware vSphere:虚拟化方案 2.1 ESXi:裸金属架构的虚拟化技术 2.2 vCenter Server:批量连接 ESXi 的管理工具 2.3 vSphere Client&#xf…

Linux--验证内存地址空间排布

验证&#xff1a; #include<stdio.h> #include<stdlib.h>int g_val1 10; int g_val2 20;int g_val3; int g_val4;int main(int argc, char* argv[], char* env[]) {//任务:验证进程地址空间//代码区printf("code address:%p\n", main);//只读常量区co…