节省显存新思路,在PyTorch里使用2 bit激活压缩训练神经网络

mac m1,m2 安装 提供GPU支持的pytorch和tensorflow mac m1,m2 芯片安装 anaconda, pytorch gpu版, tensorflow gpu版教程 阅读详情

©作者 | 郑怜悯、陈键飞

来源 | 机器之心

仅做学术分享,侵删.

随着超大规模深度学习模型逐渐成为 AI 的趋势,如何在有限的 GPU 内存下训练这些模型成为了一个难题。

本文将介绍来自加州伯克利大学的 ActNN,一个基于 PyTorch 的激活压缩训练框架。在同样的内存限制下,ActNN 通过使用 2 bit 激活压缩,可以将 batch size 扩大 6-14 倍,将模型尺寸或者输入图片扩大 6-10 倍。ActNN 相关论文已被 ICML 2021 接收为 Long Talk,代码开源于 github。

论文地址:

https://arxiv.org/abs/2104.14129

代码地址:

https://github.com/ucbrise/actnn

AI 训练撞上「内存墙」

从 AlexNet,ResNet 到 GPT-3,深度学习性能的突破都离不开模型规模的疯狂增长。大模型有更好的性能已经成为业界的共识。过去几年,不仅训练一个最先进模型需要的算力在指数增长,训练一个最先进模型需要的内存也在指数增长。如下图所示,大型 Transformer 模型的参数量以每两年翻 240 倍的速度指数增长。但是,单个 GPU 的内存却只以每两年翻 2 倍的速度在缓慢增长。另外,在训练模型时,不光要存储模型参数,还要存储中间结果激活值和优化器状态,所需要的内存更多。如何在有限的 GPU 内存下训练这些大规模模型成为了挑战。 

source:Gholami A, Yao Z, Kim S, Mahoney MW, Keutzer K. AI and Memory Wall. RiseLab Medium Blog Post, University of California Berkeley

节省训练内存的方法

目前,节省训练内存的方法主要有三类:1. 重计算(Gradient checkpointing/Rematerialization)  2. 使用 CPU 内存进行交换 (swapping)  和 3. 使用分布式训练将 Tensor 分散存储在多个 GPU 上。这三类方法互相不冲突,可以结合使用。大部分机器学习框架对这些方法都提供了一些支持,也有不少相关的论文。但是,想要高效、自动化地实现这些策略并不容易。

与已有方法不同,我们提出了 ActNN,一个新的基于压缩的内存节省框架。在提供理论证明的同时,我们基于 PyTorch 提供了一个高效易用的实现。Table.1 比较了 ActNN 和已有的一些内存节省系统。ActNN 支持 PyTorch 的动态图执行模式,并且不需要预先进行复杂的策略搜索。ActNN 作为一个独立的 Python 库,使用时 import 即可,不需要修改或重新编译 PyTorch。与已有的工作相比,ActNN 灵活且易于使用。同时,ActNN 在理论上也可以和已有的技术相互叠加。

ActNN:2 bit 激活压缩训练

在训练一个多层神经网络时,在前向传播中,每一层的中间结果都要被存下来用于计算反向传播的梯度。这些中间结果,又被叫做「激活值」(activation),实际上占据了大部分的内存消耗,尤其是在 batch size 较大或者输入图片较大的时候。ActNN 的原理是就是压缩这些激活值来节省内存。如下图所示,左图表示的是普通的前向传播和反向传播,前向传播时会存下所有层的 fp32 激活值用于反向传播,内存使用在计算 loss 的时候达到峰值。右图表示的是 ActNN 的训练方法:在前向传播时,通过一个压缩操作 Q 将激活值压缩后再存储;反向传播时,通过解压缩操作 Q^-1 将激活值解压再计算梯度。

如果只是为了节省内存,这里可以使用各种压缩算法,但是大部分现有的压缩算法并不能高效地运行在 GPU 上,会引入较大的开销。ActNN 选择了使用 2-bit 量化作为这里的压缩算法。量化操作的代价较小,而且有一些好的数学性质允许我们使用有损压缩达到较大的压缩比。

把 fp32 浮点数量化为 2-bit 整数是一个有损压缩,会引入一些误差。论文从理论上分析了量化引入的误差是如何影响训练的收敛性的。

