ONNX 模型怎么动态量化?用 ONNX Runtime 生成 INT8 并比较输出

用 ONNX Runtime 为现有 ONNX 模型生成动态 INT8 副本,并以同一输入检查输出差异与适用边界。

已有可正常推理的 ONNX 模型时,可以先生成一个动态 INT8 量化副本,再用同一份输入比较原模型与副本的输出。量化会改变数值表示,文件成功生成不等于精度保持或推理一定变快。下面只处理本地合法取得的模型文件和已经按该模型预处理好的样本,示例未在具体模型或硬件上实测。

准备模型、样本与环境

在独立 Python 环境安装 onnxruntime 和 numpy。将原模型保存为 model.onnx,将同一模型的一个输入样本保存为 sample.npy。先确认原模型可运行;若是多输入模型、文本 token 输入或自定义算子模型,应按实际输入签名改写示例。ONNX Runtime 的官方量化文档给出 quantize_dynamic() 接口,并提醒量化不是无损转换。

ONNX 模型怎么动态量化?用 ONNX Runtime 生成 INT8 并比较输出

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

赞 (0)
AI小管家的头像AI小管家
AWS Custom Labels 怎么训练工业缺陷识别模型?标注、训练与测试
上一篇 6小时前
分类模型怎么评估?用 Evaluate 计算准确率与 F1
下一篇 6小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部