100亿参数的语言模型跑不动?MIT华人博士提出SmoothQuant量化,内存需求直降一半,速度提升1.56倍!(2)

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 100亿参数的语言模型跑不动?MIT华人博士提出SmoothQuant量化,内存需求直降一半,速度提升1.56倍!

3、异常值固定在某一通道中出现。


异常值只在很小一部分的通道中才会出现,但如果一个通道中有一个异常值,那该异常值可能会在所有的token中出现。



给定一个token中所有通道的方差会很大(一些通道会非常大,但大部分很小),但是给定一个通道在所有token度中的方差会很小(异常值通道会很大)。


由于异常值具有持续出现和每个通道内小方差的特点,那如果对激活执行per-channel量化,其量化误差将会远远小于per-tensor量化。


通过一个简单的实验,其结果再次验证了研究人员的想法,量化到INT8时,per-channel的准确率远远高于per-tensor和per-token量化,和FP16基线准确率相差无几。



研究人员通过使用一个per-channel平滑因子s来将输入激活进行平滑(smooth)。为了保持线性层的数学等价,还需要反向缩放权重。



由于输入X通常是由之前的线性操作生成的(如线性层、层norms等),所以就可以很容易地将平滑因子融合到之前层的参数offline,而且不会产生额外缩放的内核调用开销。对于其他情况,比如当输入来自残差add时,可以向残差分支添加一个额外的缩放。


将量化难度从激活转移到权重


Smooth的目标是选择一个per-channel的平滑因子s,使该逆操作更易于量化。

为了减少量化误差,应该增加所有通道的有效量化比特。当所有通道的最大magnitude相同时,总的有效量化位数将是最大的。


因此,一个最直接的平滑因子选择就是输入中每个通道的最大值,可以保证在划分之后,所有的激活通道都有相同的最大值,从而实现更容易的量化。


但需要注意的是,激活的范围是动态的,对于不同的输入样本是不同的。所以研究人员使用预训练数据集中的校准样本来估计激活通道的规模。


由于这个公式将所有的量化困难迁移给了权重,可以发现在这种情况下,权重的量化误差会很大,导致准确性下降很多。



另一方面,也可以通过选择sj = 1/ max(|Wj |),将所有的量化难度从权重推到激活上。同样,由于激活量化误差过大,模型的性能也不好。因此需要在权重和激活之间分割量化难度,使它们都易于量化。


研究人员引入一个超参数迁移强度α,来控制要从激活迁移到权重的难度。



可以发现,对于大多数模型,例如OPT和BLOOM模型,α=0.5是一个很好的平衡点,可以平均分配量化难度,特别是使用相同的量化器进行权重和激活。


该公式保证了相应通道的权重和激活具有相似的最大值,从而共享相同的量化难度。



对于其他一些激活异常值比较大的模型,例如GLM-130B有30%的异常值,这对激活量化来说比较困难,可以选择一个较大的α(如0.75),将更多的量化难度迁移到权重上。


SmoothQuant应用于Transformer块


线性层占据了LLM模型的大部分参数和计算。在默认情况下,SmoothQuant对Transformer中所有线性层的输入激活进行比例平滑,并用W8A8对线性层进行量化,在注意力计算中启用了BMM运算符的量化。



在流程中,首先用INT8对线性层和注意力层中的BMM等计算量大的运算符的输入和权重进行量化,而对其他轻量级元素的运算,如Softmax和LayerNorm,保持激活为FP16,这样的设计有助于平衡准确性和推理效率。


实验部分


研究人员选择了三个大型语言模型用来评估SmoothQuant,包括OPT, BLOOM和GLM-130B;并使用七个zero-shot任务,包括LAMBADA, HellaSwag, PIQA, WinoGrande, OpenBookQA, RTE, COPA等。


实验结果显示SmoothQuant可以处理非常大的LLM的量化问题,其激活更难量化。



SmoothQuant可以在所有评估数据集上匹配FP16的准确性,而W8A8、ZeroQuant和Outlier Suppression基线产生的结果几乎是随机的。



并且SmoothQuant可以无损地量化所有超过100B参数的开放式LLMs

SmoothQuant的O1和O2级成功地保持了浮点精度,而O3级(per-tensor static)使平均精度下降了0.8%,可能是因为静态收集的统计数据与真实评估样本的激活统计数据之间的差异。


尽管如此,SmoothQuant-O1可以与FP16的准确性相匹配,而SmoothQuant-O3只降低了1%的准确性,明显优于基线。


SmoothQuant不仅对超过100B参数的非常大的LLM有效,而且对较小的LLM也有稳定的效果,SmoothQuant可以在所有规模的OPT模型上工作,并与INT8量化的FP16精度相匹配。



为了展示集成到PyTorch和FasterTransformer中的SmoothQuant-O3的速度提升和内存节省,研究人员我们测量了一次生成一批4个句子的所有隐藏状态的端到端延迟,也就是context阶段的延迟,并记录了这个过程中GPU内存使用的峰值。


由于Huggingface缺乏对模型并行的支持,所以研究人员只测量了SmoothQuant在单个GPU上的PyTorch实现的性能,因此选择了OPT-6.7B、OPT-13B和OPT-30B进行评估。


在FasterTransformer库中,SmoothQuant可以与Tensor Parallelism算法无缝对接,因此研究人员在OPT-13B、OPT-30B、OPT-66B和OPT-175B上测试SmoothQuant的单GPU和多GPU基准。


在NVIDIA A100 80GB GPU服务器上进行的实验结果显示,基于PyTorch实现的推理延迟和峰值内存使用上,SmoothQuant始终比FP16基线快,当序列长度为256时,在OPT-30B上获得了1.51倍的速度提升。



还可以看到一个趋势,即模型越大,加速越明显,但LLM.int8()几乎总是比FP16基线慢,这也是由于混合精度激活表示的巨大开销造成的。


在内存方面,SmoothQuant和LLM.int8()都可以将FP16模型的内存用量几乎减半,而SmoothQuant由于完全使用INT8 GEMM,所以节省的内存稍多。



与FasterTransformer对OPT的FP16实现相比,SmoothQuant-O3在使用单个GPU时可以进一步降低OPT-13B和OPT-30B的执行延迟,最高可达1.56倍。


参考资料:https://www.reddit.com/r/MachineLearning/comments/z1b2rp/r_smoothquant_accurate_and_efficient_posttraining/

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
5月前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
120 4
|
2月前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
21 2
|
2月前
|
安全 异构计算
为大型语言模型 (LLM) 提供服务需要多少 GPU 内存?
为大型语言模型 (LLM) 提供服务需要多少 GPU 内存?
78 0
为大型语言模型 (LLM) 提供服务需要多少 GPU 内存?
|
3月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
5月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
60 0
|
5月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
148 0
|
3月前
|
人工智能
Adam有了mini版:内存占用少一半,吞吐量提升50%
【7月更文挑战第18天】研究人员推出Adam-mini,针对AdamW的轻量化版本,旨在降低内存占用并提升训练大型模型的效率。通过参数分块和共享学习率,Adam-mini在70亿参数模型上实现50%内存节省,同时提高训练吞吐量50%,加速训练过程。然而,仍需考虑计算开销、通信成本及适用性问题。论文链接:[arxiv.org/pdf/2406.16793](https://arxiv.org/pdf/2406.16793)
54 3
|
3月前
|
存储 缓存 监控
Flink内存管理机制及其参数调优
Flink内存管理机制及其参数调优
|
3月前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
42 0
|
5月前
|
存储 弹性计算 运维
调整虚拟机内存参数的 shell 脚本
【4月更文挑战第29天】
65 2