第一,存在一个随机化的量化策略,使得使用有损量化压缩后,估计出的有损梯度是原梯度的一个无偏估计。

在这一条件下,我们套用已有的随机梯度下降收敛性定理,得出最后收敛时的误差会被梯度的方差所限制。

第二,我们推导出了使用量化压缩之后,随机梯度下降计算出的梯度的方差。

等号右边的第一项是随机梯度下降在 minibatch 采样时产生的方差,等号右边的第二项是有损压缩额外引入的方差。这条公式显示地刻画了有损压缩带来的影响。注意到,当有损量化压缩带来的方差远小于原来随机梯度下降自带的方差时,ActNN 引入的有损压缩就不会影响训练的收敛性。更多关于公式的推导和可视化参见文末的论文链接。论文对不同的算子(conv2d,batch norm,linear等)都提供了详细的分析。

 

由上述公式启发,我们提出了一些新的量化技巧用于降低有损压缩引入的额外方差。我们引入了新的量化技巧 ( Per-group Quantization,Fine-Grained Mixed-Precision,Runtime Adaptation) 来利用梯度在不同样本,不同纬度,不同层之间的异构特性。最后的压缩算法会分配更多的 bit 给更重要的激活值。平均每个浮点数分配到 2 bit。

在具体实现压缩算法时,还有很多可以调节的参数。这里产生了一个内存节省和训练速度的取舍。一般来说,使用更复杂的压缩算法可以节省更多的内存,但是也会引入更多额外的开销,使训练速度变慢。为了给用户较大的灵活性,ActNN 提供了 5 个优化等级 L1-L5 供用户选择。低的优化等级节省的内存较少,但是运行速度快。高的优化等级节省的内存多,但是运行也更慢。在最高优化等级 L5 下,ActNN 会结合一个简单的内存交换策略,将压缩后的激活值移到 CPU 内存上,进一步节省内存。

实现

要在 PyTorch 实现 ActNN 算法非常简单。对于一个 PyTorch nn Module,我们只需要在其 forward 函数里加入量化压缩,在其 backward 函数里加入解压缩操作。所有的计算还是在 fp32 下进行,与原来一样,伪代码如下图所示。

ActNN 为大部分常用的 PyTorch nn.Module 实现了使用量化压缩的版本。用户只需将模型里的所有 PyTorch nn.Module 替换成 ActNN 对应的 Module (如把 nn.Conv2d 替换成 actnn.Conv2d),即可节省内存,不需要更改其他代码。ActNN 同时也提供了一个 wrapper 实现一行代码自动替换。

实验结果

因为 ActNN 进行的是有损压缩,所以最重要的一点是先验证 ActNN 是否会影响模型的精度。下图是使用 ActNN 在 ImageNet 上训练 ResNet-50 的结果。FP 代表普通的 fp32 训练, BLPA 是来自 NeurIPS 2019 的一个相关工作。可以看到,在 ActNN 的 2-bit 压缩模式下,模型几乎没有损失精度。在更极限的 1.25 bit 的情况下,ActNN 也能收敛,只不过会损失一些精度。而之前的工作 BLPA 在小于 4 bit 的情况就下无法收敛。

我们还在图像分割,物体检测,以及自监督学习等多个任务上进行了实验。ActNN 都能在 2-bit 压缩模式下达到和普通 fp32 几乎一样的结果。在部分任务上,因为 ActNN 可以使用更大的 batch size,甚至可以取得更好的测试结果。详细的实验结果和训练记录参见文末的论文与 github 链接。

之后,我们对比了 ActNN 与普通 fp32 训练的实际内存使用情况。如下表所示,ActNN 可以将激活值占用的内存压缩 12 倍,将训练使用的总内存压缩 4 - 7 倍。这一实际内存压缩效果符合理论推导。为什么激活值压缩倍率是 12 而不是 32 bit / 2 bit = 16?主要是因为 ActNN 不能使用 inplace 的 ReLU,以及需要存储少量额外的 min 和 scale 用于解压缩。

最后,我们测试了 ActNN 的训练速度。因为 ActNN 在训练过程中进行了压缩,这些压缩在节省内存的同时也会引入额外的计算开销。一般来说,省得内存越多,进入的额外开销就越多,训练也就越慢。我们在 NVIDIA T4 (16 GB 内存) 上对比了 ActNN 和已有内存节省系统的训练速度。如下图所示,DTR (ICLR 2020),BLPA (NeurIPS 2019)和 swap 分别是基于重计算,压缩和内存交换的三种方法,红叉代表 Out-of-memory。y 轴是训练吞吐量 (images per second),越高越好。绿色的曲线是综合 ActNN 在不同优化等级下的最优结果。可以看到,ActNN 不仅能开到最大的 batch size(即最省内存),同时在所有 batch size 下都比 baseline 的训练速度更快。

我们还对更多的网络进行了测试。在同样的内存限制下,ActNN 可以将 batch size 扩大 6-14 倍,将模型尺寸或者输入图片扩大 6-10 倍。详细的实验设置和结果参见文末的论文链接。

两行代码即可在 PyTorch 中使用

import actnn
model = actnn.QModule(model)

ActNN 提供了一个自动模型转换封装。只需在训练脚本里插入两行代码,即可将普通的 PyTorch  模型转换为使用 ActNN 的模型。同时,ActNN 也提供了更高级的 API 支持定制化的使用场景。

更多的例子参见 github 链接。我们提供了在图像识别、图像分割、物体检测,以及自监督学习等多个任务上使用 actnn 的完整例子和训练记录,欢迎试用!

觉得还不错就给我一个小小的鼓励吧!

