1自动压缩工具在YOLO系列模型上的模型压缩和速度提升
【测试环境与补充说明】
测试数据与指标:mAP的指标均在COCOval2017数据集中评测得到。
测试环境:TeslaT4的GPU环境下开启TensorRTbatch_size=1测试获取
测试模型输入像尺寸:640*640;
注:YOLOv6原论文精度Baseline是mAP41%,由于模型导出是固定shape,所以导成ONNX后有掉点,实测精度44%;YOLOv7在原论文BaselinemAP52%,导成ONNX后实测精度51%。
本文将从以下五个方面进一步技术解读,全文大约2300字,预计阅读时长3分钟。
模型自动压缩工具-动机和思考模型自动压缩工具-量化蒸馏训练技术解析模型自动压缩工具-量化蒸馏训练技术实战模型自动压缩工具-推理部署未来工作展望
传送门:
https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/pytorch_yolo_series
模型自动压缩工具
动机与思考
模型量化是提升模型推理速度的手段之实际使用中有如下几点困难:
模型参数分布不均匀,导致量化误差大
过度训练是导致参数****分布不均匀的原因之例如在YOLOv6s迭代过程中,为了让模型更好地收敛,通常需要延长模型训练周期。但随之也会带来一些隐患,比如模型在COCO数据集上出现了过拟合,某些层的数值分布极端化,这些状况增加了量化的噪声,我们分析了YOLOvs6每层Conv的量化精度,发现某些层精度下降的特别严重,由此导致了YOLOv6s模型离线量化后在验证集上的精度下降了10%,无法达到业务要求。
2YOLOv6s卷积层量化损失评估
我们对比分析了YOLOv6s的权重分布情况,发现量化损失较小的层数值分布相对平稳,数值处于-0.25到0.25之间,而量化损失较大的层数值分布非常极端,绝大部分值趋近于0,且数值处于-0.1到0.1之间,尽管看上去都是正太分布,但大量数值为0不利于量化统计scale值。
3权重数值分布对比
任务复杂度高,模型精度受量化误差的影响大
任务复杂度越高,模型量化带来的精度损失越大。目标检测融合了目标定位和目标分类两种任务,整体的复杂度相对较高,因此它的精度受量化的影响更大。普通的离线量化无法改变模型激活值的数值分布,只会让量化scale适应该分布。遇到数值分布不均匀的激活值,离线量化的量化误差会很大。
量化训练需修改训练代码,难度大,技术门槛高
相比离线量化,量化训练能减少离线量化的精度掉点程度。量化训练方法在训练过程中,可以不断地调整激活的数值分布,使激活的分布更适合量化。量化训练使用成本比较高,体现在以下两方面:一方面是人力成本高:为了实现量化训练,需要修改模型的组网和训练代码,插入模拟量化操作,另一方面时间成本高:训练时需要加载完整训练集做训练。
量化蒸馏训练技术解析
构造教师模型
加载推理模型文件,并将推理模型在内存中复制一份,作为知识蒸馏中的教师模型,待量化模型则作为学生模型。
添加loss
自动地分析模型结构,寻找适合添加蒸馏loss的层,一般是最后一个带可训练参数的层。比如,检测模型head有多个分支的话,会将每个head最后一个conv作为蒸馏节点。
蒸馏训练
教师模型通过蒸馏loss监督原模型的稀疏训练或量化训练,完成模型压缩的过程。
近期我们会将自动压缩代码提到YOLOvYOLOvYOLOvPP-YOLOE的官方repo中,这样大家在原模型项目中也可使用该能力。
量化蒸馏训练技术实战****
准备预测模型导出ONNX模型。
git clone https://github.com/WongKinYiu/yolov7.git
cd yolov7
python export.py --weights yolov7-tiny.pt --grid
准备训练数据&定义DataLoader
准备COCO或者VOC格式的数据。定义数据预处理模块,其中,数据预处理Reader的设置如下:
class COCOValDataset(paddle.io.Dataset):
def __init__(self,
dataset_dir=None,
image_dir=None,
anno_path=None,
img_size=[640, 640]):
self.dataset_dir = dataset_dir
self.image_dir = image_dir
self.img_size = img_size
self.ann_file = os.path.join(dataset_dir, anno_path)
self.coco = COCO(self.ann_file)
self.ids = list(sorted(self.coco.imgs.keys()))
def __getitem__(self, idx):
img_id = self.ids[idx]
img = self._get_img_data_from_img_id(img_id)
img, scale_factor = self.image_preprocess(img, self.img_size)
return {"image": img, "im_id": np.array([img_id]), "scale_factor": scale_factor}
def __len__(self):
return len(self.ids)
定义评估接口
为了在压缩过程中实时评估量化模型的精度,需要定义一个eval_function来做模型推理效果评估。这一步是可选的,如果没有eval_function也不会影响量化训练的过程。
def eval_function(exe, compiled_test_program, test_feed_names, test_fetch_list):
bboxes_list, bbox_nums_list, image_id_list = [], [], []
for data in val_loader:
data_all = {k: np.array(v) for k, v in data.items()}
outs = exe.run(compiled_test_program,
feed={test_feed_names[0]: data_all["image"]},
fetch_list=test_fetch_list,
return_numpy=False)
postprocess = YOLOv7PostProcess(
score_threshold=0.001, nms_threshold=0.65, multi_label=True)
res = postprocess(np.array(outs[0]), data_all["scale_factor"])
bboxes_list.append(res["bbox"])
bbox_nums_list.append(res["bbox_num"])
image_id_list.append(np.array(data_all["im_id"]))
map_res = coco_metric(anno_file, bboxes_list, bbox_nums_list, image_id_list)
return map_res[0]
定义配置文件
Distillation: # 蒸馏参数设置
alpha: 1.0 # 蒸馏loss所占权重
loss: soft_label
Quantization: # 量化参数设置
use_pact: true # 是否使用PACT量化算法
activation_quantize_type: "moving_average_abs_max" # 激活量化方式,选择"moving_average_abs_max"即可
quantize_op_types: # 需要量化的OP类型,可以是conv2d、depthwise_conv2d、mul、matmul_v2等
- conv2d
- depthwise_conv2d
TrainConfig: # 训练的配置
train_iter: 3000 # 训练的轮数
eval_iter: 1000 # 训练中每次评估精度的间隔轮数
learning_rate: 0.00001 # 训练学习率
optimizer_builder: # 优化器设置
optimizer:
type: SGD
weight_decay: 4.0e-05
开始运行
少量代码就可以开始ACT量化训练。启动ACT时,需要传入模型文件的路径、模型文件名、参数文件名称、压缩后模型存储路径、压缩配置文件、dataloader和评估精度的eval_callback。
from paddleslim.auto_compression import AutoCompression
ac = AutoCompression(
model_dir=global_config["model_dir"],
model_filename=global_config["model_filename"],
params_filename=global_config["params_filename"],
save_dir=FLAGS.save_dir,
config=all_config,
train_dataloader=train_loader,
eval_callback=eval_function)
ac.compress()
以上是精简后的关键代码,如果想快速体验,可以根据下方链接中的示例文档及代码进行体验:
https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/pytorch_yolo_series
推理部署
完成量化训练后的模型,支持PaddleInferenceTensorRT部署。
在YOLO系列模型上测试,PaddleTensorRT的性能与直接使用TensorRT基本持平,如下所示,相关推理部署代码已经集成到了自动压缩工具开源项目,可以直接下载体验。
4YOLO系列模型在PaddleTensorRT和TensorRT上的速度对比
# FP32
./build/trt_run --model_file yolov7_infer/model.pdmodel --params_file yolov7_infer/model.pdiparams --run_mode=trt_fp32
# FP16
./build/trt_run --model_file yolov7_infer/model.pdmodel --params_file yolov7_infer/model.pdiparams --run_mode=trt_fp16
# INT8
./build/trt_run --model_file yolov7_quant/model.pdmodel --params_file yolov7_quant/model.pdiparams --run_mode=trt_int8
这么好的项目,欢迎大家点star鼓励并前来体验!
https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/pytorch_yolo_series
未来工作展望
ACT自动化压缩工具将支持更多AI模型的压缩;支持YOLO系列模型剪枝、非结构化稀疏等压缩方法;升级ACT能力,加入更多前沿压缩算法;支持完善更多部署方法,包括ONNXRuntime、OpenVINO等,进一步助力AI模型工程落地。
直播预告
**直播时间:**20202219:00-20:00。
项目地址
拓展阅读
汇集YOLO系列经典和前沿算法,实现高精度实时检测!
获取更多技术内容~
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点