MNN icon indicating copy to clipboard operation
MNN copied to clipboard

pymnn: Python Module API 推理报错:Reshape error: 202 -> 0,但是相同模型 Python Session API 推理正常

Open soulseen opened this issue 1 year ago • 5 comments

平台(如果交叉编译请再附上交叉编译目标平台):

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

soulseen avatar Jun 24 '24 13:06 soulseen

  1. ./GetMNNInfo 看一下,大概率是因为 mnn.numpy 的默认格式为 NCHW ,和 tflite 转成 mnn 的格式 NHWC 不匹配。目前这个问题还在方案讨论中,可以换用 onnx -> mnn ,或者用原始的表达式接口:MNN.placeholder 去构造输入。
  2. 检查原始模型是否支持修改 batch 大小,一般建议导出 onnx 或者 pb 再转 mnn 。不确定 tflite 模型是否支持 batch

jxt1234 avatar Jun 25 '24 03:06 jxt1234

./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

soulseen avatar Jun 25 '24 03:06 soulseen

@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)

soulseen avatar Jun 25 '24 10:06 soulseen

net.forward(input_data) 改为 net.forward([input_data])

输入数组,输出就是数组

jxt1234 avatar Jun 26 '24 02:06 jxt1234

@jxt1234 你好,我们在测试时发现当模型输入形状或者数据类型不是Var类型时,会出现段错误导致进程挂掉,因此我们在调用forward之前增加了输入形状和类型的校验来避免这种情况。所以想再请问下,除了输入形状和数据类型不正常会导致进程挂掉,还有哪些情况或者边界条件下,也会出现段错误或者进程挂掉,我们希望通过提前校验来避免进程挂掉。

soulseen avatar Jul 01 '24 06:07 soulseen

Marking as stale. No activity in 60 days.

github-actions[bot] avatar Aug 30 '24 09:08 github-actions[bot]