引言
yolov5最新版本的6.x已经支持直接导出engine文件并部署到tensorrt上了。
fp32推理tensorrt演示
可能很多人不知道yolov5新版本6.x中已经支持一键导出tensor支持engine文件,而且只需要一条命令行就可以完成:演示如下:
python export.py --weights yolov5s.pt --include onnx engine --device 0
其中onnx表示导出onnx格式的模型文件,支持部署到:
- opencv dnn- openvino- tensorrt- onnxruntime但是在tensorrt上推理想要速度快,必须转换为它自己的engine格式文件,参数engine就是这个作用。上面的命令行执行完成之后,就会得到onnx格式模型文件与engine格式模型文件。--device 0参数表示gpu 0,因为我只有一张卡!上述导出的fp32的engine文件。
使用tensorrt推理 yolov5 6.x中很简单,一条命令行搞定了,直接执行:
python detect.py --weights yolov5s.engine --view-img --source data/images/zidane.jpg
fp16推理tensorrt演示
在上面的导出命令行中修改为如下
python export.py --weights yolov5s.onnx --include engine --half --device 0其中就是把输入的权重文件改成onnx格式,然后再添加一个新的参 --half 表示导出半精度的engine文件。就这样直接执行该命令行就可以导出生成了,图示如下:
对比可以发现相比fp32大小的engine文件,fp16的engine文件比fp32的engine大小减少一半左右,整个文件只有17mb大小左右。
推理执行的命令跟fp32的相同,直接运行,显示结果如下:
对比发现fp32跟fp16版本相比,速度提升了但是精度几乎不受影响!
int8量化与推理tensorrt演示
tensorrt的int量化支持要稍微复杂那么一点点,最简单的就是训练后量化。只要完成calibrator这个接口支持,我用的tensorrt版本是8.4.0.x的,它支持以下几种calibrator:
不同的量化策略,得到的结果可能稍有差异,另外高版本上的int8量化之后到低版本的tensorrt机器上可能无法运行,我就遇到过!所以建议不同平台要统一tensorrt版本之后,再量化部署会比较好。上面的calibrator都必须完成四个方法,分别是:
#使用calibrator验证时候每次张数,跟显存有关系,最少1张get_batch_size #获取每个批次的图像数据,组装成cuda内存数据get_batch #如果以前运行过保存过,可以直接读取量化,低碳给国家省电read_calibration_cache #保存calibration文件,量化时候会用到write_calibration_cache
这块对函数集成不懂建议参考tensorrt自带的例子:
tensorrt-8.4.0.6samplespythonint8_caffe_mnist几乎是可以直接用的!copy过来改改就好了!
搞定了calibrator之后,需要一个验证数据集,对yolov5来说,其默认coco128数据集就是一个很好的验证数据,在data文件夹下有一个coco128.yaml文件,最后一行就是就是数据集的下载url,直接通过url下载就好啦。
完成自定义yolov5的calibrator之后,就可以直接读取onnx模型文件,跟之前的官方转换脚本非常相似了,直接在上面改改,最重要的配置与生成量化的代码如下:
# build trt enginebuilder.max_batch_size = 1config.max_workspace_size = 1 << 30config.set_flag(trt.builderflag.int8)config.int8_calibrator = calibratorprint('int8 mode enabled')plan = builder.build_serialized_network(network, config)主要就是设置config中的flag为int8,然后直接运行,得到plan对象,反向序列化为engine文件,保存即可。最终得到的int8量化engine文件的大小在9mb左右。
数据太少,只有128张, int8量化之后的yolov5s模型推理结果并不尽如人意。但是我也懒得再去下载coco数据集, coco训练集一半数据作为验证完成的量化效果是非常好。 这里,我基于yolov5s模型自定义数据集训练飞鸟跟无人机,对得到模型,直接用训练集270张数据做完int8量化之后的推理效果如下:
量化效果非常好,精度只有一点下降,但是速度比fp32的提升了1.5倍左右(3050ti)。
已知问题与解决
量化过程遇到这个错误
[09/22/2022-2313] [trt] [i] calibrated batch 127 in 0.30856 seconds.[09/22/2022-2316] [trt] [e] 2: [quantization.cpp::70] error code 2: internal error (assertion min_ <= max_ failed. )[09/22/2022-2316] [trt] [e] 2: [builder.cpp::619] error code 2: internal error (assertion engine != nullptr failed. )failed to create the enginetraceback (most recent call last):
解决方法,把calibrator中getbtach方法里面的代码:
img = np.ascontiguousarray(img, dtype=np.float32)
to
img = np.ascontiguousarray(img, dtype=np.float16)
这样就可以避免量化失败。
超声波塑料焊接机的结构组成是怎样的,它的优点是什么
大数据时代企业如何保障数据安全?这款工具值得一看
虹科分享 | 虹科Dimetix激光测距传感器如何利用反射来测量?(上)
人工智能是什么时候再次流行起来的?
分析师认为混合组网将使TD-SCDMA发展遭重创
FP32推理TensorRT演示
基于STM32和ESP8266的物联网控制系统
光模块MSA多源协议的详细讲解
FITEE“新型存储系统设计与应用”专题导读
数据仓库和OLAP技术概述
天天淘好货HP8116A信号发生器HP8116A
2020年Java开发岗位受欢迎的有哪些?这篇文章将告诉你答案
三大电信运营商在工业互联网产业上进行了哪些布局,当前成绩如何?
百度发布L4级自动驾驶汽车,成本仅25万,李彦宏:未来打车便宜一半
示波器不在身边 两招教你解决测试工作受限问题
讨论几个对重型汽车电气连接至关重要的问题
中微爱芯小封装逻辑芯片 节省PCB空间
线路与基材平齐PCB制作是怎一回事
浅谈后量子密码技术的现状及前景
国芯思辰 | 霍尔开关AH402F可替代SS361CT用于家用热水器流量计