跳到内容

量化无模型定义的模型

model_free_ptq 为无数据方案(如 FP8 动态按 Token 或 FP8 Block)提供了一种 PTQ 路径。具体来说,此路径消除了对模型定义或通过 transformers 加载模型的需求。如果您有兴趣应用无数据方案,以下两种关键场景应用此路径可能对您的模型有益:

  1. 模型未通过 transformers 提供模型定义。这可能是全新模型尚未集成到 transformers 中的情况。
  2. 模型非常大(例如 Kimi K2 Thinking),并且在使用 oneshot 时遇到问题。

model_free_ptq 直接处理 checkpoint 中的 safetensors,并应用观察器,从而消除了对模型定义或 transformers 的需求。

将 Kimi K2 Thinking 量化为 FP8 Block

kimi_k2_thinking_fp8_block.py 中,我们通过提供 schemeignore 列表来调用 model_free_ptq,这与我们向 oneshot 调用提供配方的方式类似。对于 Kimi-K2 Thinking,我们应用 FP8_BLOCK 方案,并忽略与 block_size 为 128 不兼容的层(具体来说是 kv_a_proj_with_mqaq_a_proj)。

oneshot 相比,我们期望直接传递模型存根或路径字符串,而不是先通过 transformers 加载。完成后,模型将使用 compressed-tensors 进行压缩,并保存到 SAVE_DIR

要开始,只需调用 model_free_ptq 并提供您想要的模型存根和保存目录。

model_free_ptq(
    model_stub="unsloth/Kimi-K2-Thinking-BF16",
    save_directory="Kimi-K2-Thinking-FP8-BLOCK",
    scheme="FP8_BLOCK",
    ignore=[
        "re:.*gate$",
        "lm_head",
        "re:.*kv_a_proj_with_mqa$",
        "re:.*q_a_proj$",
        "model.embed_tokens",
    ],
    max_workers=15,
    device="cuda:0",
)

将模型量化为 NVFP4A16/ MXFP4A16

使用 model_free_ptq 量化具有微尺度方案(NVFP4/MXFP4)的模型与量化非微尺度方案的模型相同,只是增加了一个额外的步骤。这个额外的步骤是必须对模型文件中的 safetensors 进行重新索引,以确保融合模块(qkv, gate_up)最终位于同一个 safetensors 文件中,这使得 model_free_ptq 能够融合全局尺度。

首先,从命令行入口点应用 llmcompressor.reindex_fused_weights

llmcompressor.reindex_fused_weights \
    unsloth/Kimi-K2-Thinking-BF16 \
    Kimi-K2-Thinking-BF16-reindexed \
    --num_workers=10

然后,在重新索引文件上调用 model_free_ptq

model_free_ptq(
    model_stub="Kimi-K2-Thinking-BF16-reindexed",
    save_directory="Kimi-K2-Thinking-BF16-NVFP4A16",
    scheme="NVFP4A16",
    ignore=[
        "re:.*gate$",
        "lm_head",
        "re:.*kv_a_proj_with_mqa$",
        "re:.*q_a_proj$",
        "model.embed_tokens",
    ],
    max_workers=15,
    device="cuda:0",
)