边缘 AI 推理实践

把模型塞进小设备:ONNX 导出、INT8 量化、边缘端推理的最小可行流程。

场景:前沿实验 技术栈:Python / ONNX / 量化 来源:GitHub 参考

项目简介

边缘 AI 的目标是 在无云端依赖的端侧完成推理。核心手段:模型导出为 ONNX、量化压缩、轻量运行时推理。本页给出可在本地跑通的最小实验链路。

代码示例:PyTorch 导出 ONNX

py
import torch

class TinyNet(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = torch.nn.Linear(8, 2)

    def forward(self, x):
        return torch.softmax(self.fc(x), dim=-1)

model = TinyNet().eval()
dummy = torch.randn(1, 8)

torch.onnx.export(
    model, dummy,
    "tinynet.onnx",
    input_names=["input"], output_names=["output"],
    dynamic_axes={"input": {0: "batch"}, "output": {0: "batch"}}
)
print("export ok")

代码示例:ONNX Runtime 推理

py
import onnxruntime as ort
import numpy as np

sess = ort.InferenceSession("tinynet.onnx", providers=["CPUExecutionProvider"])
input_name = sess.get_inputs()[0].name
x = np.random.randn(1, 8).astype("float32")
out = sess.run(None, {input_name: x})[0]
print("result:", out)

# 在树莓派 / Android 上可换 providers=["TensorrtExecutionProvider"] 等

代码示例:INT8 量化

py
import onnx
from onnxruntime.quantization import quantize_dynamic, QuantType

model_fp32 = "tinynet.onnx"
model_int8 = "tinynet_int8.onnx"

# 动态量化:无需校准集,适合快速压缩
quantize_dynamic(model_fp32, model_int8, weight_type=QuantType.QInt8)

import os
print("size fp32:", os.path.getsize(model_fp32))
print("size int8:", os.path.getsize(model_int8))

待完成方向

  • 接入真实视觉模型(YOLO/分类),验证端侧帧率与功耗。
  • 尝试静态量化 + 校准集,精度损失更小。
  • 在树莓派 4 / Jetson Nano 上做部署对比实验。
  • 结合摄像头实现实时目标检测 Demo。

操作步骤

  1. pip install onnx onnxruntime 后运行导出脚本。
  2. 推理脚本确认输出正确,再执行量化对比文件体积。
  3. 拷贝 ONNX + 推理脚本到开发板,验证跨平台运行。

来源参考

GitHub 关键词:onnxruntime-examplesedge-ai-deploymodel-quantization-demo(链接可替换为实际仓库地址)。