已有可正常推理的 ONNX 模型时,可以先生成一个动态 INT8 量化副本,再用同一份输入比较原模型与副本的输出。量化会改变数值表示,文件成功生成不等于精度保持或推理一定变快。下面只处理本地合法取得的模型文件和已经按该模型预处理好的样本,示例未在具体模型或硬件上实测。
准备模型、样本与环境
在独立 Python 环境安装 onnxruntime 和 numpy。将原模型保存为 model.onnx,将同一模型的一个输入样本保存为 sample.npy。先确认原模型可运行;若是多输入模型、文本 token 输入或自定义算子模型,应按实际输入签名改写示例。ONNX Runtime 的官方量化文档给出 quantize_dynamic() 接口,并提醒量化不是无损转换。

import numpy as np
import onnxruntime as ort
original = ort.InferenceSession("model.onnx", providers=["CPUExecutionProvider"])
inputs = original.get_inputs()
if len(inputs) != 1 or inputs[0].type != "tensor(float)":
raise ValueError("本例只处理单个 float32 张量输入")
sample = np.load("sample.npy", allow_pickle=False)
if sample.dtype != np.float32 or sample.ndim != len(inputs[0].shape):
raise ValueError("请按模型输入规格准备 float32 样本")
for actual, expected in zip(sample.shape, inputs[0].shape):
if isinstance(expected, int) and actual != expected:
raise ValueError("样本形状与模型输入不符")
feed = {inputs[0].name: sample}
before = original.run(None, feed)
print("原模型输出:", [(x.shape, x.dtype) for x in before])
生成 INT8 副本并比较
将量化输出写入新文件,保留原模型作为对照。这里的 QuantType.QInt8 指定权重使用有符号 8 位整数;实际模型里哪些算子被量化,要查看生成的模型图,不能只凭文件名判断。
from pathlib import Path
from onnxruntime.quantization import QuantType, quantize_dynamic
quantize_dynamic("model.onnx", "model.int8.onnx", weight_type=QuantType.QInt8)
print("量化副本字节数:", Path("model.int8.onnx").stat().st_size)
quantized = ort.InferenceSession("model.int8.onnx", providers=["CPUExecutionProvider"])
after = quantized.run(None, feed)
if len(before) != len(after):
raise ValueError("前后模型输出数量不同")
for index, (left, right) in enumerate(zip(before, after)):
if left.shape != right.shape:
raise ValueError(f"输出 {index} 的形状不同")
delta = np.abs(left.astype(np.float64) - right.astype(np.float64))
print("输出", index, "最大绝对差", float(delta.max()),
"平均绝对差", float(delta.mean()))
验证方法是先看到副本文件可以加载、同一输入的输出数量与形状相符,再结合业务任务比较预测类别、回归误差或其他正式指标。差值没有通用合格阈值,应按原任务的允许误差确定;如果输出不是数值张量,需要按输出类型另写比较方法。文件大小、耗时也应在同一设备、相同输入和重复运行条件下单独测量,不能从本例推断加速幅度。
若量化或加载失败,先核对原模型是否可运行、ONNX Runtime 对该算子的支持以及文件读写权限。若输出差异不可接受,保留原模型并尝试更合适的量化策略或校准方案;不要把“生成了 INT8 文件”当成上线依据。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/29963.html