#yolov3_dcn_nv_hackthon2021
##简介 本开源内容为 英伟达-阿里云异构计算TensorRT 加速AI推理Hackathon 2021 比赛项目,利用TensorRT对模型的推理过程进行加速
##使用模型 选取yolov3模型作为原始模型,模型的结构可以直接从PaddleDetection上获取,非常方便。
PaddleDetection源码:https://github.com/PaddlePaddle/PaddleDetection
##名词解释
名称 | 解释 |
---|---|
Paddle | 百度的原始深度学习框架 |
Paddle-trt | paddle集成了trt的推理库 |
Quake | 本次参赛的框架,集成了模型编译和推理(包含TensorRT推理) |
##环境依赖
###硬件环境 注:本次比赛nvidia官方提供了开发用的基本docker镜像,镜像名称为nvcr.io/nvidia/tensorrt:21.02-py3
硬件类型 | 详细信息 |
---|---|
GPU | Tesla T4 |
CPU | Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz |
内存 | DDR4 30G |
###软件环境
软件类型 | 版本 |
---|---|
系统 | Ubuntu 7.5.0-3ubuntu1~18.04 |
Gpu驱动 | 460.32.03 |
Cuda | 11.2 |
Cudnn | 8.2 |
TensrRT | 7.2.2 |
Python | 3.8.5 |
gcc/g++ | 8.4.0 |
###python依赖包
库名称 | 版本 |
---|---|
Cython | 0.29.23 |
matplotlib | 3.4.1 |
numpy | 1.19.5 |
nvidia-pyindex | 1.0.8 |
opencv-python | 4.5.1.48 |
paddlepaddle-gpu | 2.0.1(需要手动编译,否则无法支持TensorRT) |
Pillow | 8.1.0 |
polygraphy | 0.22.0 |
protobuf | 3.14.0 |
pycocotools | 2.0 |
pycuda | 2020.1 |
PyGObject | 3.36.0 |
python-dateutil | 2.8.1 |
pytools | 2021.1 |
PyYAML | 5.4.1 |
pyzmq | 22.0.3 |
requests | 2.25.1 |
scipy | 1.6.2 |
setuptools | 45.2.0 |
six | 1.15.0 |
tensorrt | 7.2.2.3 |
tqdm | 4.60.0 |
urllib3 | 1.26.4 |
注:Paddle-gpu包编译复杂, datas/pkg下存放了与要求环境匹配的whl包
###算子库环境 本项目中使用的模型优化代码和库需要进行单独编译才能使用,编译代码如下:
cd ops_lib && \
mkdir build && \
cd build && \
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/quake ../ && \
make -j40 install && \
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/quake/lib
###数据准备 需要下载测试数据,并解压到/usr/local/quake/datas,测试数据路径为: 使用(待添加)方式下载
##目录结构介绍
|--benchmark 用于测试优化后模型性能的工具包
|--------dataset 用于测试的数据集
|--------images 量化数据集
|--------coco 进行精度和耗时测试的数据集
|--------model 存放已经导出的paddle模型
|--------create_paddle_quantization_data.py 生成paddle-trt的校准数据集
|--------infer.py benchamark测试接口
|--bug_codes 可以复现TensorRT使用过程中的bug的代码
|--network 优化网络的核心代码
|--------visualize 可视化结构可以使用netron打开
|------------parse.prototxt 原始结构
|------------optimize.prototxt为优化后结构(可以使用原始框架进行inference)
|------------compile.prototxt为编译时结构(匹配tensorrt,但不能用原始框架进行inference)
|--------engine_code 构建engine的tensorrt代码
|--ops_lib 比赛中使用到的算子库
|--readme.md 本项目的详细介绍
##onnx转换 onnx转换需要安装paddle2onnx,本章节简单说明paddle的yolov3模型转onnx的操作,但该onnx模型无法通过trt的engine进行编译。
#安装onnx2paddle
pip instlal paddle2onnx
转换操作
# 该命令必须在本工程根目录下执行
paddle2onnx
--model_dir ./benchmark/model/yolov3/ \
--model_filename __model__ \
--params_filename __params__ \
--save_file paddleDet_onnx/paddle_det.onnx \
--opset_version 11
##精度对比 精度验证方案说明
由于本次参赛选用的模型是yolov3检测模型,目前对于检测模型评估主要以mAP的大小来衡量模型的精度,故我们对于正确性的验证设计的方案为,比较同一个数据集的mAP,来验证优化后模型的正确性。选用的数据集为coco val2017数据集,其中包含5000张图片。
原始框架Paddle验证精度操作方法
# 首先需要下载PaddleDetection,并进入到paddle根目录
# 执行验证命令,整个过程会自动下载数据集,请保证磁盘空间足够大
python eval.py --config ./configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml
Paddle-trt证精度操作方法
# 下载本工程代码,并进入到工程根目录
# 进入benchmark目录
cd ./进入benchmark
# 验证fp32模型精度
python infer.py -p Paddle -t fp32
# 验证fp16模型精度
python infer.py -p Paddle -t fp16
# 验证int8模型精度
python infer.py -p Paddle -t int8
Quake证精度操作方法
# 下载本工程代码,并进入到工程根目录
# 进入benchmark目录
cd ./进入benchmark
# 验证fp32模型精度
python infer.py -p Quake -t fp32
# 验证fp16模型精度
python infer.py -p Quake -t fp16
# 验证int8模型精度
python infer.py -p Quake -t int8
精度数据对比表(表中的数据为mAP结果):
模型推理类型 | Paddle | Paddle-trt | Quake |
---|---|---|---|
Float32 | 0.425 | 0.409 | 0.406 |
Float16 | 无 | 0.409 | 0.406 |
Int8 | 无 | 0.35 | 0.396 |
##性能测试 性能测试方案说明
由于不同的图片推理耗时不同、硬件的状态每个时间点也不同,为了避免这些系统误差引起的性能耗时不准确,我们采用统计一个数据集的整体耗时,并且计算单张图片的平均耗时来衡量模型推理的性能,在进行正式测试前,需要预热100次,来降低系统误差,保证测试结果的有效性。会分别统计和对比FP32的、FP16和Int8的模型性能耗时。
说明:一致性测试方案采用自动编译 + 自动测试的,无需用户手动编译
###测试方法说明:
测试原始Paddle框架的性能,执行如下命令会测试完成后输出fps。
注意:默认的eval只支持batch = 8 ,如果需要测试其他batch,需要手动修改配置文件。
文件路径:configs/dcn/yolov3_enhance_reader.yml
修改内容:EvalReader字段下的batch_size
# 首先需要下载PaddleDetection,并进入到paddle根目录
# 执行验证命令,整个过程会自动下载数据集,请保证磁盘空间足够大
python eval.py --config ./configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml
测试Paddle-trt和Quake框架的推理性能使用benchmark目录下的infer.py脚本,命令参数表如下:
参数 | 描述 |
---|---|
-h, --help | show this help message and exit |
-p|--platform | Test platform type, support Paddle or QuakeRT, default is Paddle |
-m|--model_dir | Test model path, default is /usr/local/quake/datas/benchmark/model |
-b|--batch | Test batch size, default is 1 |
-t|--param_type | Inference data type, support fpr32 | fp16 | int8,default is fp32 |
-r|--run_benchmark | run benchmark test, default is False |
-w|--warm_up | Warm-up times, default is 100 |
-d|--debug | open debug, default is False |
例子: |
# 测试Paddle-trt的fp32模型 batch = 8的性能
python infer.py -p Paddle -t fp32 -r 1 -b 8
# 测试Quake的fp32模型 batch = 8的性能
python infer.py -p Quake -t fp32 -r 1 -b 8
###fp32模型 Paddle原始框架 VS Quake
平台 | batch | Latency, ms | Throughput (1000/latency*batchsize) | Latency Speedup(original latency / TRT latency |
---|---|---|---|---|
Paddle | 1 | 70.87 | 14.11 | |
2 | 87.3 | 22.91 | ||
4 | 169.56 | 23.59 | ||
8 | 325.73 | 24.56 | ||
16 | 610.92 | 26.19 | ||
32 | 1315.25 | 24.33 | ||
Quake | 1 | 30.13 | 33.19 | 2.35 |
2 | 57.48 | 34.79 | 1.52 | |
4 | 112.41 | 35.58 | 1.51 | |
8 | 232.78 | 34.36 | 1.39 | |
16 | 467.94 | 34.19 | 1.31 |
###fp32模型 Paddle-trt VS Quake
平台 | batch | Latency, ms | Throughput (1000/latency*batchsize) | Latency Speedup(original latency / TRT latency |
---|---|---|---|---|
Paddle-TRT | 1 | 30.93 | 32.33 | |
2 | 56.2 | 35.59 | ||
4 | 113.1 | 35.37 | ||
8 | 230.8 | 34.66 | ||
Quake | 1 | 30.13 | 33.19 | 1.03 |
2 | 57.48 | 34.79 | 0.98 | |
4 | 112.41 | 35.58 | 1.0 | |
8 | 232.78 | 34.36 | 0.99 | |
16 | 467.94 | 34.19 |
###fp16模型Paddle-trt VS Quake
平台 | batch | Latency, ms | Throughput (1000/latency*batchsize) | Latency Speedup(original latency / TRT latency |
---|---|---|---|---|
Paddle-TRT | 1 | 13.32 | 75.08 | |
2 | 24.27 | 82.41 | ||
4 | 46.67 | 85.71 | ||
8 | 91.34 | 87.58 | ||
16 | 191.77 | 84.43 | ||
Quake | 1 | 10.12 | 98.81 | 1.32 |
2 | 19.18 | 104.28 | 1.27 | |
4 | 38.08 | 105.04 | 1.22 | |
8 | 82.45 | 97.03 | 1.11 | |
16 | 177.53 | 90.13 | 1.08 |
###int8模型Paddle-trt VS Quake
平台 | batch | Latency, ms | Throughput (1000/latency*batchsize) | Latency Speedup(original latency / TRT latency |
---|---|---|---|---|
Paddle-TRT | 1 | 11.27 | 88.73 | |
2 | 21.11 | 94.74 | ||
4 | 41.24 | 97 | ||
8 | 78.62 | 101.76 | ||
16 | 164.85 | 97.06 | ||
Quake | 1 | 7.71 | 129.7 | 1.46 |
2 | 14.85 | 134.68 | 1.42 | |
4 | 30.82 | 129.79 | 1.33 | |
8 | 69.41 | 115.26 | 1.14 | |
16 | 143.91 | 111.18 | 1.15 |