量化无模型定义的模型
model_free_ptq 为无数据方案(如 FP8 动态按 Token 或 FP8 Block)提供了一种 PTQ 路径。具体来说,此路径消除了对模型定义或通过 transformers 加载模型的需求。如果您有兴趣应用无数据方案,以下两种关键场景应用此路径可能对您的模型有益:
- 模型未通过 transformers 提供模型定义。这可能是全新模型尚未集成到 transformers 中的情况。
- 模型非常大(例如 Kimi K2 Thinking),并且在使用
oneshot时遇到问题。
model_free_ptq 直接处理 checkpoint 中的 safetensors,并应用观察器,从而消除了对模型定义或 transformers 的需求。
将 Kimi K2 Thinking 量化为 FP8 Block
在 kimi_k2_thinking_fp8_block.py 中,我们通过提供 scheme 和 ignore 列表来调用 model_free_ptq,这与我们向 oneshot 调用提供配方的方式类似。对于 Kimi-K2 Thinking,我们应用 FP8_BLOCK 方案,并忽略与 block_size 为 128 不兼容的层(具体来说是 kv_a_proj_with_mqa 和 q_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。