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

在Python中使用ONNX Runtime添加多个初始化器时遇RuntimeException异常

ONNX Runtime批量添加初始化器报错的解决方法

问题原因

你遇到的onnxruntime.capi.onnxruntime_pybind11_state.RuntimeException,是因为错误通过SessionOptions.add_initializer批量注入初始化器。SessionOptions的该方法并非为批量操作设计,且直接传递OrtValue时易触发内存生命周期管理问题,导致会话创建时无法正确读取初始化器数据。

修复方案

改用InferenceSession构造函数的initializers参数批量传入初始化器,这是ONNX Runtime官方推荐的批量注入方式,无需依赖SessionOptions,代码更简洁且避免生命周期问题。

修复后的完整代码:

import onnxruntime
import numpy as np

params = {"fc1.weight": [3, 4], "fc1.bias": [3]}
# 构造初始化器字典,键为参数名,值为numpy数组
initializers = {
    param_name: np.float32(np.random.rand(*dim))
    for param_name, dim in params.items()
}

# 创建会话时直接传入initializers参数
net_session = onnxruntime.InferenceSession(
    'net1.onnx',
    initializers=initializers,
    providers=["CPUExecutionProvider"]
)

input_data = np.random.random((1,4)).astype('f')
output = net_session.run(["output"], {"input": input_data})
print(output)

可选方案(使用OrtValue)

若因设备优化等需求必须使用OrtValue,需确保所有OrtValue对象在会话创建完成前始终保持有效(比如用字典存储避免被GC回收),再逐一添加到SessionOptions:

import onnxruntime
import numpy as np

params = {"fc1.weight": [3, 4], "fc1.bias": [3]}
options = onnxruntime.SessionOptions()
# 用字典存储OrtValue,避免被提前回收
ort_initializers = {}

for param_name, dim in params.items():
    arr = np.float32(np.random.rand(*dim))
    ort_val = onnxruntime.OrtValue.ortvalue_from_numpy(arr)
    ort_initializers[param_name] = ort_val
    options.add_initializer(param_name, ort_val)

# 确保ort_initializers在会话创建前未被销毁
net_session = onnxruntime.InferenceSession(
    'net1.onnx',
    sess_options=options,
    providers=["CPUExecutionProvider"]
)

input_data = np.random.random((1,4)).astype('f')
output = net_session.run(["output"], {"input": input_data})
print(output)

优先推荐第一种方案,代码更简洁且不易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:40:32