跳到内容

应用变换以提高量化精度

此目录包含示例脚本,用于将变换应用于模型以提高量化精度。有关变换的更多信息,请参阅 QuaRot: Outlier-Free 4-Bit Inference in Rotated LLMs。目前支持的两种变换样式是 SpinQuant/QuaRot 风格 (SpinQuantModifier) 和 QuIP 风格 (QuIPModifier)。

另请参阅 [vLLM Office Hours #31] vLLM 和 LLM Compressor 更新 - 2025 年 8 月 28 日

安装

要开始,请执行以下命令来安装必要的依赖项

git clone https://github.com/vllm-project/llm-compressor.git
cd llm-compressor
pip install -e .

快速入门

提供的示例脚本演示了在量化之前应用 QuIP 风格变换的过程。

python3 quip_example.py

步骤 1:选择模型、数据集和配方

在此步骤中,您将选择一个用于量化的基础模型以及一个变换 + 量化配方。

  • 模型:可以从本地目录引用,也可以从 Hugging Face Hub 检索。
  • 配方:这些是 YAML 文件或 Python 修饰器对象,用于描述模型在训练期间或之后应如何进行优化。在此示例中,我们在 QuantizationModifier 之前使用 QuIPModifier,并将方案设置为 FP8
from llmcompressor.modifiers.transform import QuIPModifier
from llmcompressor.modifiers.quantization import QuantizationModifier

recipe = [
    QuIPModifier(
        rotations=["v", "u"], transform_block_size=128, transform_type="hadamard"
    ),
    QuantizationModifier(targets="Linear", scheme="W4A16", ignore=["lm_head"]),
]

请注意,QuIPModifier 是可自定义的。有关可用参数的完整列表,请参阅 文档字符串 或文档。

  • rotations 决定了使用输入旋转 (v) 还是输出旋转 (u)。
  • transform_block_size 决定了 hadamard 的大小。较小的 hadamard 在运行时成本较低。
  • transform_type 决定了变换的构造方式。hadamard 使用 Sylvester 构造。

步骤 2:使用 Oneshot 运行量化

oneshot 方法将所选配方应用于您的模型和数据集,而无需进行任何微调。模型将被量化并保存到 Llama-3.1-8B-Instruct-quip-w4a16。我们使用 "datafree" 管道,因为我们的配方不需要校准数据。

from llmcompressor import oneshot

# Apply algorithms.
oneshot(model=model, recipe=recipe, pipeline="datafree")

# Save to disk compressed.
SAVE_DIR = MODEL_ID.split("/")[1] + "-quip-w4a16"
model.save_pretrained(SAVE_DIR, save_compressed=True)
tokenizer.save_pretrained(SAVE_DIR)

步骤 3:在 vLLM 中运行优化后的模型

使用 hadamard 变换类型优化的模型将能够利用 hadacore 内核来加速推理。使用 benchmarks/latency.py 脚本来测试延迟

python3 benchmarks/benchmark_latency.py --model path/to/Llama-3.2-1B-Instruct-quip-w4a16

密集模型延迟(秒)

Base Hadacore GEMM
0.4710 0.4948 1.3946

量化模型延迟(秒)

Base W4A16 Hadacore GEMM
0.4402 0.4489 1.2917