文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

树莓派上运行 Stable Diffusion,260MB 的 RAM「hold」住 10 亿参数大模型

2024-11-30 11:25

关注

现在,它甚至已经可以在 Raspberry Pi Zero 2 上运行了。

图片

Raspberry Pi Zero 2 「Just as small. Five times as fast.」

这是怎样一个概念?运行 Stable Diffusion 并不是一件容易的事,它包含一个 10 亿参数的大型 Transformer 模型,建议使用的最低 RAM/VRAM 通常为 8GB。而 RPI Zero 2 只是内存为 512MB 的微型计算机。

这意味着在 RPI Zero 2 上运行 Stable Diffusion 是一个巨大的挑战。而且,在运行过程中,作者没有增加存储空间,也没有将中间结果卸载到磁盘上。

一般而言,主要的机器学习框架和库都专注于最小化推理延迟和 / 或最大化吞吐量,但以上这些都以内存使用为代价。因此,作者决定写一个超小的、可解开的推理库,致力于将内存消耗最小化。

OnnxStream 做到了。

 

项目地址 https://github.com/vitoplantamura/OnnxStream

OnnxStream 基于将推理引擎与负责提供模型权重的组件解耦的思路,后者是派生自 WeightsProvider 的一个类。一个 WeightsProvider 的专门化可以实现任何类型的模型参数加载、缓存和预取。例如,一个自定义的 WeightsProvider 可以决定直接从 HTTP 服务器下载数据,而不加载或写入任何内容到磁盘(这也是 OnnxStream 命名中有 Stream 的原因)。有两个默认的 WeightsProviders 可用:DiskNoCache 和 DiskPrefetch。

与微软的推理框架 OnnxStream 相比,OnnxStream 只需要消耗 1/55 的内存就可以达到同样的效果,但(在 CPU 上的)速度只比前者慢 0.5-2 倍。

接下来你将看到 Stable Diffusion 在 RPI Zero 2 上运行的效果,以及背后的方法。需要注意的是,虽然运行速度较慢,但是它是大模型在更小、更有限的设备上运行的崭新尝试。

图片

 网友们认为这个项目很酷

将 Stable Diffusion 在 Raspberry Pi Zero 2 上运行

VAE 解码器是 Stable Diffusion 中唯一无法以单精度或半精度放入 RPI Zero 2 RAM 的模型。这是因为模型中存在残差连接、非常大的张量和卷积。唯一的解决办法就是静态量化(8 bit)。

以下这些图像是由作者 repo 中包含的 Stable Diffusion 示例实现在不同精度的 VAE 解码器下使用 OnnxStream 生成的。

第一张图像是在作者的 PC 上生成的,使用了由 RPI Zero 2 生成的相同的 latent。

精度为 W16A16 的 VAE 解码器的生成效果

精度为 W8A32 的 VAE 解码器的生成效果

第三张图由 RPI Zero 2 在大约 3 小时内生成。

图注:精度为 W8A8 的 VAE 解码器的生成效果

OnnxStream 的特点

并且需要注意的是,OnnxStream 依赖 XNNPACK 来加速某些原语:MatMul、Convolution、element-wise Add/Sub/Mul/Div、Sigmoid 和 Softmax。

性能对比

Stable Diffusion 由三个模型组成:文本编码器(672 次运算和 1.23 亿个参数)、UNET 模型(2050 次运算和 8.54 亿个参数)和 VAE 解码器(276 次运算和 4900 万个参数。

假设批大小等于 1,生成完整图像则需要 10 步,这需要运行 2 次文本编码器、运行 20 次(即 2*10)UNET 模型和运行 1 次 VAE 解码器,才能获得良好效果(使用 Euler Ancestral 调度器)。

该表显示了 Stable Diffusion 的三个模型不同的推理时间,以及内存消耗(即 Windows 中的 Peak Working Set Size 或 Linux 中的 Maximum Resident Set Size)。

可以发现,在 UNET 模型中(以 FP16 精度运行时,OnnxStream 中启用了 FP16 算术),OnnxStream 的内存消耗量仅为 OnnxRuntime 的 1/55,但速度只慢 0.5-2 倍。

这次测试需要注明的几点是:

注意力切片与量化

在运行 UNET 模型时,采用「注意力切片」技术,并对 VAE 解码器使用 W8A8 量化,这对于将模型内存消耗降低到适合在 RPI Zero 2 上运行的水平至关重要。

虽然互联网上有很多关于量化神经网络的信息,但关于「注意力切片」的却很少。

这里的想法很简单:目标是在计算 UNET 模型中各种多头注意力的缩放点积注意力时,避免生成完整的 Q @ K^T 矩阵。在 UNET 模型中,注意力头数为 8 时,Q 的形状为 (8,4096,40),同时 K^T 为 (8,40,4096)。因此,第一个 MatMul 的最终形状为 (8,4096,4096),这是一个 512MB 的张量(FP32 精度)。

图片

解决方案是垂直分割 Q,然后在每个 Q 块上正常进行注意力操作。Q_sliced 形状为 (1,x,40),其中 x 为 4096(在本例中),除以 onnxstream::Model::m_attention_fused_ops_parts(默认值为 2,但可以自定义。

这个简单的技巧可以将 UNET 模型以 FP32 精度运行时的整体内存消耗从 1.1GB 降低到 300MB。一个更高效的替代方案是使用 FlashAttention,但是 FlashAttention 需要为每个支持的架构(AVX, NEON)等编写自定义内核,在作者给出的例子中绕过 XnnPack。

更多信息参见该项目的 GitHub 界面。

来源:机器之心内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