梯度检查点原理与实战:时间换空间的深度学习显存优化技术 梯度检查点(Gradient Checkpointing)是一种基于自动微分原理的显存优化技术,通过有选择地丢弃中间激活值并在反向传播时重计算,实现显存占用从线性O(L)降至次线性O(√L)。其本质是内存与计算的工程权衡,依赖深度学习模型的层状计算图结构,在Transformer、CNN等主流架构中效果显著。该技术不改变模型精度,但引入额外计算开销和数值稳定性风险,适用于显存受限但算力充足的训练场景。本文深入解析其数学原理、PyTorch三种落地实现(手动checkpoint、Hugging Face封装、 阅读详情

相关推荐

DeepSpeed ZeRO优化实战:突破大模型训练显存与通信瓶颈

大模型训练中的显存墙和通信墙,本质是GPU内存层级与分布式同步机制的结构性矛盾。ZeRO(Zero Redundancy Optimizer)通过参数、梯度、优化器状态的分层卸载与异步预取,将传统DDP的全量冗余存储转化为按需协同调度,实现显存占用降低85%的同时支持计算-通信重叠。其技术价值不仅在于加速,更在于让百亿参数模型在有限GPU资源下稳定启动与持续训练,支撑金融风控、医疗AI、AIGC等对工程确定性要求极高的落地场景。本文聚焦DeepSpeed ZeRO-3在真实产线中的配置逻辑、避坑要点与性能调

weixin_30740581的博客 349

Pytorch加速与优化:超参数调优、量化、剪枝

Python、PyTorch、超参数调优、量化、剪枝

FriendshipTang的博客 4091

神经网络压缩四步法:剪枝、重训、量化与霍夫曼编码

神经网络压缩是面向边缘部署与高效推理的核心技术,其本质在于系统性消除模型中的结构冗余、数值冗余、表示冗余和存储冗余。传统方法常依赖权重绝对值进行幅度剪枝,但易忽略参数在实际任务中的动态重要性;而Deep Compression提出的‘剪枝→重训→量化→霍夫曼编码’流水线,通过分层治理冗余,实现了精度不降反升的高效压缩。其中,剪枝聚焦连接重要性评估,重训补偿结构损失,量化适配硬件整数运算,霍夫曼编码进一步优化索引存储。该范式不仅适用于LeNet等轻量模型,其思想更可迁移至现代大模型的轻量化实践,成为AI落地的

张 作强 BLOG 522

pytoch M2芯片测试

今天才发现我的新片是M2芯片,而不是M1芯片,有点尴尬参考网址测试结果如下。

qq_45759229的博客 582

Unsloth:本地LLM微调与推理的显存加速利器

大模型本地部署常受限于显存容量和训练速度,全参微调7B模型动辄需要上百GB显存,普通开发者难以承受。参数高效微调(PEFT)与权重量化成为降低门槛的关键技术,LoRA、QLoRA等方案通过冻结原权重并训练低秩矩阵,大幅压缩显存占用;4bit量化则让模型体积进一步缩减。Unsloth作为开源加速框架,基于手写Triton算子和内核融合优化,在保持Transformers生态兼容的同时,显著提升训练速度并降低约80%显存消耗。其内置的QLoRA微调流程和GGUF导出能力,让开发者在消费级显卡上即可完成从数据准备

weixin_30888413的博客 306

VCSA 6.7证书过期别慌!手把手教你通过SSH修改系统时间恢复登录(附STS证书修复脚本)

本文详细介绍了VCSA 6.7证书过期的应急处理方案,包括通过SSH修改系统时间临时恢复登录、全面更新证书体系以及专项修复STS证书的实战步骤。文章还提供了后期验证和系统加固的建议,帮助运维人员有效应对证书过期问题,确保虚拟化平台的稳定运行。

weixin_31292729的博客 418

M2使用GPU版本的Pytorch

cuda是适配nvidia的GPU的,M1及以上芯片中的GPU适配的是mps,在Mac对应操作系统中已经具备,无需单独安装。只需要安装适配的pytorch即可。

weixin_44608943的博客 2477

MTK平台 MT6789 烧录 efuse 3.0 Configuration SOP

=====================生成cert1和cert2 key===============================================生成efuse key相关文件===========================================签名DA==========================================================正常编译。=====================Security3.0 的SOP 说明。

a785722173的博客 2334

节省显存新思路,在 PyTorch 里使用 2 bit 激活压缩训练神经网络(转载)

本文将介绍来自加州伯克利大学的 ActNN,一个基于 PyTorch 的激活压缩训练框架。在同样的内存限制下,ActNN 通过使用 2 bit 激活压缩,可以将 batch size 扩大 6-14 倍,将模型尺寸或者输入图片扩大 6-10 倍。ActNN 相关论文已被 ICML 2021 接收为 Long Talk,代码开源于 github。论文 https://arxiv.org/abs/2104.14129代码 https://github.com/ucbrise/actnn从 AlexNet,Res

weixin_41111187的博客 359

ROS环境下UR机械臂与Realsense相机手眼标定实战指南

本文提供了在ROS环境下,对UR机械臂与Realsense相机进行手眼标定的完整实战指南。详细介绍了从环境搭建、软件包安装、硬件配置到分步数据采集与计算的完整流程,并分享了常见的避坑技巧与精度优化方法,旨在帮助开发者高效、准确地完成标定,为后续的机器人视觉应用奠定坚实基础。

sunny的博客 648

详解MegatronLM序列模型并行训练(Sequence Parallel)

MegatronLM的第三篇论文是2022年出的。在大模型训练过程中显存占用过大往往成为瓶颈,一般会通过recomputation重计算的方式降低显存占用,但会带来额外的计算代价。这篇论文提出了两种方法,分别是和,这两种方法和Tensor并行是可以相结合的,可以有效减少不必要的计算量。下图中绿色部分表示不同模型中需要用于保存activation需要的显存大小,蓝色部分表示不同模型中需要用于保存parameter和optimizer state需要的显存大小。红色线表示A100的显存大小80G。

分享机器学习、深度学习、分布式计算、MLSys相关领域知识 1万+

PyTorch-CUDA-v2.9镜像如何量化大模型节省显存?bitsandbytes

借助PyTorch-CUDA Docker镜像与bitsandbytes库,通过4位和8位量化技术显著降低大模型显存占用,使Llama、Qwen等数十亿参数模型可在RTX 3090/4090等消费级显卡上高效运行。结合LoRA微调与容器化部署,实现低成本、可复现的本地大模型开发方案。

weixin_42113456的博客 1046

电力抄表协议DL/T645和698.45到底有啥区别?一张图帮你选对协议

本文深入对比了电力抄表协议DL/T645和DL/T698.45的技术差异,从协议架构、报文结构、功能覆盖到实施成本进行全面分析。通过实际案例和数据,揭示698.45协议在通信效率、业务扩展性和长期成本上的优势,并提供清晰的选型决策流程图,帮助工程师根据具体需求选择最适合的电力抄表协议。

weixin_38168696的博客 407

Unsloth如何节省显存?梯度检查点技术实战解析

本文介绍了基于星图GPU平台,如何自动化部署unsloth镜像以实现高效大模型微调。该平台集成4-bit量化与智能梯度检查点技术,显著降低显存占用,使Llama、Qwen等主流模型在消费级显卡上即可完成训练,大幅提升AI开发效率。

weixin_28895791的博客 750

告别第三方应用!用Android原生API搭建Miracast投屏接收器

本文深入探讨如何利用Android原生API开发Miracast接收器,绕过第三方依赖,实现高效的屏幕共享。通过Wi-Fi P2P直连、反射调用隐藏API和RTSP会话协商等核心技术,为开发者提供了一套完整的Miracast接收端解决方案,适用于多屏协同场景。

weixin_29174141的博客 404

Matlab R2018b简体中文版完整安装图文教程(附安装包下载)

目 录 一、安装过程 二、下载地址 matlab R2018b安装包如下所示,包括主程序和补丁文件两部分。 一、安装过程 双击安装包中的setup.exe。 选择使用文件安装MIYAO,点击下一步。 接受协议,选择是,点击下一步。 输入序列号:09806-07443-53955-64350-21751-41297,点击下一步。 修改安装路径,点击下...

智慧空间实验室 1万+

深度学习显存优化:梯度检查点技术原理与PyTorch实战

深度学习模型训练中的显存管理是核心挑战之一,尤其当面对大型模型时,传统的反向传播算法会导致显存占用随网络深度线性增长。梯度检查点技术通过时间-空间折中策略,选择性保存部分层的激活值,在反向传播时重新计算其余层,将显存占用从O(L)降低到O(√L)。这项技术在PyTorch中已有原生支持,可以与混合精度训练、梯度累积等技术结合使用,显著提升GPU资源利用率。在实际应用中,合理配置检查点间隔和batch size是关键,典型场景下可实现4-5倍的显存节省,虽然会带来约30%的计算时间开销,但为训练超大规模模型提

weixin_34238633的博客 338

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

low-bit-optimizers

大模型的训练和微调对显存要求很高,优化器状态是显存主要开销之一。近日,清华大学朱军、陈键飞团队提出了用于神经网络训练的 4 比特优化器,节省了模型训练的内存开销,同时能达到与全精度优化器相当的准确率。4 比特优化器在众多预训练和微调任务上进行了实验,在保持准确率无损的情况下可将微调 LLaMA-7B 的显存开销降低多达 5...

weixin_40410802的博客 263

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一训练就显存爆炸?Facebook 推出 8 比特优化器,两行代码拯救你的显存!

文 | jxyxiangyu编 | 小轶“小夕,小夕!又出来了个 SOTA 模型!赶紧 follow !”小夕看了看新模型的参数量, 然后看了看实验室服务器的几张小破卡。小夕,陷入了沉默。...

夕小瑶科技说 2374

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

GPT-4参数量与2%稀疏激活的工程真相

大语言模型中的稀疏激活(Sparse Activation)是MoE架构的核心机制,其本质是通过路由(Router)动态选择少量专家参与前向计算,从而在保持海量参数知识容量的同时显著降低单token推理FLOPs。该机制依赖Top-k路由策略、专家负载均衡训练及硬件级显存常驻设计,技术价值在于实现‘高容量+低延迟’的工程平衡,广泛应用于GPT-4、Qwen2-MoE、Mixtral等主流MoE模型的推理优化与部署调优。本文聚焦1.8万亿参数规模下每token约2%专家激活这一高频传播概念,还原其作为MoE子

weixin_33919950的博客 448

GPT-4的1.8万亿参数与2%稀疏激活真相解析

大语言模型中的条件计算(Conditional Computation)是突破算力瓶颈的核心范式,其本质是通过动态路由机制,在超大规模参数池中为每个输入token选择最优子集执行前向计算。MoE(Mixture of Experts)架构正是该范式的工程实现,以稀疏激活换取计算效率跃升——并非简单‘少用参数’,而是在1.8万亿参数总量下,通过Top-k路由与专家并行,将单token有效计算量压缩至稠密模型的约2%,从而跨越显存墙、带宽墙与能耗墙。这一技术已广泛应用于Qwen2-MoE、Mixtral等主流开

weixin_30680385的博客 436
上一篇: Python 一个超快的公共情报搜集爬虫 — Photon
下一篇: ​分享16个Matplotlib 绘图实用小技巧!
Wang_AI
博客等级 码龄12年 997粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值