PaddlePaddle / Paddle-Lite

PaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)
https://www.paddlepaddle.org.cn/lite
Apache License 2.0
6.95k stars 1.61k forks source link

运行多输入模型的时候,报错:Segmentation fault #3982

Closed BlainWu closed 8 months ago

BlainWu commented 4 years ago

自己的模型训练的时候是要输入两个参数,在paddle上训练是正常的。但是当预测的时候,到predictor.run()会报错:“Segmentation fault” 我的定义的预测函数是这样,是不是输入有问题?在文档中没有找到多输入的例子,不知道是预测函数有问题还是模型有问题 `

def predict(predictor, image,vel):

img = image#输入图像数据
img = img.reshape(1, 3, 128, 128)

speed = []
speed.append(vel)

input_img = predictor.get_input(0)
input_speed = predictor.get_input(1)

input_img.resize((1, 3, 128, 128))#设置接口图像大小
input_img.set_data(img)
input_speed.set_data(speed)

predictor.run()
out = predictor.get_output(0)
score = out.data()[0]
print(out.data()[0])
return score`

看到有个类似的问题#3851,也没有回答

jiweibo commented 4 years ago

可以设置环境变量export GLOG_v=4,看下详细的报错信息

zhupengyang commented 4 years ago
BlainWu commented 4 years ago
  • 确认用的 paddlelite 什么版本?
  • 确认模型的第二个输入的数据类型是什么
  • 确认 img 的数据类型是 float32;且使用 input_img.set_float_data
  • 确认 speed 的数据类型是 int32;且input_speed 需要 resize;且用 input_speed.set_int32_data

是0.0.1版本的,很多功能都没有

zhupengyang commented 4 years ago

是0.0.1版本的,很多功能都没有

建议用最新的 2.6.1 版本

BlainWu commented 4 years ago

是0.0.1版本的,很多功能都没有

建议用最新的 2.6.1 版本

用的是百度的Edgeboard系列,我看有人说还没有新paddlelite版本可用啊 头大

BlainWu commented 4 years ago

后续做了相关调试,还是存在以下问题:(是不是早期版本的paddlelite不支持多输入) 训练模型定义为:def cnn_model(image,speed): 这种格式是否在正确???

  1. 文档中,设置接口的尺寸用的是方括号,但是在我实际使用的时候方括号,当运行到 input_img.resize([1, 3, 128, 128]) 会报错: error ����Uthe send buff is: 00 aa dc 05 dc 05 c2 55 用圆括号的时候就不会报错。

2.两个输入量都是float型的,当把set_data改为set_float_data时候,同样会报错: error ����Uthe send buff is: 00 aa dc 05 dc 05 c2 55

3.训练模型中第二个参数:def cnn_model(image,speed): 尺寸如下 name: "speed" type { type: LOD_TENSOR lod_tensor { tensor { data_type: FP32 dims: -1 dims: 1 dims: 10 } lod_level: 0 } } 但是运行到 predictor.run()的时候还是会出现Segmentation fault。大无语,不知道怎么解决

` def predict(predictor, image, vel):

img = image  # 输入图像数据
img = img.reshape(1, 3, 128, 128)
speed = [[float(vel)] * 10] #转为(1,10)尺寸
speed = np.array(speed)     #list转为arrary
speed = speed.reshape(1,10)

input_img = predictor.get_input(0)  # 接口参数名称0
input_speed = predictor.get_input(1)  # 设置接口参数名称1

input_img.resize((1, 3, 128, 128))  # 设置接口图像大小
input_speed.resize((1,10))

input_img.set_data(img)
input_speed.set_data(speed)

predictor.run()

out = predictor.get_output(0)
score = out.data()[0]
return score

`

zhupengyang commented 4 years ago

input_speed.resize((1,10)) -> input_speed.resize((1,1,10)) 这样呢?


另外 img,speed 转成 list 再 set_data 放进去?

BlainWu commented 4 years ago

input_speed.resize((1,10)) -> input_speed.resize((1,1,10)) 这样呢?

另外 img,speed 转成 list 再 set_data 放进去?

刚刚测试了下,都还是一样的报错,没有区别。我打算把两个输入并到一起作为一个输入,然后在网络里重新拆开用试试

StarryDing commented 4 years ago

@BlainWu 哥们儿你这个问题解决了么...我也遇到了一样的问题.......