散模型量化與 ONNX Runtime 推理指南:基于 Model-Optimizer 的 FP4/FP8 Backbone 量化部署)
人工智能大模型模型優(yōu)化模型量化模型壓縮【免費(fèi)下載鏈接】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.項(xiàng)目地址https://gitcode.com/GitHub_Trending/te/Model-Optimizer點(diǎn)擊查看免費(fèi)下載本指南系統(tǒng)講解如何在 Windows 環(huán)境下使用 Model-Optimizer 對擴(kuò)散模型Stable Diffusion 3.x、Flux 等的去噪主干網(wǎng)絡(luò)Backbone執(zhí)行 PTQ 后訓(xùn)練量化FP8 / NVFP4導(dǎo)出為 ONNX 格式并借助 ONNX RuntimeTRTRTX 執(zhí)行提供程序完成端到端推理。讀完本文你將掌握從環(huán)境搭建、Backbone 量化、ONNX 后處理到 ONNX Runtime 推理的完整實(shí)戰(zhàn)鏈路并能獨(dú)立排查常見報(bào)錯(cuò)。背景為什么量化擴(kuò)散模型的 Backbone在擴(kuò)散模型中Backbone指去噪過程中承擔(dān)主要計(jì)算的神經(jīng)網(wǎng)絡(luò)它負(fù)責(zé)在每個(gè)擴(kuò)散步預(yù)測噪聲是整個(gè)管線中計(jì)算量最大的部件。早期模型如 SDXL使用 U-Net 作為 Backbone而 SD3、Flux 等新一代模型則采用基于 Transformer 的 Backbone如SD3Transformer2DModel、FluxTransformer2DModel。Model-Optimizer 的 diffusers 量化示例 說明了如何量化這類 Backbone并能將量化后的 Backbone 導(dǎo)出為 ONNX供后續(xù)部署或優(yōu)化使用。從 examples/diffusers/README.md 可知Backbone 部分通常占據(jù)擴(kuò)散模型端到端推理延遲的 95% 以上因此對 Backbone 做 INT8 / FP8 / NVFP4 后訓(xùn)練量化PTQ可以在保持模型質(zhì)量的前提下將模型體積壓縮 2x–4x 并加速推理。環(huán)境安裝與前置條件官方建議為 ONNX 導(dǎo)出、量化、推理等不同階段分別創(chuàng)建獨(dú)立的 Python 虛擬環(huán)境以避免依賴沖突。安裝 Model-Optimizer 工具包及其依賴。Windows 平臺下通常需要MSVC Compiler / Visual Studio / VC Redistributable、CUDA 等倉庫內(nèi)可參考 Windows 安裝文檔 與 examples/windows/README.md。安裝 diffusers 量化示例 所需的依賴見 requirements.txt。推理階段所需依賴請參照下文「使用 ONNX Runtime 推理」一節(jié)。注意模型量化/校準(zhǔn)對 GPU 算力要求相對較高但量化所在的 GPU 不必與最終部署目標(biāo) GPU 相同。第一步用 Model-Optimizer 量化 Backbone倉庫 examples/diffusers/quantization/quantize.py 提供了完整的量化腳本。核心流程為加載DiffusionPipeline→ 構(gòu)建量化配置 → 用校準(zhǔn)數(shù)據(jù)跑前向forward_loop→ 調(diào)用mtq.quantize()→ 按模型類型禁用部分量化器mtq.disable_quantizer→ 保存 checkpoint 并可選導(dǎo)出 ONNX。從源碼看Quantizer.get_quant_config()會根據(jù)--format選擇不同的預(yù)設(shè)配置定義于 config.pyFP8 使用FP8_DEFAULT_CONFIGNVFP4 對 SDXL 類模型使用NVFP4_FP8_CONV_CONFIG、對 Flux 類模型使用NVFP4_FP8_MHA_CONFIGFP4 線性層 FP8 多頭注意力其余模型使用NVFP4_DEFAULT_CONFIG。--quantize-mha會額外追加*[qkv]_bmm_quantizer的 (4, 3) 位量化規(guī)則。量化配置的完整字段定義見 quantize_config.py參數(shù)默認(rèn)值說明--modelflux-dev模型類型如sdxl-1.0、sd3-medium、sd3.5-medium、flux-dev、flux-schnell、ltx-video-dev、wan2.2-t2v-14b等--formatint8量化格式int8/fp8/fp4--quant-algomax量化算法max/svdquant/smoothquant--model-dtypeHalf管線加載精度Half/BFloat16/Float--trt-high-precision-dtypeHalfTensorRT 高精度層精度--quantize-mha關(guān)將 MHA 量化為 FP8INT8 格式下不支持--block-size16NVFP4 量化塊大小--batch-size2校準(zhǔn) batch 大小--calib-size128校準(zhǔn)樣本總數(shù)--n-steps30校準(zhǔn)去噪步數(shù)--cpu-offloading關(guān)顯存不足時(shí)啟用 CPU offloading--quantized-torch-ckpt-save-path無量化 PyTorch checkpoint 保存路徑--onnx-dir無ONNX 導(dǎo)出目錄--hf-ckpt-dir無HuggingFace checkpoint 導(dǎo)出目錄典型的 NVFP4 量化命令對應(yīng)本文的 Windows 驗(yàn)證環(huán)境python quantize.py \ --model sd3.5-medium \ --model-dtype Half \ --format fp4 \ --batch-size 2 \ --calib-size 128 \ --n-steps 30 \ --quantize-mha \ --quantized-torch-ckpt-save-path ./sd3.5_medium_nvfp4.pt \ --onnx-dir ./onnx_backbone若希望恢復(fù)--restore-from先前量化的 checkpoint腳本會自動通過檢查TensorQuantizer的類型推斷恢復(fù)出的量化格式NVFP4 / FP8 / INT8見quantize.py中的_infer_restored_quantization_format。第二步導(dǎo)出量化 Backbone 為 ONNX量化完成后quantize.py 中的ExportManager.export_onnx()會調(diào)用 onnx_utils/export.py 的modelopt_export_sd()完成 ONNX 導(dǎo)出這里有兩個(gè)關(guān)鍵事實(shí)需要牢記導(dǎo)出使用 opset 20modelopt_export_sd中固定opset_version 20這是示例驗(yàn)證時(shí)torch.onnx.export支持的最高 opset 版本。FP4/FP8 量化模型的 ONNX 圖包含 TRT 特定自定義算子例如用于動態(tài)量化的TRT_FP4DynamicQuantize以及 domain 為trt的DequantizeLinear。modelopt_export_sd對 FP4 精度會先通過configure_linear_module_onnx_quantizers()配置線性層量化器再調(diào)用NVFP4QuantExporter.process_model()生成含 TRT 自定義算子的最終模型。該導(dǎo)出函數(shù)還針對不同模型生成了動態(tài)軸與 dummy 輸入SD3.5 的out_hidden_states、Flux 的img_ids/txt_ids/guidance等FP8 的 Flux 模型還會額外做 RoPE 權(quán)重類型修正flux_convert_rope_weight_type。第三步使用 ONNX Runtime 推理optimum-onnxruntime為包括擴(kuò)散模型在內(nèi)的多種模型提供了可直接運(yùn)行于 ONNX Runtime 的 pipeline。整體流程如下。3.1 使用 Optimum-CLI 導(dǎo)出 FP16 ONNX 模型運(yùn)行 SD、Flux 這類多模態(tài)模型需要管線中所有組件的 ONNX 文件文本編碼器、VAE 編碼/解碼器等。HuggingFace 的optimum-cli可用于將模型導(dǎo)出為 ONNX一般使用onnxruntime-gpu完成 FP16 導(dǎo)出。導(dǎo)出 SD3.5-Medium FP16 ONNX 模型的命令optimum-cli export onnx --model stabilityai/stable-diffusion-3.5-medium --dtype fp16 --device cuda --task text-to-image --opset 20 ./sd3.5_medium_fp16該命令會為管線中的每個(gè)組件生成 ONNX 文件并在輸出根目錄下為每個(gè)組件建立獨(dú)立子目錄。建議在獨(dú)立的 Python 虛擬環(huán)境中執(zhí)行 ONNX 導(dǎo)出。3.2 后處理一將量化 Backbone 的 opset 升級到 23ONNX 的opset 23才支持 Q/DQ 節(jié)點(diǎn)中的 FP4 數(shù)據(jù)類型。因此需要把量化 Backbone ONNX 模型的 opset 升級到 23該過程會修改 ONNX 圖中所有在 opset 21 至 23 之間含兩端定義發(fā)生變化的受影響節(jié)點(diǎn)最后將模型的 opset 字段設(shè)為 23。示例代碼如下model onnx.load(onnx_path) # ... # update affected nodes, if any, as per new opset # ... new_opset_imports [ helper.make_opsetid(, 23), # Default domain # # Update other domains as needed, for example: # helper.make_opsetid(com.microsoft, 1) # Microsoft domain for contrib-ops helper.make_opsetid(trt, 1) # TRT domain for TRT specific custom-ops ] updated_quantized_onnx_model onnx.helper.make_model(model.graph, opset_importsnew_opset_imports) # ... # save updated quantized onnx model # ...3.3 后處理二更新 TRT 自定義算子的輸出類型信息由于 ONNX Runtime 無法自動推斷 TRT 自定義算子的輸出張量類型需要顯式為量化 Backbone ONNX 模型中 TRT 自定義算子的輸出補(bǔ)充類型信息否則可能在創(chuàng)建 Session 或推理時(shí)觸發(fā)類型推斷錯(cuò)誤。本示例提供了現(xiàn)成腳本 type_update_trt_custom_ops.pypython type_update_trt_custom_ops.py --input_pathE:\model.onnx --output_pathE:\output\model.onnx從腳本源碼可以看到其內(nèi)部邏輯遍歷圖中所有節(jié)點(diǎn)對TRT_FP4DynamicQuantize節(jié)點(diǎn)將output_0標(biāo)記為TensorProto.FLOAT4E2M1NVFP4將output_1標(biāo)記為TensorProto.FLOAT8E4M3FNFP8對 domain 為trt的DequantizeLinear節(jié)點(diǎn)將其輸出標(biāo)記為TensorProto.FLOAT。若對應(yīng)的value_info不存在則新建不指定 shape最后以外部數(shù)據(jù)形式保存模型save_as_external_dataTrueall_tensors_to_one_fileTrue。3.4 使用 TRTRTX 執(zhí)行提供程序運(yùn)行 FP4 / FP8 模型ONNX Runtime 的TRTRTX Execution Provider已更新以支持 FP4/FP8 量化模型中的 TRT 特定自定義算子。你可以從源碼構(gòu)建或在 PyPI 上安裝官方提供的 wheel。安裝與使用細(xì)節(jié)請參考 ONNX Runtime 官方 TRTRTX EP 文檔。已知限制目前 NVFP4 模型在 TRTRTX EP 上執(zhí)行存在一些已知的性能問題建議持續(xù)關(guān)注官方后續(xù)更新。3.5 放置量化 Backbone 的 ONNX 模型將第 3.2 / 3.3 步處理后得到的量化 Backbone ONNX 模型文件放到 3.1 步導(dǎo)出的 ONNX 模型結(jié)構(gòu)中對應(yīng)組件Backbone的子目錄內(nèi)替換其中的 FP16 版本。3.6 使用 optimum-onnxruntime 推理optimum-onnxruntime提供ORTStableDiffusion3Pipeline、ORTFluxPipeline等高層 pipeline可方便地加載上述導(dǎo)出的 ONNX 圖并執(zhí)行推理。實(shí)踐時(shí)可以參考 ONNX Runtime 推理示例倉庫中的 Stable Diffusion 推理示例腳本。支持矩陣以下為 Windows ONNX RuntimeTRTRTX EP路徑下經(jīng)過驗(yàn)證的模型支持情況模型fp8nvfp41SD3-Medium-Diffusers??SD3.5-Medium??Flux.1.Dev2??1 NVFP4 推理需要 Blackwell 系列 GPU 才能獲得加速收益。2 在 RTX5090 上量化 Flux.1.Dev 時(shí)建議啟用 CPU offloading 并配備 128 GB 以上的系統(tǒng)內(nèi)存。PTQ 后的精度損失因具體模型與量化方法而異基礎(chǔ)模型越小精度損失通常越明顯。若精度不達(dá)標(biāo)可嘗試禁用 KV-Cache 或 MHA 量化或調(diào)整校準(zhǔn)設(shè)置校準(zhǔn)樣本數(shù)據(jù)、樣本數(shù)量、擴(kuò)散步數(shù)等也可考慮 QAT / QAD當(dāng)前尚未在 Windows RTX 上支持/驗(yàn)證。已驗(yàn)證環(huán)境Validated Settings以下是在本示例路徑上完成驗(yàn)證的軟硬件組合可作為復(fù)現(xiàn)基線Python 3.11.9CUDA 12.9、cuDNN 9.5cudnn-windows-x86_64-9.5.0.50_cuda12-archiveWindows 11Build 22621RTX 5090 RTX Driver 581.42Visual Studio 2022Community 版基礎(chǔ)模型stabilityai/stable-diffusion-3.5-medium任務(wù)類型text-to-imageONNX 導(dǎo)出HuggingFace Optimumopset 20FP16 ONNX 模型推理 EP功能驗(yàn)證TRTRTX EP量化配置NVFP4 max校準(zhǔn)FP4 線性層、FP8 MHA常見問題排查1. FP16 ONNX 導(dǎo)出報(bào) no cuda kernel image is available 類錯(cuò)誤使用 HuggingFaceoptimum-cli導(dǎo)出 FP16 ONNX 時(shí)偶爾會出現(xiàn)該錯(cuò)誤。通常與安裝的onnxruntime-gpu版本有關(guān)可嘗試更換/升級onnxruntime-gpu版本。2. Flux / Stable Diffusion 導(dǎo)出 ONNX 報(bào)aten::rms_norm不支持使用 Model-Optimizer 的 diffusers 示例 導(dǎo)出時(shí)可能出現(xiàn)如下錯(cuò)誤torch.onnx.errors.UnsupportedOperatorError: Exporting the operator aten::rms_norm to ONNX opset version 20 is not supported將diffusers降級到 0.34 版本而非 0.35 或更高可以規(guī)避該問題另一種方式是對導(dǎo)出腳本施加一個(gè)小補(bǔ)丁類似社區(qū) PR 中提出的做法。另外quantize.py 的主入口在啟動時(shí)會用diffusers的RMSNorm替換torch.nn.RMSNorm這本身就是為了緩解新舊版本間 RMSNorm 算子差異的手段。3. 新版 transformers 導(dǎo)入錯(cuò)誤使用 transformers 4.53、4.56 等較新版本時(shí)可能遇到ImportError: cannot import name CLIPSdpaAttention from transformers.models.clip.modeling_clip可將 transformers 降級到較早版本例如 4.51.3 或 4.49以解決。小結(jié)完整的落地路徑可歸納為四步用 quantize.py 對 Backbone 做 FP8/NVFP4 PTQ 量化 → 用modelopt_export_sd導(dǎo)出 opset 20 的量化 ONNX含 TRT 自定義算子→ 用 Optimum-CLI 導(dǎo)出全管線 FP16 ONNX 并將量化 Backbone 的 opset 升級到 23、通過 type_update_trt_custom_ops.py 補(bǔ)齊 TRT 算子輸出類型 → 最后用 TRTRTX EP ORTStableDiffusion3Pipeline/ORTFluxPipeline完成推理。這套方法目前已在 Windows RTX 5090 上對 SD3.5-Medium、Flux.1.Dev 等模型完成驗(yàn)證是 Windows 環(huán)境下將擴(kuò)散模型量化并交付 ONNX Runtime 推理的一條可直接復(fù)用的工程路徑。贊分享人工智能大模型模型優(yōu)化模型量化模型壓縮【免費(fèi)下載鏈接】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.項(xiàng)目地址https://gitcode.com/GitHub_Trending/te/Model-Optimizer點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Model Optimizer 擴(kuò)散模型量化部署實(shí)戰(zhàn)ONNX 導(dǎo)出與 TensorRT 引擎構(gòu)建完整指南Model Optimizer 擴(kuò)散模型量化部署實(shí)戰(zhàn)ONNX 導(dǎo)出與 TensorRT 引擎構(gòu)建完整指南 本篇指南基于 Model Optimizer 倉庫中人工智能大模型模型優(yōu)化模型量化模型壓縮Model Optimizer Windows 平臺 ONNX PTQ 量化實(shí)戰(zhàn)指南INT4 AWQ/RTN 與 FP8 的完整工作流Model Optimizer Windows 平臺 ONNX PTQ 量化實(shí)戰(zhàn)指南INT4 AWQ/RTN 與 FP8 的完整工作流 導(dǎo)讀 本文基于 Mod人工智能大模型模型優(yōu)化模型量化模型壓縮Model-Optimizer ONNX 后訓(xùn)練量化PTQ實(shí)戰(zhàn)指南從 INT8/FP8/INT4 量化到 TensorRT 部署Model Optimizer ONNX 后訓(xùn)練量化PTQ實(shí)戰(zhàn)指南從 INT8/FP8/INT4 量化到 TensorRT 部署 導(dǎo)讀 本文圍繞 exam人工智能大模型模型優(yōu)化模型量化模型壓縮創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考