训练后量化 (PTQ) 方法,例如 GPTQ 和 AWQ,无需对模型进行完整重新训练即可运行。它们依赖于一小部分精心挑选的数据,称为校准数据集,用于确定模型权重(有时也用于激活值)的最佳量化参数(例如缩放因子 $s$ 和零点 $z$)。可以将此数据集视为一种探针,用于了解在推理过程中流经模型的值的典型范围和分布。此校准数据的质量和代表性直接影响量化过程的成效以及量化模型的最终精度。校准数据的作用在 PTQ 过程中,校准数据集会输入到预训练模型(或其部分)中。随着数据传播,量化算法会观察权重的统计数据,对于某些方法而言,更重要的是中间激活值。例如,简单的最小/最大量化直接使用校准集中观察到的最小和最大激活值来定义裁剪范围,然后映射到低位表示。更精细的算法,例如 GPTQ 和 AWQ,以更复杂的方式使用校准数据。它们通常解决逐层重构问题,试图找到量化权重 ($W_q$),使从校准集获取的输入 $x$ 的原始层 ($W \cdot x$) 输出与量化层 ($W_q \cdot x$) 输出之间的差异最小化。$$ \underset{W_q}{\text{最小化}} || W \cdot X - W_q \cdot X ||^2_F $$这里,$X$ 代表通过前置层运行校准数据收集到的输入激活值。这种优化可以确保量化参数的选择不仅仅基于静态权重范围,而是基于权重如何与典型的激活模式作用。选择有代表性的数据主要目的是选择一个能准确反映模型在实际部署中将遇到的数据分布的校准数据集。如果校准数据在统计上与推理数据不同,计算出的量化参数 ($s, z$) 将不理想,可能导致精度明显下降。数据来源考量这些数据应从何处获取?有几个可选方案:训练数据子集: 从原始训练数据集中抽取的小型随机样本通常是一个不错的起始点,因为它通常反映了用于构建模型表示的数据。验证数据子集: 使用部分验证集也很常见,特别是当它已知能代表目标任务分布时。特定任务数据: 如果大型语言模型 (LLM) 部署用于特定的下游任务(例如,总结、代码生成、医学文本问答),使用能代表该特定任务场景的未标记数据样本会非常有效。这有助于根据目标应用中遇到的具体激活分布来调整量化参数。数据量:寻找平衡点多少数据量才足够?校准时间和统计图景的完整性之间存在权衡。输入数千个样本可能提供略微更稳定的统计数据,但会大幅增加 PTQ 过程本身所需的时间(PTQ 涉及前向传播和优化)。研究和实验结果,特别是对于 GPTQ 等方法,表明相对较小的数据集通常就足够了。常用的大小范围从 128 到 1024 个样本。重点在于多样性而非纯粹的数量。一个更小、更具多样性且能捕获各种激活模式的集合通常优于一个庞大、单一的集合。数据多样性:捕获差异确保所选样本涵盖各种预期输入。对于大型语言模型 (LLM) 而言:包含不同长度的提示。使用不同的语气和风格(提问、陈述、命令)。如果特定于应用场景,涵盖该场景内的各个子主题。对于代码模型,包含不同的语言、函数和复杂程度。仅使用非常相似的输入(例如,仅使用“你好”和“你好吗?”来校准聊天机器人 LLM)将导致量化参数不适用于更复杂或多样的对话,很可能造成明显的性能下降。准备校准数据选定后,原始校准数据需要进行预处理,以匹配大型语言模型 (LLM) 所需的精确输入格式。分词: 使用与预训练模型和推理过程中使用的完全相同的分词器。分词不匹配是常见的错误源。这包括遵循特殊 token、填充策略和最大序列长度。格式化: 根据模型的需要组织分词后的输入。这可能涉及创建注意力掩码、位置 ID 或特定提示模板(如果模型使用这些)。序列长度: 考虑序列长度。虽然校准不一定需要使用模型支持的绝对最大序列长度,但使用的长度应能代表典型的推理场景。仅使用非常短的序列可能无法充分捕获与更长生成相关的激活统计数据。通常,最好根据预期用途和校准期间的内存限制,使用混合长度或将样本填充/截断到合理长度(例如,512、1024 或 2048 个 token)。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fillcolor="#e9ecef", style="filled,rounded"]; edge [fontname="sans-serif", color="#495057"]; 原始数据 [label="原始校准文本\n(例如,句子,代码)"]; 分词器 [label="模型专用\n分词器"]; 模型输入 [label="格式化模型输入\n(Token ID,注意力掩码)"]; 大型语言模型 [label="预训练大型语言模型\n(浮点)", shape=cylinder, fillcolor="#a5d8ff"]; 统计数据收集器 [label="统计数据收集\n(激活值:最小/最大,分布)", shape=note, fillcolor="#ffec99"]; PTQ 算法 [label="PTQ 算法\n(例如,GPTQ,AWQ)", shape=cds, fillcolor="#b2f2bb"]; 量化参数 [label="量化参数\n(缩放因子,零点)", shape=folder, fillcolor="#bac8ff"]; 原始数据 -> 分词器 [label=" 处理 "]; 分词器 -> 模型输入 [label=" 格式化 "]; 模型输入 -> 大型语言模型 [label=" 前向传播 "]; 大型语言模型 -> 统计数据收集器 [label=" 观察激活值\n(每层)"]; 统计数据收集器 -> PTQ 算法 [label=" 提供统计数据 "]; 模型输入 -> PTQ 算法 [label=" 提供输入(用于重构)"]; // 为 GPTQ/AWQ 等方法添加 PTQ 算法 -> 量化参数 [label=" 计算 "]; }流程图,展示了训练后量化过程中校准数据如何处理以生成量化参数。常见问题与注意事项应用场景不匹配: 使用与目标推理任务截然不同的应用场景的校准数据(例如,对代码生成任务使用新闻文章进行校准)是量化模型性能不佳的常见原因。多样性不足: 如前所述,缺乏多样性可能导致不准确的范围估计。预处理不正确: 未能复制推理过程中使用的精确分词和输入格式将使校准过程失效。选择和准备合适的校准数据集是成功进行 PTQ 的重要步骤。虽然 PTQ 避免了重新训练的成本,但它将精力转移到仔细的数据选择和准备上,以确保生成的量化模型在获得显著效率提升的同时,尽可能多地保留精度。这里讨论的技术为应用 GPTQ 和 AWQ 等方法时做出明智选择提供了依据,你将在后续章节中实现这些方法。