pymnn: Python Module API 推理报错:Reshape error: 202 -> 0,但是相同模型 Python Session API 推理正常
平台(如果交叉编译请再附上交叉编译目标平台):
Platform(Include target platform as well if cross-compiling):
Linux
pymnn 版本:
2.9.1
遇到问题
我使用pymnn 中的 Python Module API 进行模型推理,这是我的代码:
import MNN.nn as nn
import MNN.numpy as np
config = {}
config['backend'] = 0
config['numThread'] = 1
rt = nn.create_runtime_manager((config,))
net = nn.load_module_from_file('xxx/mode.mnn', ['inputs'], ['Identity'])
input = np.random.rand(1,203).astype(np.float32)
output_var = net.forward(input)
执行报错:
Reshape error: 202 -> 0
Compute Shape Error for Reshape15
code=3 in onForward, 403
[1] 250644 segmentation fault (core dumped) python3
但是同样的模型,我使用 pymnn 中的 Python Session API 方式推理,推理成功,这是使用的 Python Session API 的代码:
import numpy as np
import MNN
interpreter = MNN.Interpreter('xxx/model.mnn')
session = interpreter.createSession()
input_data = np.random.rand(1,203).astype(np.float32)
input_tensor = interpreter.getSessionInput(session)
input_tensor.fromNumpy(input_data)
interpreter.runSession(session)
output_tensor = interpreter.getSessionOutput(session)
output_data = output_tensor.getNumpyData()
print(output_data)
其他信息
模型是从 TensorFlow Lite 转换到 MNN 的,以及原始的TensorFlow savedmodel 模型,在triton中是支持batch的,且会返回与batch size相同数量的推理结果
问题
问题一:Python Module API 使用相同形状的输入,为什么会报错,以及我有什么排查建议 问题二: Python Session API 方式推理,模型本身支持batch,但是当我增加 batch后,推理的返回仍然是一个,看上去并不支持batch,我需要怎么做让他支持batch
- ./GetMNNInfo 看一下,大概率是因为 mnn.numpy 的默认格式为 NCHW ,和 tflite 转成 mnn 的格式 NHWC 不匹配。目前这个问题还在方案讨论中,可以换用 onnx -> mnn ,或者用原始的表达式接口:MNN.placeholder 去构造输入。
- 检查原始模型是否支持修改 batch 大小,一般建议导出 onnx 或者 pb 再转 mnn 。不确定 tflite 模型是否支持 batch
./GetMNNInfo 输出如下
$ ./build/GetMNNInfo model.mnn
The device support i8sdot:0, support fp16:0, support i8mm: 0
Model default dimensionFormat is NHWC
Model Inputs:
[ inputs ]: dimensionFormat: NHWC, size: [ 1,318 ], type is float
Model Outputs:
[ Identity ]
Model Version: 2.9.1
@jxt1234 请问一下, 我用onnx 模型转换成mnn模型,推理没有报错,但是模型的输出有两个,实际只推理结果返回了一个值。 GetMNNInfo 信息如下:
$ ./build/GetMNNInfo onnx_xxxx.mnn
The device support i8sdot:0, support fp16:0, support i8mm: 0
Model default dimensionFormat is NCHW
Model Inputs:
[ input_1 ]: dimensionFormat: NCHW, size: [ 1,78 ], type is float
Model Outputs:
[ output_1 ]
[ output_2 ]
Model Version: 2.9.1
推理代码如下:
file = './onnx_xxxx.mnn'
config = {}
config['backend'] = 0
config['numThread'] = 1
runtime_manager = nn.create_runtime_manager((config,))
net = nn.load_module_from_file(file, [], [], runtime_manager=runtime_manager)
input_data = np.random.rand(1, 78).astype(np.float32)
output_var = net.forward(input_data)
print("推理结果:", output_var)
输出如下,但是根据模型输出信息,应该有[ output_1 ] [ output_2 ]两个数据,实际只有一个
推理结果: array([[0.12390693]], dtype=float32)
net.forward(input_data) 改为 net.forward([input_data])
输入数组,输出就是数组
@jxt1234 你好,我们在测试时发现当模型输入形状或者数据类型不是Var类型时,会出现段错误导致进程挂掉,因此我们在调用forward之前增加了输入形状和类型的校验来避免这种情况。所以想再请问下,除了输入形状和数据类型不正常会导致进程挂掉,还有哪些情况或者边界条件下,也会出现段错误或者进程挂掉,我们希望通过提前校验来避免进程挂掉。
Marking as stale. No activity in 60 days.