渐进式模型剪枝加预处理对static diffusion文生图模型的优化

渐进式生成与模型压缩优化方案

一、赛题背景

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随着技术的飞速发展,人工智能技术已经成为推动社会变革的关键力量。在这个充满创新的时代,oneAPI技术堆栈崭露头角,为构建各种创新解决方案提供了巨大的潜力。在这一背景下,本次竞赛旨在深入探讨人工智能技术在特定领域的应用,涵盖机器学习、深度学习和数据分析等多个方面,同时为参赛者提供实践机会,通过解决问题和实现功能,更好地理解和运用oneAPI技术。

Stable Diffusion是2022年发布的深度学习图像化生成模型,它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如内补绘制、外补绘制,以及在提示词指导下产生图生图的翻译。

Stable Diffusion技术作为一种先进的生成模型,具有在生成图像任务中表现出色的潜力。然而,在实际部署中,要确保模型在端侧设备上的高效运行,需要面对一系列挑战,包括性能瓶颈和资源利用率。通过模型优化方案,参赛者将深入挖掘Stable Diffusion技术的性能潜力,结合oneAPI技术堆栈,实现在指定硬件平台上的部署优化,为生成图任务提供更高效、更稳定的解决方案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二、原理解读

文生图任务是指将一段文本输入到SD模型中,经过一定的迭代次数,SD模型输出一张符合输入文本描述的图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该模型主要可以分为三个部分:

  1. 变分编码器 Vector Quantised Variational AutoEncoder,VQ-VAE
  2. 扩散模型 Diffusion Model, DM
  3. 条件控制器 Conditioning

其中主要的VAE由编码器(Encoder)和解码器(Decoder)两部分组成:

在这里插入图片描述

Step 1. 输入图片Input通过编码器被到转换到潜在空间,得到潜在空间的图片表示Latent Image Input

Step 2. 配合ConditioningDiffusion ModelLatent Image Input进行处理,产生Latent Image Output

Step 3. 解码器将由Diffusion Model产生的Latent Image Output映射回像素空间,得到输出图片Output

图片通过VAE转换到低维空间,配合Conditioning的DM产生新的变量,再通过VAE将生成的变量转换为图片

例如赛题要求:

  1. Prompt输入:“a photo of an astronaut riding a horse on mars”
  2. Negative Prompt输入:“low resolution, blurry”

图片输出:512*512,24 Bit,PNG格式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

利用VAE的编码器将输入图片Input降维,得到Latent Image Input。利用训练好的DM,不断对图片进行噪声预测,并对Latent Image Input进行去噪,经过一定步骤后得到去除了噪声的Latent Image Output,最终通过VAE的解码器得到输出图片Output

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过text prompt得到的Embedding暂时还无法直接使用,还需要通过Transfomer 进行再加工才能喂给属于DM的噪声预测器。值得一提的是,Transformer是SD能够支持多模态的重要原因,它不仅能够处理text prompt生成的embedding,还能够处理类似图片、深度图等输入,将其转化为噪声预测器能够使用的数据。

Transfomer的输出会被噪声预测器多次利用,并且由于Transfomer的Cross Attention机制,它能够正确的利用text prompt中的内容。并且由于Transfomer的Self Attention机制,prompt能够被正确解读,例如"a photo of an astronaut riding a horse on mars",SD会将"astronaut"和"horse"组合。然后利用这个信息去影响噪声预测器的输出,让DM的逆向过程朝着带有”an astronaut riding a horse“的图像生成。

在这里插入图片描述

二、优化方向解析

我的项目具体实现是致力于解决在文生成图任务中,模型规模庞大导致的高存储需求和计算开销大的问题。具体方法是通过采用渐进式模型剪枝与量化策略配和CPU与GPU的混合使用,能够在不损失生成质量的前提下,逐步减小模型的大小,并提高模型的推理速度。(项目中具体实现了模型的剪枝,由于时间问题和学习学校课程,文章中的其他优化点还没有具体实现,其它的优化方案在本文中简要的做了说明,有兴趣的小伙伴可以联系wx一起探讨实现)

在模型优化方面,我主要关注神经元剪枝算法,通过精细的剪枝策略降低了模型的冗余部分,同时利用 OpenVINO 工具对模型进行文生成图预处理。利用 OpenVINO 工具套件的 Layout API 对输入进行预处理,一点一点微调,我在不牺牲生成质量和大小的前提下,逐步减小模型大小并提高推理速度,一点点实现了异步执行与 Pipeline 并行性,充分发挥此次大赛提供的硬件资源的优势,为端到端性能提升和硬件适应性提供了一体化的解决方案。(大家有更好的优化方案、想法可以一起讨论)

三、模型压缩方案

OpenVINO工具套件提供了一系列的模型优化工具,包括模型剪枝和量化等等,我的思路和实现也主要是基于这两套工具来对SD模型在比赛提供的硬件上进行模型训练和优化的。具体如下:

首先必不可少的当然是对于工具的利用:在改进数据管道和预处理加速中, OpenVINO 工具中有许多可用的方法 。

3.0 利用工具优化:

YOLOv5 Model INT8 Quantization based on OpenVINO™ 2022.1 POT API ...

我们的实例中主要运用的是以下两种API对于示例模型进行了一个简单优化处理,在GPU占用率上有了明显可见的下降,且相同配置参数下文生图时间间隔下降了0.4s。具体实现思路和伪代码如下(主要用于大家学习思路):

一、使用 OpenVINO 对输入进行预处理

  1. 在对Static Diffusion模型进行优化时,采用 OpenVINO 进行输入预处理是至关重要的。以下是将预处理步骤集成到模型中的具体思路:

    1. 声明 Tensor 格式: 首先,从实际用户数据中声明模型输入的 Tensor 格式,包括形状、布局、精度、颜色格式等。这样的声明有助于确保模型输入与实际推理数据的格式相匹配。
    2. 描述预处理步骤: 确定需要应用于用户数据的预处理步骤序列。这可能包括均值调整、尺度缩放、通道反转等,以确保输入数据满足模型的要求。通过 OpenVINO 的模型转换 API,可以方便地描述和配置这些预处理步骤。
    3. 指定模型数据格式: 对于 Static Diffusion 模型,模型的精度和形状通常是已知的,但需要指定其他信息,如布局等。通过 OpenVINO 提供的模型数据格式参数,可以将模型与实际推理数据正确对齐。
    4. 集成到模型中: 完成预处理步骤后,将这些步骤集成到模型中。通过 OpenVINO 提供的模型构建功能,可以轻松构建具备预处理功能的模型。
    # 示例代码
    from openvino
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值