ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Model-Optimizer 的 KL 散度模型验证工具包:量化/剪枝模型输出相似度评估实战指南

Model-Optimizer 的 KL 散度模型验证工具包:量化/剪枝模型输出相似度评估实战指南 人工智能大模型模型优化模型量化模型压缩【免费下载链接】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点击查看免费下载导读本文围绕 Model-Optimizer 仓库中 examples/windows/accuracy_benchmark/kl_divergence_metrics/README.md 所介绍的 KL Divergence Model Validation Toolkit 展开它是 Windows 端 LLM 精度验证工具链中的核心组件用于通过 KLKullback-Leibler散度定量比较两个模型的输出概率分布。读完本文你将掌握如何使用compute_kl_divergence.py在 Hugging FaceHF模型与 ONNX Runtime GenAI 模型之间、或同一执行提供者EP下的两个 GenAI 模型之间做顺序式逐块比较理解其内存友好的两阶段设计、参数含义、结果输出格式以及常见问题的排查思路。工具包定位为什么要用 KL 散度验证模型在模型优化流程中量化、剪枝、蒸馏等操作会改变模型权重与计算精度最核心的问题是优化后模型是否还保持了原模型的输出质量。KL 散度从信息论角度量化一个概率分布相对另一个概率分布的差异恰好可以用于衡量优化前后模型在每个 token 位置输出分布的变化程度——KL 值越小说明两个模型的输出越相似。该工具包compute_kl_divergence.py的主要应用场景包括模型优化验证验证经过量化、剪枝等优化后的模型是否保持了输出质量框架对比比较 Hugging Face 模型与 ONNX Runtime GenAI 模型的输出差异精度分析评估 FP16、INT4、INT8 等不同精度模型的输出差异执行提供者测试测试 CUDA、DirectML、CPU、TensorRT 等不同 EP 实现的一致性。从仓库整体结构看该工具包与 perplexity_metrics困惑度、fvd_metrics视频 FVD共同构成 accuracy_benchmark 目录下的附加指标体系弥补了 MMLU 等端到端任务评估之外的分布级相似度检查能力属于量化模型上线前的常规回归验证手段。核心组件与工作模式主脚本与比较模式脚本用途比较模式compute_kl_divergence.py双模型顺序式比较HF vs GenAI、GenAI vs GenAI同一 EP、GenAI vs HF、HF vs HF从脚本的 argparse 定义compute_kl_divergence.py可以看出--model1_type与--model2_type均在[hf, genai]中取值因此四种组合全部被支持顺序可互换。数据集统一使用WikiText-2 的 test split保证所有模型在完全相同的评估语料上比较数据集通过 HuggingFacedatasets库自动加载与预处理。源码中get_wikitext2()compute_kl_divergence.py执行load_dataset(wikitext, wikitext-2-raw-v1, splittest)并将所有样本以双换行符拼接为一段连续文本用于后续分块推理。安装与环境准备1. 安装基础依赖pip install -r requirements.txtrequirements.txt 中包含accelerate、datasets、numpy、safetensors0.4.0、torch2.6.0、transformers5.0并配置了--extra-index-url https://download.pytorch.org/whl/cu129的 CUDA 12.9 轮子索引。如需更快的推理速度建议显式安装带 CUDA 的 PyTorchpip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1292. 安装 ONNX Runtime GenAI 包根据硬件选择其中一个安装# 面向 CUDA pip install onnxruntime-genai-cuda # 面向 DirectML pip install onnxruntime-genai-directml # 面向 CPU pip install onnxruntime-genai安装哪个包会直接决定 GenAI 模型在脚本中自动使用的执行提供者源码注释明确说明GenAI 模型会根据所安装的 onnxruntime-genai 包自动使用合适的执行提供者cuda、directml、cpu、tensorrt。这是 GenAI vs GenAI 比较必须同一 EP的根因——不同 EP 对应不同安装包而每次进程只能加载一个包。使用示例快速上手对比 HF 与 GenAI 模型python compute_kl_divergence.py \ --model1 meta-llama/Llama-3.1-8B-Instruct --model1_type hf \ --model2 G:\models\genai_model --model2_type genai \ --device cuda \ --output results.json对比两个 GenAI 模型同一 EPpython compute_kl_divergence.py \ --model1 G:\models\genai_fp16 --model1_type genai \ --model2 G:\models\genai_int4 --model2_type genai \ --output fp16_vs_int4.json上述第二个示例即典型的精度分析用例FP16 基线与 INT4 量化版对比直接用 KL 值反映量化带来的输出分布漂移。开启调试输出python compute_kl_divergence.py \ --model1 meta-llama/Llama-3.1-8B-Instruct --model1_type hf \ --model2 G:\models\genai_model --model2_type genai \ --device cuda \ --output results.json \ --debug # 开启详细日志--debug对应脚本内的全局DEBUG标志会驱动debug_print()打印每个 chunk 的形状、每步的 GPU 显存分配/保留量、模型清理状态等中间信息便于定位显存或形状不匹配问题。配置参数详解必需参数参数说明取值--model1第一个模型本地路径或 HF Hub 标识符--model1_type第一个模型类型hf、genai--model2第二个模型本地路径或 HF Hub 标识符--model2_type第二个模型类型hf、genai可选参数参数说明默认值--deviceHF 模型推理设备cuda可选cpu--output结果 JSON 输出路径无打印到控制台--debug开启详细调试输出False注意--device只影响HF 模型的推理设备源码 epilog 中明确说明GenAI 模型始终由所装包决定 EP。模型路径格式HF 模型Hub 标识符meta-llama/Llama-3.1-8B-Instruct首次使用会自动下载本地路径F:\shared\Llama-3.1-8B-InstructGenAI 模型仅支持本地目录路径G:\models\genai_model须包含genai_config.json与 tokenizer 等 ORT-GenAI 可加载的组件脚本在main()中做了路径校验compute_kl_divergence.pygenai类型强制要求本地路径存在hf类型仅在路径含路径分隔符看起来像本地路径时才检查存在性避免把 Hub 标识符误判为缺失。关键解读口径越小越好更小的 KL 散度 输出更相似相对比较应以基线如 HF FP32 或 FP16 原始模型为参照解读数值绝对数值本身没有独立阈值意义。源码实现原理内存友好的两阶段顺序式比较这是本工具包最有价值的工程细节。README 之外脚本源码揭示了两阶段设计使其可以在单进程、最小显存条件下完成双模型比较。阶段一加载模型 1 并提取 logits 存入 CPU 内存HF 模型走extract_hf_logits()compute_kl_divergence.pyCUDA 下以float16加载CPU 下回退float32刻意不使用device_mapauto以保证后续能够彻底清理显存。GenAI 模型走extract_genai_logits()compute_kl_divergence.py通过onnxruntime_genai的GeneratorParams.set_search_options(max_length..., do_sampleFalse, early_stoppingFalse)配置确定性解码append_tokens后调用generate_next_token()获取logits输出——这正是 README 在 accuracy_benchmark 总览 中提到的 GenAI v0.6 新 APIappend_tokens取代了旧的compute_logits。每个 chunk 的 logits 都立即.cpu().numpy()转移到系统内存保存chunk 结束后立刻del释放 GPU 张量。阶段二加载模型 2 并逐块计算 KLcompute_kl_with_model2()compute_kl_divergence.py随后只加载第二个模型复用阶段一保存的 logits两套 logits 在序列维和词表维上分别取min裁剪对齐min_seq、min_vocab兼容不同 tokenizer 或不同输出长度每个 chunk 通过torch.nn.functional.log_softmax(..., dim2)计算 log 概率再调用compute_kl_divergence()compute_kl_divergence.py按位置累加prob_ref * |log_probs_ref - log_probs_tar|并除以序列长度得到平均 KL输出结果按 chunk 汇总最终average_kl_divergence total_kl / chunk_count。内存与显存策略一次只加载一个模型仅需容纳单个模型的显存源码注释8B 模型约 8GBlogits 存于系统内存约 2–4GB每个阶段结束都调用cleanup_vram()compute_kl_divergence.pygc.collect()torch.cuda.empty_cache()torch.cuda.synchronize()HF 模型还会先.to(cpu)再删除引用确保同一时刻只有一个模型在显存中。分块推理默认max_context_length4096超长文本按 4096 token 切块range(0, seq_len, max_context_length)。这既控制了单次前向的显存峰值也天然适配长上下文模型chunk 数量会记入结果 JSON 的total_chunks字段。输出 JSON 结构指定--output后脚本会写入包含以下信息的 JSON见 compute_kl_divergence.py{ models: { model1: {path: ..., type: hf}, model2: {path: ..., type: genai} }, device: cuda, total_chunks: 4, max_context_length: 4096, kl_divergence: { total: 0.123456, average: 0.030864 }, chunk_results: [ {chunk_id: 1, begin_loc: 0, end_loc: 4096, kl_divergence: 0.0289} ], timing: { model1_extraction_seconds: 42.5, model2_computation_seconds: 39.1, total_seconds: 81.6 }, computation_timestamp: 2026-09-26T00:00:00 }包含模型元信息、分块明细、总体/平均 KL 与耗时统计方便做量化前后、多后端的批量对比与存档。与量化工作流的衔接该工具在 Model-Optimizer 的 Windows 量化落地流程中处于验证环节先用 genai_llm/quantize.py 对 ONNX GenAI 模型执行 INT4 AWQ--algo awq_lite/rtn/rtn_dq等等量化得到model.onnx再用本工具比较 FP16 基线与量化模型的输出分布。其姊妹工具 perplexity_metrics 提供困惑度视角而 KL 散度则关注逐 token 分布的漂移两者互补。GenAI 模型由python -m onnxruntime_genai.models.builder从 HF 导出参考 genai_llm README 的模型准备命令导出的目录结构含genai_config.json正是本工具--model2_type genai期望的输入。故障排查1. CUDA 显存不足报错示例RuntimeError: CUDA out of memory解决方案HF 模型改用 CPU--device cpu关闭其他占用 GPU 的应用需要时缩小批大小修改代码中的分块逻辑确认脚本同一时刻只加载一个模型脚本已内置该机制两阶段设计可保证。2. 执行提供者不匹配提示信息[INFO] Comparing two GenAI models (same execution provider)说明该日志属于信息提示。GenAI vs GenAI 比较要求两个模型由同一执行提供者导出/运行例如都基于 CUDA 包或都基于 DirectML 包。解决办法确保两个模型都通过相同的执行提供者创建即用匹配的onnxruntime-genai-*包导出与加载。3. 其他补充建议若遇到 onnxruntime-genai 或 tokenizer 相关的模型特定问题可尝试回退到旧版 GenAI如onnxruntime-genai-directml0.4 配合transformers4.44具体见 accuracy_benchmark 总览 的 Troubleshoot 章节如需更多端到端任务指标MMLU 等参见同一目录下的 mmlu_benchmark.py 及其使用文档。小结KL Divergence Model Validation Toolkit 以两阶段顺序式 logits 驻留 CPU 内存 分块对齐裁剪的设计在最小显存占用下完成了 HF 与 GenAI及同 EP 双 GenAI之间的输出分布相似度定量评估。它适用于量化/剪枝验证、精度对比、框架与 EP 一致性测试四类典型场景是 Model-Optimizer Windows 量化流程中连接量化产出与精度回归的关键校验工具。直接运行 compute_kl_divergence.py 即可复现文中的全部示例。赞分享人工智能大模型模型优化模型量化模型压缩【免费下载链接】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点击查看免费下载相关推荐llama.cpp Perplexity 工具实战困惑度与 KL 散度驱动的量化模型质量评估llama.cpp Perplexity 工具实战困惑度与 KL 散度驱动的量化模型质量评估 llama.cpp 仓库内置的 llama perplexity人工智能大模型模型推理服务推理引擎本地部署后端从困惑度到KL散度llama.cpp量化模型输出质量全面测评指南从困惑度到KL散度llama.cpp量化模型输出质量全面测评指南 你是否曾为选择合适的llama.cpp量化模型而烦恼明明Q4_0体积更小Q5_K_M却号人工智能大模型模型推理服务推理引擎本地部署后端PowerInfer llama-perplexity 模型评测指南Perplexity、KL 散度与量化质量评估PowerInfer llama perplexity 模型评测指南Perplexity、KL 散度与量化质量评估 本文是一份围绕 PowerInfer 仓库人工智能大模型推理引擎本地部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进