ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

NVIDIA Model Optimizer Local-Hessian:基于局部 Hessian 的 NVFP4 逐块权重缩放算法实战指南

NVIDIA Model Optimizer Local-Hessian:基于局部 Hessian 的 NVFP4 逐块权重缩放算法实战指南 【免费下载链接】Model-OptimizerA unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks like TensorRT-LLM, TensorRT, vLLM, etc. to optimize inference speed.项目地址https://gitcode.com/GitHub_Trending/te/Model-Optimizer点击查看免费下载本篇技术指南深入讲解 NVIDIA Model Optimizer 中的Local-Hessian权重缩放算法它针对 NVFP4 逐块per-block缩放因子的选择问题以矩阵乘法的输出误差而非权重误差为优化目标通过局部 Hessian 加权搜索最优 FP8 块缩放。文章覆盖算法数学原理、与 MSE / Four-Over-Six / max 缩放算法的对比结果、与 GPTQ 的组合用法、仓库内配置与源码实现以及完整的端到端复现命令行。读完你可以直接在自己的量化配置中启用local_hessian算法并理解其为何能在不增加任何部署开销的前提下降低平均精度损失。Local-Hessian 是什么为 NVFP4 逐块缩放选择更聪明的标准NVFP4 是一种面向 NVIDIA Blackwell GPU 的微块micro-block低精度格式每16 个权重共享一个 FP4 值和一个 FP8 块缩放因子block scale块缩放把该块数值缩放进入 NVFP4 E2M1 的可表示范围-6.0, 6.0。Model Optimizer 团队以该格式为基础发布了一个低损失的公开检查点nvidia/Qwen3.8-27B-NVFP4其关键改进就来自 Local-Hessian 缩放算法。默认的 NVFP4 缩放策略是max scaling块缩放取该块 16 个权重绝对值的最大值保证块内数值都落在 E2M1 网格内。但最大值并不能代表最优——块内数值的分布形状同样重要。Four-Over-Six论文arXiv:2512.02010指出可以从 2 个候选缩放中按块内误差挑选而 Model Optimizer 的 MSE 算法mse_calibrate则对全部 126 个正、非零 FP8 缩放值做穷举扫描。不过这两类方法都只考虑权重张量自身的误差而权重误差与下游任务的最终精度相关性并不好。Local-Hessian 的出发点正是要修正这一点不要最小化权重的量化误差而是最小化量化后的矩阵乘法输出误差。格式本身没有任何改变——FP4 值、FP8 缩放、E2M1 网格全部保持原样——改变的只是逐块缩放的计算方式。算法原理把输出误差写成 Hessian 加权形式考虑一个线性层Y WX其中权重W ∈ R^(C_out × C_in)校准输入X ∈ R^(C_in × N)N为校准 token 数。量化操作将权重除以缩放后再做 E2M1 取整Cast即Q(W, s) Cast(W / s) · s这带来权重量化误差Δ(W, s) Q(W, s) − W我们真正关心的是该误差传导到层输出的程度在校准集上度量E(s) ‖WX − Q(W, s)·X‖²_F ‖Δ(W, s)·X‖²_F tr(Δ(W, s)·(XXᵀ)·Δ(W, s)ᵀ)这里输入的二阶矩矩阵XXᵀ ∈ R^(C_in × C_in)恰好是输出误差 Hessian 的一半∂²E(s)/∂Δ(W,s)² 2XXᵀ它按“该输入坐标对输出的实际影响”对每个权重误差加权。迹运算tr(·)对每个输出通道累加一个二次误差项从而各通道可以独立优化。关键难点在于NVFP4 的缩放s不是标量每个输出通道有C_in / 16个块、每块一个缩放。若每块有M个候选联合最小化E(s)需要搜索M^(C_in/16)种组合——这在计算上不可行。为此 Local-Hessian 引入块对角近似忽略不同块量化误差之间的相互作用把每个块的输出误差独立相加。对块bE_b(s_b) Δ(W_b, s_b)·(X_b X_bᵀ)·Δ(W_b, s_b)ᵀ其中W_b ∈ R^(1×16)是一个 NVFP4 权重块s_b是该块缩放X_b ∈ R^(16×N)是该块实际乘的输入行因此局部 HessianX_b X_bᵀ只有16×16大小。每个块照例穷举扫描全部 126 个 FP8 候选缩放与 MSE 算法一致由于各块相互独立一个 Triton kernelnvfp4_fp8_scale_sweep_hessian就能一次性完成整层扫描。从源码看该 Triton kernel 接收按[N_BLOCKS, block_size]布局排布按(cout, cin // block_size)行主序的权重、全局 FP32 amax、以及形状为[cin // block_size, block_size, block_size]的逐块局部 Hessian对每个 NVFP4 块在 126 个 FP8 E4M3 候选缩放中最小化dwᵀ H dw输出逐块最优 amax。候选缩放的生成路径与参考 fake-quant 路径保持 bit 级一致。入口 API 与校准流程local_hessian_calibrateLocal-Hessian 的校准入口是 model_calib.py 中的local_hessian_calibratemodelopt.torch.quantization.model_calib模块。其核心参数包括参数默认值说明step_size0.1amax 搜索步长start_multiplier0.25amax 搜索起始乘子stop_multiplier4.0amax 搜索结束乘子fp8_scale_sweepTrue是否对 NVFP4 逐块量化穷举全部 128 个 FP8 E4M3 缩放值block_size16局部 Hessian 计算的块大小debugFalse为 True 时在模型上保留model._local_hessian_accumulators以便检查整个校准分三个阶段源码结构清晰可证Phase 1max 预校准先对所有 quantizer 跑一遍max_calibrate同时完成 dead experts 的 bootstrap 与 NVFP4 static 状态的提升/同步Phase 2捕获激活、计算局部 Hessian注册钩子捕获每个权重量化器对应的输入激活在禁用权重 fake-quant输入量化器保持原样的前向中累积H ΣXᵀX使 Hessian 反映全精度权重下的真实输入分布Phase 3权重搜索把归一化后的逐块 Hessian 传给权重搜索内部复用mse_calibrate的权重搜索机制通过error_func注入 Hessian 度量。对权重与其输入激活配对的层稠密线性层与 HF fused-MoE 专家使用 Hessian 度量其余层退回普通 MSE其他 quantizer 类型如SequentialQuantizer不支持该度量保持 max 校准的缩放。从源码还可看到两条重要提示一是 Hessian 当前未跨张量/数据并行 rank 同步多卡场景下建议将 local_hessian 视为单 rank 使用源码中会打印相应警告二是文档与源码均明确推荐与 layerwise 校准配合使用layerwise: {enable: True}并采用校准 batch size 1——逐层校准让每层暴露在前一层的 fake-quant 输出之下逼近真实量化部署环境batch size 1 则防止 padding token 污染激活统计量。实验结果精度对比与分布重塑逐算法精度对比Qwen3.5-9BNVFP4 W4A4表 1 对比了各权重缩放算法在 Qwen3.5-9B 上的表现除最终输出层lm_head外全部采用 NVFP4 W4A4 量化权重缩放方法MMLUHellaSwagWinoGrandeGSM8K平均下降越低越好WikiText PPL越低越好BF16 参考78.6978.0473.4087.640.009.20Max 缩放75.8176.3370.6474.605.1010.08MSE 缩放76.4976.6172.4576.723.879.98Four-over-six 缩放75.3276.6270.4076.424.7510.02Local-Hessian 缩放76.8176.5071.1980.893.109.90Local-Hessian 在 NVFP4 权重缩放方法中整体精度最佳把平均下降从默认 max 规则的 5.10 点降到 3.10 点。注意这只靠更聪明的缩放计算方式获得——这从一个侧面说明微块格式如 NVFP4 中缩放因子携带了大量信息值得认真求解。下图展示了 Qwen3.8-27B 上各缩放规则的精度对比BF16 基线为灰色与 GPTQ 组合正交改进Local-Hessian 改变缩放GPTQ 改变权重舍入方式最小化逐层输出误差两者正交可组合Local-Hessian 默认按最近舍入RTN取整GPTQ 可在缩放确定后替换该舍入步骤。表 2 显示 Local-Hessian 缩放同样能提升 GPTQ 的效果方法MMLUHellaSwagWinoGrandeGSM8K平均下降WikiText PPLMax 缩放 GPTQ75.7776.5170.1775.974.8410.02Local-Hessian 缩放 GPTQ76.9876.5970.9681.502.949.91两个关键观察仅 Local-Hessian 缩放平均下降 3.10就超过了 max 缩放 GPTQ4.84Local-Hessian 缩放 GPTQ 进一步把平均下降从 3.10 提升到 2.94。需要注意组合并非总是更优。文档明确提示在 Qwen3.8-27B 上 Local-Hessian GPTQ 反而低于仅 Local-Hessian因此发布检查点只用了 Local-Hessian。这提示最佳算法可能因模型而异。缩放如何重塑权重分布下图绘制了各算法下的缩放后权重W/s即送入 E2M1 取整的值的分布蓝色虚线为 NVFP4 E2M1 可表示值统计取自 Qwen3.8-27B 第一个 gate-projection 层Max 缩放会把质量堆积在 6.0最大的 E2M1 值附近而 MSE 与 Local-Hessian 都使分布聚集到可表示的 E2M1 网格值上。但网格对齐本身并不能完全解释精度提升——尽管 MSE 与 Local-Hessian 都对齐到 E2M1 网格Local-Hessian 以层输出误差为目标的优化在作者测试中带来了更大的下游精度改善。仅更好的缩放零运行时成本Local-Hessian 及其他 ModelOpt 的 NVFP4 权重缩放选择算法是免费的权重缩放在检查点创建时只计算一次之后每次部署复用同一缩放。因此这种缩放选择只提升精度不引入任何部署吞吐代价。如何启用 Local-Hessian配置与端到端复现在 Python 配置中启用将algorithm.method设为local_hessian并推荐开启 layerwiseimport modelopt.torch.quantization as mtq config { quant_cfg: [...], # quantizer configuration algorithm: { method: local_hessian, layerwise: {enable: True}, }, } model mtq.quantize(model, config, forward_loop)quant_cfg的完整写法参见仓库中的 量化配置指南quant_cfg它是有序的QuantizerCfgEntry列表每个条目通过quantizer_name通配符如*weight_quantizer匹配量化器、parent_class限定父模块类、cfg指定量化属性、enable开关使能状态。作为通用配方字段algorithm支持max默认、mse、smoothquant等local_hessian为其扩展方法见 recipes 指南。仓库还提供现成的 YAML 预设可直接参考模型级配方Qwen3.8-27B NVFP4 W4A4 FP8 注意力 Local-Hessian它 import 自对应的 max 基线配方并追加algorithm.method: local_hessian、fp8_scale_sweep: true以及layerwise.enable: true与get_qdq_activations_from_prev_layer: true通用预设NVFP4 W4A4 权重 Local-Hessian 预设展示quant_cfg中*weight_quantizer使用nvfp4_static数值格式、*input_quantizer使用nvfp4的写法并把fp8_scale_sweep设为true。端到端复现 Qwen3.8-27B 检查点使用仓库中的 hf_ptq 示例脚本 可以完整复现发布的 NVFP4 检查点python examples/hf_ptq/hf_ptq.py \ --pyt_ckpt_path Qwen/Qwen3.8-27B \ --recipe modelopt_recipes/models/Qwen/Qwen3.8-27B/ptq/nvfp4_w4a4_mlp_fp8_attn_local_hessian.yaml \ --dataset nemotron-post-training-v3 \ --calib_size 512 \ --calib_seq 2048 \ --batch_size 1 \ --export_path export_dir实践建议Local-Hessian 与 GPTQ 均推荐开启 layerwise 校准layerwise: {enable: True}并配合校准 batch size 1多卡张量/数据并行下 Hessian 当前不跨 rank 同步源码会提示将 local_hessian 视为单 rank 使用规模化前需留意组合 GPTQ 前先在目标模型上验证——Qwen3.8-27B 上组合反而回退算法最优解因模型而异。下一步方向官方路线图中已列出的下一步工作是将 Local-Hessian 适配到稀疏 MoE 场景稀疏 MoE 中许多专家只能看到极少的校准数据Local-Hessian 工作流需要针对这种低数据量 regime 做适配。这一方向也为有意深入该算法的研究者预留了明确的探索空间。参考资料本文算法结论对应仓库文档 local-hessian.rst其引用的外部文献包括NVFP4 官方技术博客E. Alvarez 等NVIDIA 2025、Four Over Six 论文J. Cook 等arXiv:2512.02010、以及 GPTQ 论文E. Frantar 等ICLR 2023。仓库内的源码证据集中在 model_calib.py校准入口与三阶段流程与 nvfp4_fp8_sweep.py逐块 Hessian 加权 Triton 扫描 kernel。赞分享【免费下载链接】Model-OptimizerA unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks like TensorRT-LLM, TensorRT, vLLM, etc. to optimize inference speed.项目地址https://gitcode.com/GitHub_Trending/te/Model-Optimizer点击查看免费下载相关推荐MiniMax-M3 混合 MXFP8 与 NVFP4 量化基于 Model-Optimizer 的分层 PTQ 实战指南MiniMax M3 混合 MXFP8 与 NVFP4 量化基于 Model Optimizer 的分层 PTQ 实战指南 导读 本文基于 Model OptuBlock Origin 广告拦截扩展凭什么快、五步确认在干活、三步放行误伤uBlock Origin 广告拦截扩展凭什么快、五步确认在干活、三步放行误伤 在老笔记本上点开一个视频先转起来的是风扇不是视频。页面偷偷加载了几十个你没Model-Optimizer 与 LLaMA-Factory 集成实战基于 NVFP4 的 QAT/QAD 量化感知训练指南Model Optimizer 与 LLaMA Factory 集成实战基于 NVFP4 的 QAT/QAD 量化感知训练指南 本指南以仓库中的 LLaMA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表