Skip to content

Archermmt/yolov3_dcn_nv_hackthon2021

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#yolov3_dcn_nv_hackthon2021

##简介 本开源内容为 英伟达-阿里云异构计算TensorRT 加速AI推理Hackathon 2021 比赛项目,利用TensorRT对模型的推理过程进行加速

##使用模型 选取yolov3模型作为原始模型,模型的结构可以直接从PaddleDetection上获取,非常方便。

PaddleDetection源码:https://github.com/PaddlePaddle/PaddleDetection

模型配置文件:https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.0-rc/configs/dcn/yolov3_r50vd_dcn_db_obj365_pretrained_coco.yml

##名词解释

名称 解释
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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages