在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
相关产品推荐
相关产品推荐

