Closed AndSonder closed 10 months ago
环境配置:
# export LD_LIBRARY_PATH=/usr/lib64/
git clone -b develop https://github.com/PaddlePaddle/PaddleDetection --depth=1
python -m pip install paddlepaddle-gpu==2.5.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
cd PaddleDetection
pip install -r requirements.txt --user -i https://pypi.tuna.tsinghua.edu.cn/simple
python setup.py install --user
python ppdet/modeling/tests/test_architectures.py
# 提前下载一个小型的coco数据集用于测试
wget -nc -P ./dataset/coco/ https://bj.bcebos.com/v1/paddledet/data/cocomini.zip --no-check-certificate
cd ./dataset/coco/ && unzip cocomini.zip
mv -u cocomini/* ./
# 回到PaddleDetection目录
cd ../../
wget https://paddle-qa.bj.bcebos.com/benchmark/tools.tar.gz && tar xvf tools.tar.gz && export BENCHMARK_ROOT=$PWD/tools/
# test_tipc 在 PaddleDetection目录下
bash test_tipc/prepare.sh test_tipc/configs/mask_rcnn/mask_rcnn_r50_1x_coco_train_infer_python.txt benchmark_train;
bash test_tipc/benchmark_train.sh test_tipc/configs/mask_rcnn/mask_rcnn_r50_1x_coco_train_infer_python.txt benchmark_train dynamic_bs2_fp32_DP_N1C1;
dynamic_bs2_fp32_DP_N1C1,表示的是bs=2,fp32训练,N1C1单机单卡。如果要换bs,就相应改为dynamic_bs4_fp32_DP_N1C1;换amp训练就改为dynamic_bs2_fp16_DP_N1C1
如何使用 Profiler 生成 log:
首先按照环境配置文档配置环境,接着将赛题群中的 trainer.py
替换本地的 trainer.py
。
python tools/train.py -c configs/mask_rcnn/mask_rcnn_r50_1x_coco.yml -o LearningRate.base_lr=0.0001 log_iter=1 use_gpu=True save_dir=./test_tipc/output/mask_rcnn_r50_1x_coco/benchmark_train/norm_train_gpus_0_autocast_fp32 epoch=1 pretrain_weights=https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_1x_coco.pdparams TrainReader.batch_size=2 filename=mask_rcnn_r50_1x_coco TrainReader.shuffle=False --enable_ce=True > profier.txt
Profiler 生成的 log 会保存在 profier.txt
当中。也可以直接下载赛题群中的 profier3.txt
查看
[1] profiler使用文档.
@AndSonder 环境配置文档的链接打不开
@AndSonder 环境配置文档的链接打不开
可以打开,但是需要搭配梯子,我直接给写在Issue里面吧
@AndSonder 能提供一下赛题群中的 trainer.py
吗
flytocc
加你v了,麻烦同意下~
@zeroRains 领取加速 polygons_to_mask 任务
方案1小节:将 PolygonToMask 迁移到 Dataloader
方案调研:
参考MMDetection的Mask RCNN 设计,其内部在处理PolygonToMask
的部分主要是在mask head
的ROI Align
操作中。其提了两个方案,方案一是利用Polygon
类型的标签(coco数据集实例部分的segmentation
部分)进行一个缩放,然后利用pycocotools.mask
工具进行转化,转化成指定宽高的BitmapMask
,方案二是利用pycocotools.mask
工具先将Polygon
标签转化成和原图一样大小的BitmapMask
,然后利用mmcv
里的roi_align
API进行对齐。
优化方案:
在Paddle中,按照组长的指令运行baseline时,MMDetection的方案一与其执行顺序比较相似,这导致了在mask_head
的mask_assigner
的每个batch
计算中,会调用pycocotools.mask
的API将polygon
标签成Bitmap
的Mask,这个函数是在CPU中执行的,会产生比较久的CPU执行时间。 这个方案的目的是将polygon
转化成Bitmap
的操作向前移动到DataLoader中(和MMDetection的方案二比较相似),然后利用paddle的paddle.vision.ops.roi_align
进行对齐。
参数和环境:
执行指令:python tools/train.py -c configs/mask_rcnn/mask_rcnn_r50_1x_coco.yml -o LearningRate.base_lr=0.0001 log_iter=1 use_gpu=True save_dir=./test_tipc/output/mask_rcnn_r50_1x_coco/benchmark_train/norm_train_gpus_0_autocast_fp32 epoch=1 pretrain_weights=https://paddledet.bj.bcebos.com/models/mask_rcnn_r50_1x_coco.pdparams TrainReader.batch_size=2 filename=mask_rcnn_r50_1x_coco TrainReader.shuffle=False --enable_ce=True > profier.txt
配置:Tesla V100 (32GB)
profier分析方式:在执行到第50个iter
后启动profier
分析第50~第60个iter
的性能
方案执行结果:
Profiler 中设置timer_only=True :
baselineReader Ratio: 0.087% Time Unit: s, IPS Unit: steps/s |
avg | max | min | |
---|---|---|---|---|
reader_cost | 0.00072 | 0.00111 | 0.00030 | |
batch_cost | 0.83135 | 0.76716 | 0.74502 | |
ips | 1.20287 | 1.34225 | 1.30351 |
前移 polygons_to_mask 到dataloader 中
Reader Ratio: 0.107%
Time Unit: s, IPS Unit: steps/s |
avg | max | min | |
---|---|---|---|---|
reader_cost | 0.00088 | 0.00178 | 0.00033 | |
batch_cost | 0.82278 | 0.75882 | 0.73806 | |
ips | 1.21540 | 1.35491 | 1.31783 |
baseline的mask_assigner
执行情况:
前移 polygons_to_mask
到dataloader
中的mask_assigner
执行情况:
方案总结和其他问题描述:
该方案在模型整体训练速度上有微弱提升(ips: 1.20287 ->1.21540 ),在mask_head
的mask_assigner
中执行时间缩短得比较明显。
其他问题:修改方案与原本的执行方案,在mask_assigner
的输出tgt_masks
的数值尚存在较大差异。
更新任务:优化 RPNTargetAssign
@AndSonder 领取加速 RPNTargetAssign 任务
@luotao1 麻烦问下 PaddleDetection 的 PR 应该找谁 review 呢
赛题进展
1. 背景
飞桨深度学习框架已经发布了很多涵盖多个领域的开源模型,本赛题旨在通过对飞桨深度学习框架支持的开源模型进行优化,提高模型的训练性能,探索飞桨在模型上的性能优化最佳实践。欢迎对深度学习框架和模型优化感兴趣的开发者,展示在模型优化领域的经验和创新性。
本赛题详细介绍见中国软件开源创新大赛:飞桨框架任务挑战赛-赛题9,主要需求为:
2. 参考资料
这里我们将任务相关的参考资料列出,也会持续补充......
2.1 官方参考资料
2.2 模型分析报告
2.2.1 MaskRCNN 各部分性能
下表为使用 Profier 记录的 MaskRCNN 三大部分(bbox head, rpn head, mask head)CPU与GPU的使用情况
根据表格可得出如下可能的优化点:
BBoxHead
中self.bbox_assigner
CPU 操作占用时间较多,且该操作中GPU利用率不高;RPNHead
的self.gen_proposal
CPU 和 GPU 操作均占用较多时间,且根据Timeline可得该操作中有较多的GPU空闲时间;结合 Profier 进一步定位可得,
self.gen_proposal
中rpn_target_assign
有着较多的CPU耗时。相关代码如下:通过优化 RPNTargetAssign 的代码,使得更多的操作在GPU上进行,可优化模型的推理速度,预计优化幅度 10ms+。
MaskHead
中self.mask_assigner
中 CPU 操作占据了大部分时间;经过进一步的分析,在
self.mask_assigner
中使用了 cocoapi 中的polygons_to_mask
。该操作只能在 CPU 上进行计算。 现在有两种优化方案:第一种是将PolygonToMask
部分的计算放在dataloader里面并行计算加速。第二种是参考 OneFlow 的写法,自定义一个PolygonToMask
Kernel 对该部分运算进行加速。 预估优化时间 15ms +。参考资料:
2.2.2 耗时较长的Op
根据 Profier 分析可得,下列 Operator 耗时较多,可考虑进行优化
3. 运行说明
3.1 使用飞桨profier进行性能分析
首先按照环境配置文档配置环境,接着将赛题群中的
trainer.py
替换本地的trainer.py
。Profiler 生成的 log 会保存在
profier.txt
当中。也可以直接下载赛题群中的profier3.txt
查看3.2 使用nsight进行性能分析
使用
nsys
生成 nsys-rep 文件导入到nsight
中进行分析:4. 优化进展