在七日目标检测打卡营学习中,使用脚本任务来完成作业和最终的竞赛,发现用脚本进行paddledetection检测任务,8卡比4卡慢,4卡比单卡慢。
8卡时间:
2020-09-29 19:45:31,755-INFO: iter: 20, lr: 0.000001, 'loss_xy': '53.884647', 'loss_wh': '154.703766', 'loss_obj': '2067.793945', 'loss_cls': '73.016968', 'loss_iou': '216.732391', 'loss': '2564.534912', time: 11.189, eta: 7 days, 18:25:04
4卡时间:
2020-09-29 19:52:08,966-INFO: iter: 20, lr: 0.000001, 'loss_xy': '53.548737', 'loss_wh': '157.815033', 'loss_obj': '1821.241333', 'loss_cls': '59.865196', 'loss_iou': '216.034027', 'loss': '2309.085449', time: 5.241, eta: 3 days, 15:18:53
p40单卡:
2020-09-29 20:12:34,823-INFO: iter: 180, lr: 0.000009, 'loss_xy': '48.438225', 'loss_wh': '72.280334', 'loss_obj': '217.319061', 'loss_cls': '20.981464', 'loss_iou': '192.661255', 'loss': '553.188232', time: 1.525, eta: 1 day, 1:20:21
我用的是代码是:
os.system("export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7")
#os.system("export CUDA_VISIBLE_DEVICES=0,1,2,3")
os.system("python PaddleDetection/tools/train.py -c ppyolo_r18vd.yml --eval")
fock的深渊上的坑的项目: https://aistudio.baidu.com/aistudio/clusterprojectdetail/1029011
单卡p40
2020-09-29 23:39:11,123-INFO: iter: 0, lr: 0.000000, 'loss_xy': '7.632949', 'loss_wh': '23.741360', 'loss_obj': '4343.728516', 'loss_cls': '5.082441', 'loss_iou': '32.456314', 'loss': '4412.642090', time: 0.000, eta: 0:00:03
2020-09-29 23:46:29,111-INFO: iter: 200, lr: 0.000400, 'loss_xy': '4.181661', 'loss_wh': '5.177884', 'loss_obj': '29.661121', 'loss_cls': '0.865982', 'loss_iou': '18.038776', 'loss': '60.427185', time: 2.263, eta: 15:35:27
四卡v100
2020-09-30 06:58:53,327-INFO: iter: 0, lr: 0.000000, 'loss_xy': '6.372427', 'loss_wh': '22.479509', 'loss_obj': '2940.285889', 'loss_cls': '4.682764', 'loss_iou': '27.609133', 'loss': '3001.429932', time: 0.000, eta: 0:00:01
2020-09-30 07:22:58,471-INFO: iter: 200, lr: 0.000400, 'loss_xy': '5.082535', 'loss_wh': '4.864691', 'loss_obj': '31.545328', 'loss_cls': '1.251459', 'loss_iou': '21.056559', 'loss': '64.736984', time: 7.339, eta: 2 days, 2:33:14
深渊上的坑用的代码是:
# 单卡
# os.system("export CUDA_VISIBLE_DEVICES=0")
# 四卡
os.system("export CUDA_VISIBLE_DEVICES=0,1,2,3")
# 提供多种模型
os.system("cd PaddleDetection && python -u tools/train.py -c /root/paddlejob/workspace/code/ppyolo_r18vd.yml --eval")
os.system("cd PaddleDetection && python tools/eval.py -c /root/paddlejob/workspace/code/ppyolo_r18vd.yml")
os.system("cd PaddleDetection && python tools/export_model.py -c /root/paddlejob/workspace/code/ppyolo_r18vd.yml --output_dir ./inference_model")
os.system("mv PaddleDetection/inference_model /root/paddlejob/workspace/output")
大佬到底几个号/狗头
我的代码是从PaddleDetection的文档搬运的,也不明白为什么8卡训练时间反而翻倍……
我报issue了
https://github.com/PaddlePaddle/PaddleDetection/issues/1534
回复说:
多卡建议使用多进程方式启动,不然预处理可能会有瓶颈。示例:
python -m paddle.distributed.launch --selected_gpus 0,1,2,3,4,5,6,7 tools/train.py -c ....
但是我按照建议里测试,问题照旧。好一点的是8卡终于跟4卡速度差不多了
os.system("CUDA_VISIBLE_DEVICES=0,1,2,3 python -m paddle.distributed.launch --selected_gpus 0,1,2,3 PaddleDetection/tools/train.py -c ppyolo.yml --eval")
4卡:2020-09-30 15:43:18,375-INFO: iter: 20, lr: 0.000004, 'loss_xy': '93.442039', 'loss_wh': '232.597504', 'loss_obj': '2173.653076', 'loss_cls': '72.086082', 'loss_iou': '351.196777', 'loss_iou_aware': '848.500977', 'loss': '3812.800781', time: 1.838, eta: 6:07:02
8卡:
os.system("CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m paddle.distributed.launch --selected_gpus 0,1,2,3,4,5,6,7 PaddleDetection/tools/train.py -c ppyolo.yml --eval")
2020-09-30 15:53:59,934-INFO: iter: 40, lr: 0.000008, 'loss_xy': '92.068069', 'loss_wh': '205.553848', 'loss_obj': '635.618347', 'loss_cls': '61.704540', 'loss_iou': '344.908173', 'loss_iou_aware': '129.668533', 'loss': '1484.465576', time: 1.597, eta: 5:18:23
好像被误认为是在Notebook模式了……
明白了,我4卡和8卡用的同样的iters数值,其实8卡应该比4卡减半的。这样8卡确实比4卡快!
这样咱们大家的多卡脚本都是棒棒的啦!
还有batchsize是原来的8倍或者4倍,训练的时候每个卡分到的batchsize会平均掉
原来这么回事,8车道得8辆车负载分担才行。
batchsize 要按照卡来吗? 但是paddledetection里面的例子yaml文件,都是8卡的,他们的bs我都没有改就可以用的。
其实我习惯把bs打满训练的。
在PaddleSeg中如果设置多卡训练,会看到日志里面有这样一段输出
我在config里面设置的batchsize其实是16,所以batchsize是被平均分配下去的(如果单卡跑直接爆显存)
感觉PaddleSeg在多卡的支持上要比PaddleDetection清晰得多,这样设置就行了,然后配置文件里改改batchsize和学习率: