You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分ONNX格式DNN模型以实现边云协同分段推理

ONNX模型拆分与分段运行实现方案

第一步:理清节点结构与拆分点

不需要依赖第三方工具做节点梳理,直接用ONNX原生API遍历所有节点即可,你可以打印每个节点的类型、名称、输入输出张量名,快速定位你要拆分的位置:

import onnx

# 加载你导出的模型
onnx_model = onnx.load("mobilenet_v2.onnx")
graph = onnx_model.graph

# 遍历所有节点,打印关键信息
for idx, node in enumerate(graph.node):
    print(f"节点序号: {idx}, OP类型: {node.op_type}, 节点名称: {node.name}")
    print(f"输入张量: {node.input}")
    print(f"输出张量: {node.output}")
    print("-"*50)

运行之后记录你要拆分位置的输出张量名,比如你要把前N层放边缘端,就记录第N层节点的output张量名,假设这里记录为splitter_tensor。

第二步:用原生API拆分ONNX模型

ONNX自带onnx.utils.extract_model接口,直接支持按输入输出张量拆分模型,不需要手动修改计算图结构,自动处理依赖的常量、初始化参数。

拆分边缘端运行的前半段(从原输入到拆分点)的代码:

# 原模型输入张量名,你可以通过print(graph.input)查看,MobileNetV2一般是["input_1:0"]
original_input = [i.name for i in graph.input]
# 拆分点的输出张量名,就是你上一步记录的splitter_tensor
edge_output = ["splitter_tensor"]

# 导出边缘端模型
onnx.utils.extract_model(
    "mobilenet_v2.onnx",
    "edge_part.onnx",
    input_names=original_input,
    output_names=edge_output
)

拆分云端运行的后半段(从拆分点到原输出)的代码:

# 后半段输入就是拆分点的张量名
cloud_input = ["splitter_tensor"]
# 原模型输出张量名,print(graph.output)可查看
original_output = [o.name for o in graph.output]

# 导出云端模型
onnx.utils.extract_model(
    "mobilenet_v2.onnx",
    "cloud_part.onnx",
    input_names=cloud_input,
    output_names=original_output
)

第三步:分段运行验证

用ONNX Runtime分别加载两段模型,验证结果和原模型一致即可:

import onnxruntime as ort
import numpy as np

# 生成测试输入,和原模型输入shape一致,MobileNetV2是(1,224,224,3)
test_input = np.random.randn(1,224,224,3).astype(np.float32)

# 运行原模型对比
ort_original = ort.InferenceSession("mobilenet_v2.onnx")
original_out = ort_original.run(None, {original_input[0]: test_input})[0]

# 运行边缘端前半段
ort_edge = ort.InferenceSession("edge_part.onnx")
edge_out = ort_edge.run(None, {original_input[0]: test_input})[0]

# 运行云端后半段
ort_cloud = ort.InferenceSession("cloud_part.onnx")
cloud_out = ort_cloud.run(None, {cloud_input[0]: edge_out})[0]

# 验证结果误差,数值接近说明拆分正确
print(np.mean(np.abs(cloud_out - original_out)))

注意事项:

  • 拆分时保持原模型的opset版本一致,不要手动修改算子版本
  • 如果拆分后模型运行报错,可先调用onnx.checker.check_model()检查拆分后的模型合法性
  • 动态维度的模型拆分后如果运行出错,可以在导出时手动指定输入输出的shape固定维度

内容的提问来源于stack exchange,提问作者Starivore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:09:01