一步一步理解大模型:模型量化技术3 - GPTQ

本文介绍专门为生成式预训练模型设计的量化技术GPTQ

GPTQ是一种一次性权重量化方法,专为生成预训练Transformer(GPT)模型设计。该方法基于近似二阶信息,旨在实现高度准确和高效。

关于GPTQ的关键点:

  1. GPTQ可以在大约四个GPU小时内量化具有1750亿参数的GPT模型,将位宽减少到每个权重的3或4位,与未压缩的基线相比,准确性降低可以忽略不计。

  2. 该方法的压缩增益是以前提出的一次性量化方法的两倍多,保持了准确性,使我们首次能够在单个GPU内执行1750亿参数的模型进行生成推断。

  3. GPTQ还表明,即使在极端量化情况下,也可以提供合理的准确性,其中权重被量化为2位甚至三元量化级别。

  4. 该方法可以用于端到端推断加速,相对于FP16,使用高端GPU(NVIDIA A100)时约为3.25倍,使用更经济实惠的GPU(NVIDIA A6000)时为4.5倍。

  5. GPTQ是首个表明可以将具有数百亿参数的极度准确的语言模型量化为每个组件3-4位的方法。之前的后训练方法只能在8位时保持准确,而之前的基于训练的技术只处理了比这小一个到两个数量级的模型。

  6. GPTQ遵循最先进的后训练量化方法的结构,通过逐层进行量化,为每一层解决相应的重建问题。

  7. 该方法基于最近提出的Optimal Brain Quantization(OBQ)方法,进行了一系列重大修改,使其能够扩展到大型语言模型,提供超过三个数量级的计算加速。

更详细的信息可以在这里查看完整的论文。

我们可以在这里找到羊驼(LLaMA)模型的GPTQ源代码:https://github.com/qwopqwop200/GPTQ-for-LLaMa/blob/triton/quant/quantizer.py

关键函数为:

    def _quantize(self, x, scale, zero, maxq):
        if maxq < 0:
            return (x > scale / 2).float() * scale + (x < zero / 2).float() * zero
        q = torch.clamp(torch.round(x / scale) + zero, 0, maxq)
        return scale * (q - zero)

这段代码是执行量化操作的内部方法,根据给定的缩放因子、零点和最大量化值对输入进行量化。

量化操作包括以下几个步骤:

  1. 缩放:将输入张量x除以缩放因子scale。这一步是为了将x的值范围调整到预期的量化范围。

  2. 四舍五入:将缩放后的结果四舍五入到最近的整数。这一步是为了将x的值离散化,即将其转换为整数。

  3. 限制范围:使用torch.clamp函数将四舍五入后的结果限制在0和maxq之间。这一步是为了确保量化后的值不会超出预期的量化范围。

  4. 反缩放:将量化后的张量减去零点zero,然后乘以缩放因子scale。这一步是为了将量化后的值恢复到原始的值范围。

你可能感兴趣的:(深度学习,人工智能)