# VGG16-QAT

本项目旨在对VGG16模型执行量化感知训练，将其转换为onnx模型，并在TensorRT上运行。

## 论文

**Very Deep Convolutional Networks for Large-Scale Image Recognition**

* https://arxiv.org/abs/1409.1556

## 模型结构

VGG网络由小的卷积滤波器组成，VGG16有三个全连接层和13个卷积层，此外，可在模型中添加`BatchNorm`以及`Dropout`层。

![Alt text](readme_imgs/image-1.png)

## 算法原理

VGG使用多个较小的卷积滤波器，这减少了网络在训练过程中过度拟合的倾向。3×3的滤波器是最佳大小，因为较小的大小无法捕捉左右和上下的信息。

![alt text](readme_imgs/image-2.png)

## 环境配置

### Anaconda (方法一)

1、本项目目前仅支持在N卡环境运行

    python 3.9.18
    torch 2.0.1
    cuda 11
    
    pip install -r requirements.txt
    
    pip install --no-cache-dir --extra-index-url https://pypi.nvidia.com pytorch-quantization

2、TensorRT

    wget https://github.com/NVIDIA/TensorRT/archive/refs/tags/8.5.3.zip 
    
    unzip [下载的压缩包] -d [解压路径]
    
    pip install 解压路径/python/tensorrt-8.5.3.1-cp39-none-linux_x86_64.whl
    
    ln -s 解压路径(绝对路径)/bin/trtexec /usr/local/bin/trtexec

注意：若需要`cu12`则将`requirements.txt`中的相关注释关闭，并安装。

## 数据集

本项目使用CIFAR-10数据集，可直接运行`main.py`后自动下载并处理。

## 训练

    # --epochs表示训练或校准回合数
    # --resume表示继续训练
    # --qat表示校准（在训练基础模型时不能使用此参数）
    CUDA_VISIBLE_DEVICES=0,1 torchrun --nnodes=1 --nproc_per_node=2 --rdzv_id=100 --rdzv_backend=c10d --rdzv_endpoint=localhost:29400 main.py --epochs=N --resume --qat --batch_size=N --lr=X --num_classes=10

## 推理

    # N卡推理
    trtexec --onnx=/path/to/onnx --saveEngine=./checkpoints/qat/last.trt --int8
    python eval.py --device=0
    
    # DCU卡推理
    python evaluate_migraphx.py --device=0

## result

![alt text](readme_imgs/image-3.png)

### 精度

||原始模型(A800)|QAT模型(A800)|ONNX模型(A800)|TensorRT模型(A800)|MIGraphX模型|
|:---|:---|:---|:---|:---|----|
|Acc|0.9189|0.9185|0.9181|0.9184|0.919|
|推理时间|2.2469s|10.7953s|1.3253s|0.2368s|6.7672s|

## 应用场景

### 算法类别

`图像分类`

### 热点应用行业

`制造,交通,网安`

## 源码仓库及问题反馈

* https://developer.hpccube.com/codes/modelzoo/vgg16-qat_pytorch

## 参考资料

* https://docs.nvidia.com/deeplearning/tensorrt/pytorch-quantization-toolkit/docs/index.html

