统一量化,即对整个模型应用单一精度级别(如INT8或INT4),虽然简单,但通常是一种粗略的工具。大型语言模型(LLM)的某些部分对精度损失的敏感度天生高于其他部分。对敏感组件进行激进量化可能导致模型准确性或下游任务性能出现不可接受的下降。反之,将整个模型保持在较高精度级别可能无法满足严格的内存或延迟要求。混合精度量化提供了一种更精细的方法。其核心思想是根据模型不同部分的敏感度以及目标硬件的能力,策略性地应用不同的数值精度。这可以最大限度地提高计算效率和模型压缩率,同时最大限度地减少对预测性能的影响。例如,您可以将大部分计算量大的矩阵乘法量化为INT8甚至INT4,而将层归一化、激活函数或最终输出层等更敏感的组件保持在FP16或BF16精度。设计混合精度策略制定有效的混合精度策略需要仔细分析并考虑以下几个方面:敏感度分析: 识别哪些层或操作受精度降低的影响最大,这是非常重要的。经验分析: 这涉及逐个(或分组)量化特定层或模块,并使用相关指标(例如困惑度、任务准确性)在验证集上评估其影响。这种方法虽然直接,但计算量可能很大,需要多次部分量化和评估运行。启发式方法: 经验和架构理解可以提供有用的捷径。例如:输入嵌入层和输出层: 这些层通常处理直接输入表示或最终预测,可能更敏感。将它们保持在更高精度(例如FP16/BF16)是一种常见做法。激活函数和归一化: 非线性激活函数(如GeLU)或归一化层(LayerNorm)可能具有数值稳定性要求,更高精度能更好地满足这些要求。注意力机制: 在注意力块内部,不同的组件(Q、K、V投影、softmax、输出投影)可能表现出不同的敏感度。Softmax由于其指数函数特性,通常保持在FP16/FP32精度。分析方法: Hessian分析(检查损失函数的二阶导数)等技术可以提供参数对量化噪声敏感度的理论估计。与较大Hessian特征值相关的参数通常更敏感。这些方法虽然功能强大,但会增加分析复杂性。硬件能力: 目标部署硬件对精度选择影响很大。现代GPU和加速器通常具有专用单元,可以为特定格式(例如INT8张量核心)提供显著加速。最优策略会运用这些硬件加速。如果设备提供卓越的INT8性能但INT4支持有限,即使从模型大小角度看纯INT4量化似乎可行,优先INT8的策略可能也更受青睐。量化粒度: 正如之前讨论的(每张量与每通道/每组),粒度与混合精度相互关联。一个层可能对权重使用每通道INT8量化,但对激活值使用每张量FP16。常见的混合精度模式实践中出现了一些模式:权重与激活精度: 通常,权重可以比激活值更激进地量化。一种常见策略是权重采用INT4或NF4,激活值采用INT8或FP16。这平衡了权重量化带来的内存节省与推理过程中保持激活值动态范围的需求。特定层类型精度: 根据层类型分配精度是直接的做法。例如:Transformer块(注意力+MLP):INT8或INT4权重,INT8激活。嵌入层:FP16/BF16。层归一化:FP16/BF16。最终输出/LM头部:FP16/BF16。异常值感知精度: 如果某些层表现出明显的激活异常值(这对于低精度量化造成问题),这些特定层可能会保持在更高精度,或者将细粒度缩放或异常值截断等特定技术与混合精度结合使用。混合PTQ/QAT: 某些方法可能对大多数层使用PTQ,但选择性地对最敏感的层应用QAT以恢复准确性,从而形成量化方法和可能精度的组合。实施与评估实施混合精度量化通常涉及配置量化框架,以指定模型图内不同模块或操作所需的精度。这可能涉及根据模块名称或类型定义规则。然后,底层推理运行时(如TensorRT、ONNX Runtime或自定义内核)必须支持涉及多种数据类型的操作的有效执行。评估过程仍然非常重要。不仅要衡量标准准确性指标,还要衡量目标硬件上的推理延迟和内存占用。目标是找到权衡曲线上的最优解。{ "layout": { "title": "准确性与速度/压缩的权衡示意图", "xaxis": { "title": "压缩率/加速比(相对)" }, "yaxis": { "title": "模型准确性(例如:困惑度)" }, "legend": { "title": "量化策略" }, "template": "plotly_white", "shapes": [ { "type": "line", "x0": 1, "y0": 7.5, "x1": 4.5, "y1": 7.5, "line": { "color": "#868e96", "width": 1, "dash": "dash" } }, { "type": "line", "x0": 1, "y0": 8.0, "x1": 1, "y1": 9.5, "line": { "color": "#868e96", "width": 1, "dash": "dash" } } ], "annotations": [ { "x": 1, "y": 9.5, "text": "基线(FP16)", "showarrow": false, "xanchor": "left", "yanchor": "top" }, { "x": 4.5, "y": 7.5, "text": "激进量化(统一INT4)", "showarrow": false, "xanchor": "right", "yanchor": "bottom" } ] }, "data": [ { "type": "scatter", "mode": "markers+lines", "name": "统一INT8", "x": [2], "y": [9.0], "marker": { "color": "#228be6", "size": 10 } }, { "type": "scatter", "mode": "markers+lines", "name": "混合精度(INT8/FP16)", "x": [2.5], "y": [9.2], "marker": { "color": "#12b886", "size": 10 } }, { "type": "scatter", "mode": "markers+lines", "name": "混合精度(INT4/INT8/FP16)", "x": [3.5], "y": [8.8], "marker": { "color": "#fab005", "size": 10 } } ] }模型准确性(困惑度越低越好)与不同量化策略下的压缩和加速的综合效益之间的权衡。混合精度方法旨在以相似或更高的效率水平实现比激进统一量化更好的准确性。通过仔细选择不同模型组件的精度,混合精度量化提供了一个有力的工具来应对模型大小、推理速度、硬件能力和任务性能之间复杂的关系,使得在资源受限情境下部署高效LLM成为可能,而统一量化可能在此情境下不足。下一节将检查硬件如何专门加速这些量化操作。