ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

编写你自己的量化配方:Model Optimizer Recipe系统与自定义扩展指南

编写你自己的量化配方:Model Optimizer Recipe系统与自定义扩展指南 编写你自己的量化配方Model Optimizer Recipe系统与自定义扩展指南【免费下载链接】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-OptimizerModel OptimizerModelOpt是 NVIDIA 开源的统一模型压缩工具库覆盖量化、剪枝、蒸馏、神经架构搜索与投机解码等 SOTA 技术。Recipe配方系统是它最实用的设计之一把量化配置从 Python 代码中抽离出来变成一份可复用、可版本化、可分享的 YAML 文件。本文将用最小代码量带你从零理解并亲手编写自己的量化配方掌握$import组合语法与load_recipe加载机制轻松对接 TensorRT-LLM、vLLM 等部署框架。为什么量化配置需要一个配方 没有 Recipe 系统时量化参数散落在命令行参数、Python 常量和零散的脚本修改里会带来四个典型痛点痛点没有 Recipe 时有了 Recipe 后复现配置埋在脚本参数中难以追溯一份 YAML 即完整配置分享没有单一可交付物直接交接 YAML 文件版本管理配置 diff 混在代码 diff 中配置独立变更、独立审查新模型上手必须读源码找可调参数挑一个内置配方微调即可一句话概括配方 声明式地描述如何优化一个模型的全部信息。它不再需要改 Python 脚本只需要编写或挑选一个配方传给 ModelOpt 工具链即可。Recipe 系统的三层架构源码与入口速览Recipe 系统位于modelopt/recipe/包内由三层构成配方源Recipe sourcesYAML 文件或目录存放在随包发布的modelopt_recipes/库或用户自己的文件系统中。配置加载器load_config负责读取 YAML、解析跨文件引用并自动把eXmY浮点格式简写如e4m3转换成元组(4, 3)。配方加载器load_recipe 在加载后对配置做Pydantic 校验返回一个带类型的配方对象如ModelOptPTQRecipe可直接用于后续优化流程。目前RecipeType枚举已支持以下配方类型类型正文小节用途ptqquantize训练后量化PTQauto_quantizeauto_quantize逐层自动搜索最优量化格式speculative_eagle/speculative_dflash/speculative_medusaeagle/dflash/medusa投机解码训练QAT量化感知训练配方已在规划中。更完整的架构设计文档见 11_config_system.rst。阅读内置量化配方5 步理解一个 PTQ 配方内置配方库按三层组织布局见 10_recipes.rstmodelopt_recipes/ -- general/ptq/ # 与模型无关的通用配方fp8、nvfp4 等 20 种 -- model_type/类型/ # 按 HuggingFace model_type 组织的架构级配方 -- models/org/模型/ # 按检查点路径组织的配方镜像/别名两种形式 -- configs/ # 可复用片段数值格式、quant_cfg 积木 -- numerics/ # fp8、nvfp4、mxfp8 等数值格式定义 -- ptq/units/ # base_disable_all、默认禁用层等标准积木以最典型的 nvfp4_default-kv_fp8_cast.yaml 为例一个配方只有三块内容metadata: description: NVFP4 W4A4 模型量化 FP8 KV 缓存max 校准 quantize: algorithm: max # 校准算法 quant_cfg: # 有序的量化器规则列表 - $import: base_disable_all - $import: w4a4_nvfp4_nvfp4 - $import: kv_fp8_cast - $import: default_disabled_quantizersmetadata必填说明配方类型与用途quantize.algorithm校准算法可选max、mse、smoothquant、awq_full、gptq等quantize.quant_cfg有序规则列表先全部禁用再逐项开启最后叠加标准排除项LM head、路由层等这是官方的先禁用后开启安全模式。$import组合语法写一次处处复用 ⚡这是 Recipe 系统最强大的能力——可组合 YAML。它用一个极简 DSL 解决了同一段配置在 20 个配方里重复 20 遍的问题顶部imports:声明本文件的依赖短名 → 片段路径数据中用$import: 短名插入片段内容片段可再引用其他片段递归解析循环引用会被检测并报错。$import在不同位置的语义出现位置行为字典值片段内容替换该值同级的内联键会覆盖导入的键后写者优先列表元素按 schema 决定导入整列则拼接splice导入单条则追加append顶层$import整个委托给另一个配方可只保留自己的metadata见下文别名多个导入按列表顺序合并$import: [base, override]中后者覆盖前者内联键优先级最高。modelopt-schema注释是片段间的契约。每个可被引用的片段文件头部必须声明它要满足的 Python schema# modelopt-schema: modelopt.torch.quantization.config.QuantizerAttributeConfig num_bits: e2m1 block_sizes: -1: 16 type: dynamic scale_bits: e4m3加载器会在导入展开后按该 schema 校验片段坏配置在加载期就报错而不是悄悄流入几十个配方。另外加载器内置了eXmY 浮点格式简写num_bits: e4m3自动转为(4, 3)scale_bits: e8m0转为(8, 0)大小写不敏感。常用格式简写元组含义e4m3(4, 3)FP8 E4M3标准权重/激活格式e2m1(2, 1)FP4 E2M1NVFP4 权重格式e8m0(8, 0)MX 块缩放格式编写你自己的量化配方完整流程 ✍️官方推荐的四步法源自 10_recipes.rst 的 Writing a custom recipe 章节找一份最接近目标配置的内置配方作为起点如general/ptq/下 20 多种复制并修改类型相关小节PTQ 即quantize更新metadata.description说明你的改动保存文件把路径传给load_recipe()或命令行--recipe参数。例如写一份 INT8 逐通道权重量化配方# my_int8_ptq.yaml imports: base_disable_all: configs/ptq/units/base_disable_all default_disabled: configs/ptq/units/default_disabled_quantizers metadata: description: INT8 per-channel 权重 per-tensor 激活量化 quantize: algorithm: max quant_cfg: - $import: base_disable_all - quantizer_name: *weight_quantizer cfg: num_bits: 8 axis: 0 - quantizer_name: *input_quantizer cfg: num_bits: 8 axis: - $import: default_disabled标准积木禁用全部量化器、标准排除项由内置片段处理你只需写格式特有的条目。加载与覆盖从 Python API 到命令行Python 侧load_recipe返回已校验的类型化对象路径先查内置库再查文件系统.yaml/.yml后缀可省略from modelopt.recipe import load_recipe import modelopt.torch.quantization as mtq recipe load_recipe(general/ptq/fp8_default-kv_fp8_cast) # 或你自己的文件/目录 model mtq.quantize(model, recipe.quantize, forward_loop)它还支持overrides参数——点分列表覆盖如quantize.algorithmmse在最终校验前合并免去为每个变体新建文件。命令行侧示例脚本如 examples/hf_ptq/hf_ptq.py都接受--recipe参数python examples/hf_ptq/hf_ptq.py \ --model 模型名 \ --recipe general/ptq/fp8_default-kv_fp8_cast \ --export_path build/fp8提供--recipe后脚本会直接使用配方内的量化配置、校准算法与 KV 缓存设置替代零散的--qformat等格式标志——这也正是官方推荐的演进方向格式标志已被标记为弃用见 modelopt/recipe/presets.py。两种存放形态单文件metadata 正文小节写在一个 YAML 里所有类型通用目录metadata.yamlquantize.yaml分文件存放目前仅 PTQ适合把元数据与优化配置分开维护。进阶扩展别名、AutoQuantize 与未来方向配方别名顶层$import可让一个新配方继承整个内置配方只声明自己的metadata——models/org/模型/下的检查点条目就靠这种方式记录某发布检查点由哪个配方复现零重复。AutoQuantize 配方auto_quantize类型更进一步描述逐层搜索最优格式的策略。以 nvfp4_fp8_at_5p4bits.yaml 为例它声明了约束5.4 有效位宽、候选格式列表NVFP4 与 FP8 两条候选与搜索方法gradient/kl_div/mse搜索得到的混合精度方案往往比单一格式更准规划中的方向见官方文档 Future directionsQAT 配方、稀疏配方、组合配方量化后接剪枝、标准dataset小节以及以--recipe为主入口的统一 CLI。编写规范与常见陷阱清单 ✅综合 11_config_system.rst 的编写指南推荐记住这几条✅ 可被imports引用的片段文件必须带# modelopt-schema:注释顶层配方文件则不需要✅ 列表型片段要声明具体的带类型 schema如list[QuantizerCfgEntry]追加还是拼接行为才明确✅ 小而一次性的配置用自包含 YAML重复片段才拆成 imports✅ 持久化bug 报告、checkpoint时序列化解析后的model_dump()纯数据而不是编写期的 YAML❌ 不要在应用代码里用裸 YAML API 解析 ModelOpt 配置——始终走load_config()/load_recipe()否则imports、schema 校验与eXmY转换都会失效❌ 别名配方与被委托配方类型必须一致PTQ 配方不能整体导入 EAGLE 配方否则加载期直接报类型不匹配。小结与延伸阅读Model Optimizer 的 Recipe 系统用YAML 存数据、Python 定义契约、加载期强校验的分工让量化配置第一次成为了一等公民可复现、可分享、可组合。建议按以下顺序继续深入资料路径Recipe 系统设计文档docs/source/guides/10_recipes.rst配置系统详解docs/source/guides/11_config_system.rstRecipe 加载器实现modelopt/recipe/loader.py配方 schema 定义modelopt/recipe/config.py内置配方库modelopt_recipes/README.md通用 PTQ 配方目录modelopt_recipes/general/ptq/数值格式片段modelopt_recipes/configs/numerics/PTQ 示例入口examples/hf_ptq/hf_ptq.py从一份内置配方出发改三行 YAML你就拥有了自己的量化配方。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表