jetson nano中使用经过裁剪优化的faster rcnn模型

1,083 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天


自去年7月参加工作,已将近一年。日常工作遇到了不少坑,但可能是由于程序流程的复杂,亦或是当初急于解决问题的心态,一些坑总是踩了又踩,也因此耗费了许多不必要的时间和精力。 便希望用博客的方式记录下工作中的小弯路。引用github上第一个建立大学开源课程仓库的创建者的一句让人感触颇深的话:我只希望只要是前人走过的弯路,后人就不必再走。

本文前提是已经具有训练paddle框架下faster rcnn的docker环境和jetson nano部署环境:

1.安装paddleDetection的docker:

docker pull paddlecloud/paddledetection:2.4-gpu-cuda11.2-cudnn8-365aeb
  1. jetson nano: image.png

jetson nano内存不足

jetson nano是英伟达推出的用于嵌入式应用、AI IoT的边缘计算设备,其系统安装包JetPack SDK已经装有cuda,cudnn,tensorRT英伟达深度学习组合拳,也自带opencv。是个开箱即用的深度学习推理设备,相当于加了AI功能的树莓派。其配置也非常精简。

image.png 只有4G的内存。在使用Paddle框架训练faster rcnn模型后,部署在jetson nano上时,调用gpu作前向推理,显示进程被杀死 lQLPJxZnB_IKCc5nzQUqsFN9doUMgprEAqnfUl_AwAA_1322_103.png 查看进程被杀死原因

dmesg | egrep -i -B100 'killed process'

image.png out of memory,Linux经典的OOM killer机制。 监控设备占用情况

jtop

lQLPJxZnB_IKCkfNBynNBLuwvkK1ASH0iPkCqd9SXwDVAA_1211_1833.png 果然在运行时内存占用居高不下,jetson nano作为边缘计算设备,其算力只有0.5TFlop,不适合推理参数体量较大的模型,接下来需要对faster rcnn模型进行压缩。

Paddle模型压缩

PaddleSlim是paddle专门用于模型压缩的工具包,包括裁剪(prune),量化(quant),离线量化(post_quant),蒸馏(distill)和联合策略。

  • 安装PaddleSlim 注意PaddleDetection,PaddlePaddle,PaddleSlim的版本关系

image.png 在开头的docker环境中,已经装有PaddleDet 2.4.0,PaddlePaddle-gpu 2.3.0.post112版本,直接安装paddleslim

pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 结合压缩策略一起训练 paddle必须在训练时指定压缩策略,才能正确导出经过压缩的部署格式的模型
python tools/train.py -c configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml --slim_config configs/slim/prune/faster_rcnn_r50_fpn_prune_fpgm.yml
  • 导出部署模型
python tools/export_model.py -c configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml --slim_config configs/slim/prune/faster_rcnn_r50_fpn_prune_fpgm.yml -o weights=output/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco.pdparams

导出的模型默认在output_inference文件夹下。该模型可以部署在jetson nano上进行推理。