# QAT量化
## Yolov5 QAT 量化
yolov5s 精度性能表现:
| | method | [email protected]:0.95 | fps(bs=1,orin nano) |
| :---------------: | :---------------------------------: | :----------: | :-----------------: |
| pytorch fp16 | - | 0.3745 | - |
| pytorch int8 | Histogram(MSE) | 0.3711 | - |
| tensorrt fp16 | - | - | 111 |
| tensorrt ptq int8 | TensorRT built in EntropyCalibrator | - | 167 |
| tensorrt qat int8 | Histogram(MSE) | 0.3718 | 115 |
1 Git clone [yolov5](https://github.com/ultralytics/yolov5) and install Dependencies
```bash
git clone https://github.com/ultralytics/yolov5
cd yolov5
git checkout v7.0
```
2 Copy scripts to yolov5 directory
```bash
cd Linfer/quant-tools
cp -r quantization scripts /path/to/yolov5
```
3 Install dependencies
```bash
pip install pytorch-quantization --extra-index-url https://pypi.ngc.nvidia.com
```
4 Start QAT training
```bash
# 注意修改脚本中的coco数据集路径
python scripts/qat-yolov5.py quantize yolov5s.pt --ptq=ptq.pt --qat=qat.pt --eval-ptq --eval-origin
```
5 Export Onnx
```bash
python scripts/qat-yolov5.py export qat.pt --size=640 --save=qat.onnx --dynamic
```
## Yolov7 QAT 量化
yolov7 精度性能表现:
| | method | [email protected]:0.95 | fps(bs=1,orin nano) |
| :---------------: | :---------------------------------: | :----------: | :-----------------: |
| pytorch fp16 | - | 0.5119 | - |
| pytorch int8 | Histogram(MSE) | 0.5098 | - |
| tensorrt fp16 | - | - | 39 |
| tensorrt ptq int8 | TensorRT built in EntropyCalibrator | - | 60 |
| tensorrt qat int8 | Histogram(MSE) | 0.5110 | 59 |
1 Git clone [yolov7](https://github.com/WongKinYiu/yolov7) and install Dependencies
```bash
git clone https://github.com/WongKinYiu/yolov7
cd yolov7
```
2 Copy scripts to yolov7 directory
```bash
cd Linfer/quant-tools
cp -r quantization scripts /path/to/yolov5
```
3 Install dependencies
```bash
pip install pytorch-quantization --extra-index-url https://pypi.ngc.nvidia.com
```
4 Start QAT training
```bash
# 注意修改脚本中的coco数据集路径
python scripts/qat-yolov7.py quantize yolov7.pt --ptq=ptq.pt --qat=qat.pt --eval-ptq --eval-origin
```
5 Export Onnx
```bash
python scripts/qat-yolov7.py export qat.pt --size=640 --save=qat.onnx --dynamic
```
## 优化思路
因为思路都相近,这里仅以yolov7为例,展示图优化前后的差距以及思路。
### 1 前置知识
TensorRT 中有两种量化网络的工作流程,一种是训练后量化(PTQ,ref: [tensorrt-developer-guide/intro-quantization](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#intro-quantization)),另一个是量化感知训练(QAT,ref: [tensorrt-developer-guide/work-with-qat-networks](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#work-with-qat-networks))。
- 在PTQ模式下,TensorRT将具有最好的性能,因为它总是选择最好的层融合策略和最快的内核来得到全局最优的网络图。TensorRT 将尽可能多地合并层以在 GPU 上获得最佳性能
- 在QAT模式下,网络图是由用户设计的,这取决于QDQ的放置,网络中的精度转换和层融合策略严格根据QDQ的放置进行选择,会阻碍TensorRT对层的融合。(关于TensorRT的QDQ处理,参考:[TensorRT-developer-guide:Processing of Q/DQ Networks](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#tensorrt-process-qdq))。
也就是说,如果我们想要获得QAT的最佳性能,Q&DQ节点必须确保:
1. 所有计算密集型层都使用 INT8 运行;
2. QDQ不能打破QAT模型的层融合;
3. 不要在 INT8 和 FP16 之间进行不必要的数据转换。
获得 QAT 最佳性能的一种有效方法是将 QAT 模型的图与 PTQ 的图进行比较,在正确的位置插入 QDQ,以适应 TensorRT 的融合规则,避免引入无用的精度转换。
> 官方文档中:
>
> - the last convolution will output FP32 precision, even if INT8 is allowed and faster。建议最后一层的conv精度为fp32
> - 因此这就是为什么默认的--ignore-policy为model\.105\.m\.(.*)。 yolov7最后的一个conv为model105.
> - 敏感层分析后,也可以将影响较大的层 添加到 ignore中。
>
> 在QAT中,为了去除reformat节点时,比较关注:concat maxpool add几个节点。
>
> - 如果一个节点的输出,输入到不同的分支节点中,并且分支节点的量化 scale 不同,则 quantize_scale_node 节点无法融合,进而导致了额外的开销。如何解决这个问题?
>
> - 我们使用一个简单的方法,就是强制使所有分支节点的量化 scale 相同(根据经验,在同一数量级上的 scale 可以安全合并),即直接修改 QAT 网络中的 Quantizer 节点的参数。这就是apply_custom_rules_to_quantizer 函数的功能。
>
> - reformat节点比较耗时。
>
> 对于层融合的规则,可以参考:[TensorRT-developer-guide: Types of Fusions](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#fusion-types) 。
### 2 开始实践
#### 1 TensorRT benchmark
**fp16:**
```bash
python export.py --weights ./yolov7.pt --grid --simplify --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640
trtexec --onnx=yolov7.onnx --fp16 --separateProfileRun --saveEngine=fp16.engine --workspace=1024000 --warmUp=500 --duration=10 --useCudaGraph --useSpinWait --noDataTransfers --exportLayerInfo=fp16_layer.json --profilingVerbosity=detailed --exportProfile=fp16_profile.json
trtexec --loadEngine=fp16.engine --batch=1 --warmUp=500 --duration=10
```
**tensorrt ptq int8:**
```bash
python export.py --weights ./yolov7.pt --grid --simplify --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640
trtexec --onnx=yolov7.onnx --fp16 --int8 --separateProfileRun --saveEngine=ptq.engine --workspace=1024000 --warmUp=500 --duration=10 --useCudaGraph --useSpinWait --noDataTransfers --exportLayerInfo=ptq-layer.json --profilingVerbosity=detailed --exportProfile=ptq-profile.json
trtexec --loadEngine=ptq.engine --batch=1 --warmUp=500 --duration=10
```
**tensorrt no-rule qat int8:**
```bash
# 注释掉 quantize.apply_custom_rules_to_quantizer(model, export_onnx)
python scripts/qat.py quantize yolov7.pt --ptq=./no-rule-qat.pt --eval-ptq --eval-origin
python scripts/qat.py export no-rule-qat.pt --size=640 --save=no-rule-qat.onnx --dynamic
trtexec --onnx=no-rule-qat.onnx --fp16 --int8 --separateProfileRun --saveEngine=qat.engine --workspace=1024000 --warmUp=500 --duration=10 --useCudaGraph --useSpinWait --noDataTransfers --exportLayerInfo=no-rule-qat-layer.json --profilingVerbosity=detailed --exportProfile=no-rule-qat-profile.json
trtexec --loadEngine=no-rule-qat.engine --batch=1 --warmUp=500 --duration=10
```
**tensorrt rule qat int8:**
```bash
# 打开注释
python scripts/qat.py quantize yolov7.pt --ptq=./no-rule-qat.pt --eval-ptq --eval-origin
python scripts/qat.py export no-rule-qat.pt --size=640 --save=no-rule-qat.onnx --dynamic
trtexec --onnx=no-rule-qat.onnx --fp16 --int8 --separateProfileRun --saveEngine=qat.engine --workspace=1024000 --warmUp=500 --duration=10 --useCudaGraph --useSpinWait --noDataTransfers --exportLayerInfo=no-rule-qat_layer.json --profilingVerbosity=detailed --exportProfile=no-rule-qat_profile.json
trtexec --loadEngine=no-rule-qat.engine --batch=1 --warmUp=500
没有合适的资源?快使用搜索试试~ 我知道了~
基于TensorRT的C++高性能推理库,YOLOPv2,Yolov5/7/X/8,RT-DETR,单目标跟踪OSTrack、L
共673个文件
jpg:609个
cpp:21个
hpp:11个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 155 浏览量
2024-01-31
17:59:27
上传
评论 1
收藏 14.11MB ZIP 举报
温馨提示
使用说明在zip压缩包 README 文件中,请仔细阅读。 Highlights 支持全景驾驶感知 YOLOPv2,目标检测 RT-DETR,Yolo 5/X/7/8 ,多目标跟踪 Bytetrack,单目标跟踪 OSTrack、LightTrack; 预处理和后处理实现CUDA核函数,在 jetson 边缘端也能高性能推理; 封装Tensor、Infer,实现内存复用、CPU/GPU 内存自动拷贝、引擎上下文管理、输入输出绑定等; 推理过程实现生产者消费者模型,实现预处理和推理的并行化,进一步提升性能; 采用 RAII 思想+接口模式封装应用,使用安全、便捷。 Easy Using 本项目代码结构如下:apps 文件夹中存放着各个算法的实现代码,其中 app_xxx.cpp 是对应 xxx 算法的调用demo函数,每个算法彼此之间没有依赖,假如只需要使用yolopv2,可以将此文件夹下的其他算法全部删除,没有影响;trt_common 文件夹中包括了常用的cuda_tools,对TensorRT进行Tensor、Infer的封装,生产者消费者模型的封装;quant-tools 文件夹
资源推荐
资源详情
资源评论
收起资源包目录
基于TensorRT的C++高性能推理库,YOLOPv2,Yolov5/7/X/8,RT-DETR,单目标跟踪OSTrack、L (673个子文件)
bag.avi 997KB
ilogger.cpp 17KB
trt_infer.cpp 16KB
yolo.cpp 15KB
trt_tensor.cpp 14KB
yolop.cpp 14KB
rtdetr.cpp 12KB
LightTrack.cpp 12KB
utils.cpp 9KB
app_ptq.cpp 9KB
OSTrack.cpp 7KB
lapjv.cpp 7KB
kalmanFilter.cpp 7KB
BYTETracker.cpp 7KB
app_yolo.cpp 7KB
app_rtdetr.cpp 6KB
STrack.cpp 4KB
app_sot.cpp 4KB
app_mot.cpp 4KB
main.cpp 3KB
cuda_tools.cpp 2KB
app_yolop.cpp 2KB
yolop_decode.cu 9KB
yolo_decode.cu 7KB
preprocess_kernel.cu 4KB
rtdetr_decode.cu 3KB
preprocess_kernel.cuh 1KB
.gitignore 225B
kalmanFilter.h 2KB
BYTETracker.h 2KB
lapjv.h 1KB
dataType.h 1KB
STrack.h 1KB
trt_tensor.hpp 8KB
infer_controller.hpp 4KB
tensor_allocator.hpp 3KB
ilogger.hpp 2KB
trt_infer.hpp 2KB
cuda_tools.hpp 2KB
yolo.hpp 1KB
yolop.hpp 1KB
rtdetr.hpp 1KB
LightTrack.hpp 481B
OSTrack.hpp 446B
bus.jpg 476KB
yq.jpg 256KB
zand.jpg 165KB
group.jpg 162KB
zgjr.jpg 107KB
6.jpg 84KB
3.jpg 82KB
4.jpg 77KB
1.jpg 66KB
girl.jpg 60KB
5.jpg 43KB
2.jpg 36KB
0231.jpg 23KB
0228.jpg 23KB
0224.jpg 23KB
0229.jpg 23KB
0227.jpg 23KB
0237.jpg 23KB
0222.jpg 23KB
0226.jpg 23KB
0219.jpg 23KB
0232.jpg 23KB
0233.jpg 23KB
0225.jpg 23KB
0270.jpg 22KB
0236.jpg 22KB
0220.jpg 22KB
0218.jpg 22KB
0205.jpg 22KB
0234.jpg 22KB
0221.jpg 22KB
0230.jpg 22KB
0242.jpg 22KB
0269.jpg 22KB
0191.jpg 22KB
0223.jpg 22KB
0206.jpg 22KB
0235.jpg 22KB
0255.jpg 22KB
0256.jpg 22KB
0202.jpg 22KB
0190.jpg 22KB
0173.jpg 22KB
0271.jpg 22KB
0204.jpg 22KB
0294.jpg 22KB
0268.jpg 22KB
0257.jpg 22KB
0200.jpg 22KB
0203.jpg 22KB
0254.jpg 22KB
0217.jpg 22KB
0265.jpg 22KB
0186.jpg 22KB
0170.jpg 22KB
0238.jpg 22KB
共 673 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7
资源评论
- 2301_810374822024-05-18总算找到了自己想要的资源,对自己的启发很大,感谢分享~
hakesashou
- 粉丝: 4193
- 资源: 1083
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功