Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

end2end C++推理报错,[pluginV2DynamicExtRunner.cpp::execute::115] Error Code 2: Internal Error (Assertion status == kSTATUS_SUCCESS failed. ) #76

Open
leayz-888 opened this issue Dec 30, 2022 · 15 comments

Comments

@leayz-888
Copy link

您好,我按照指令:python export.py --weights ./yolov7-tiny.pt --grid --simplify将pt模型转为onnx
然后使用:python export.py -o ./yolov7-tiny.onnx -e yolov7-tiny.engine -p int8 --calib_input ./calibration_img --end2end --calib_num_images 500 进行量化,成功得到了engine文件,但是我发现engine文件有7个输出,分别是:278/336/394、num/boxes/scores/classes,前面3个是小、中、大检测头的输出,后4个是端到端的输出,我确认了main.cpp中的输入输出节点名称是一样的,但是在使用engine文件推理的时候报错:
[pluginV2DynamicExtRunner.cpp::execute::115] Error Code 2: Internal Error (Assertion status == kSTATUS_SUCCESS failed. )
Segmentation fault (core dumped)
请问一下这是为什么呢?

@leayz-888
Copy link
Author

我的trt版本是8.4.0.6
torch版本是1.8.1

@Linaom1214
Copy link
Owner

您好,我按照指令:python export.py --weights ./yolov7-tiny.pt --grid --simplify将pt模型转为onnx 然后使用:python export.py -o ./yolov7-tiny.onnx -e yolov7-tiny.engine -p int8 --calib_input ./calibration_img --end2end --calib_num_images 500 进行量化,成功得到了engine文件,但是我发现engine文件有7个输出,分别是:278/336/394、num/boxes/scores/classes,前面3个是小、中、大检测头的输出,后4个是端到端的输出,我确认了main.cpp中的输入输出节点名称是一样的,但是在使用engine文件推理的时候报错: [pluginV2DynamicExtRunner.cpp::execute::115] Error Code 2: Internal Error (Assertion status == kSTATUS_SUCCESS failed. ) Segmentation fault (core dumped) 请问一下这是为什么呢?

建议使用netron检查模型输出

@leayz-888
Copy link
Author

1672705218246

1672705531309

感谢回复,这是我模型的输入输出,output中包含了小、中、大检测头的输出

@Linaom1214
Copy link
Owner

1672705218246

1672705531309

感谢回复,这是我模型的输入输出,output中包含了小、中、大检测头的输出
修改导出代码,使得onnx模型只包含output一个输出节点

@leayz-888
Copy link
Author

感谢大佬!我按照您说的将导出代码改了,现在output中只有一个输出,可以成功将onnx转化为engine(fp16和int8都可以),执行end2end的cpp的时候也不报之前的错了,其中fp16推理精度是没问题的,但是在int8量化完之后,检测精度有较大的下降,请问这是什么原因呢?
image

@Linaom1214
Copy link
Owner

Linaom1214 commented Jan 5, 2023

int8 效果取决于你的校准集,增加校准集数据量 @leayz-888

@leayz-888
Copy link
Author

int8 效果取决于你的校准集,增加校准集数据量 @leayz-888
我试过校准集的数据量为500/1000/5000/10000,可是检测精度还是有很大的下降

@Linaom1214
Copy link
Owner

int8 效果取决于你的校准集,增加校准集数据量 @leayz-888
我试过校准集的数据量为500/1000/5000/10000,可是检测精度还是有很大的下降

我当时验证过v6得代码,是没有问题的,v7你是哪个模型,可能是v7的重参数化会影响量化效果。

@leayz-888
Copy link
Author

int8 效果取决于你的校准集,增加校准集数据量 @leayz-888
我试过校准集的数据量为500/1000/5000/10000,可是检测精度还是有很大的下降

我当时验证过v6得代码,是没有问题的,v7你是哪个模型,可能是v7的重参数化会影响量化效果。

v7/v7-tiny都试了,都是这个问题

@Linaom1214
Copy link
Owner

int8 效果取决于你的校准集,增加校准集数据量 @leayz-888
我试过校准集的数据量为500/1000/5000/10000,可是检测精度还是有很大的下降

我当时验证过v6得代码,是没有问题的,v7你是哪个模型,可能是v7的重参数化会影响量化效果。

v7/v7-tiny都试了,都是这个问题

你可以在v7的repo里看一下,有没有提到这个问题,或者验证一下v6是不是也存在这个问题。

@leayz-888
Copy link
Author

好的,我验证了v7、v7-tiny带nms插件的fp16的engine推理精度是没问题的,感觉是int8量化过程出问题了

@Linaom1214
Copy link
Owner

是的,我的意思是可能是v7的重参数化,本身就对int8量化不友好。 @leayz-888

@leayz-888
Copy link
Author

是的,我的意思是可能是v7的重参数化,本身就对int8量化不友好。 @leayz-888
我将导出代码恢复成之前的样子,现在output中重新包含4个输出,然后进行end2end int8量化,得到的engine文件有7个输出,分别是:小、中、大检测头的输出(这3个输出是没用的),接着是端到端的输出:框的个数、框坐标、置信度、类别。
我用Python进行推理的时候只取到后面四个输出:
num, final_boxes, final_scores, final_cls_inds = self.infer(img)[3:]
这样Python得到的检测结果没问题了,想问一下:如果我不改导出代码,还是想用end2end中的main.cpp进行推理,那么main.cpp应该怎么做相应的修改呢?谢谢啦!(engine文件有7个输出,用Python切片操作很容易得到后面4个端到端的输出)

@xiyangyang99
Copy link

我用的yolov5l模型在onnx转engin的时候能成功的。但是推理出来的结果是空白的。

@Linaom1214
Copy link
Owner

我用的yolov5l模型在onnx转engin的时候能成功的。但是推理出来的结果是空白的。

v5 目前更新了仓库, 需要保证输出是一个, 建议使用netron 查看onnx模型,修改代码使得导出只有一个输出!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants