系列文章目录
项目信息、本地GPU单卡复现:
华为Ascend众智计划项目–3DMPPE_ROOTNET–Pytorch模型迁移至NPU(一)
模型迁移——本地代码添加:
华为Ascend众智计划项目–3DMPPE_ROOTNET–Pytorch模型迁移至NPU(二)
模型迁移——服务器GPU-2P调试和NPU单卡调试:
华为Ascend众智计划项目–3DMPPE_ROOTNET–Pytorch模型迁移至NPU(三)
模型迁移——NPU单P性能和精度调优:
华为Ascend众智计划项目–3DMPPE_ROOTNET–Pytorch模型迁移至NPU(四)
模型迁移——NPU-8P调试:
华为Ascend众智计划项目–3DMPPE_ROOTNET–Pytorch模型迁移至NPU(五)
文章目录
前言
本系列文章记录笔者在完成华为昇腾众智项目的主要过程、遇到的问题及解决方案等。Ascend 众智计划是华为围绕 Ascend 基础软件平台推出的一项生态合作计划,旨在汇聚高校、科研院所、企业等组织和机构的开发团队,通过项目合作方式,基于 Ascend 基础软硬件平台开发算子、网络模型及行业参考设计,不断丰富 Ascend 计算产业生态,为加速千行百业智能化升级贡献智慧与力量。笔者负责的是姿态识别模型3DMPPE_ROOTNET的训练任务,该模型是基于Pytorch框架实现的。
一、NPU-8P调试
- 参考官方文档的2.1.3 NPU功能打通部分。详细的NPU多卡所需要修改的地方请点击这里。另外文档中也给出了一个可供参考的模型ShuffleNetV2。进行修改时请务必仔细阅读文档, 但不一定完全按照文档进行修改。另外还可以参考modelzoo中已完成的模型。
- NPU单P跑起来后多P一般不会出现太多问题。在修复了一些代码bug后程序即可正常在8P上运行。令人意外的是8P的精度竟然超过了论文精度不少,论文精度为0.31,而8P的精度平均可以达到0.37,最高精度达到了0.405。在性能方面,8P没有出现太大问题,较NPU单P提升了5~6 倍。
- 另外请注意对代码载入预训练模型的功能进行测试,包括NPU-1P载入1P和8P保存的.pth文件、NPU-8P载入1P和8P保存的.pth文件,载入部分有可能会出现问题。这里给出一些例子。
①如果出现RuntimeError: Error(s) in loading state_dict
,同时提示大量的missing keys,上下对比发现载入的keys比所需的kyes,多了module
关键字。可以参考这篇博客,移除多出的关键字。 pytorch-load模型报错 同理,如果提示缺少module,也可以用相同的方法在前面添加“module.”,请注意在添加相关代码后对评估的功能进行测试,以免可能产生的其它问题。
②一般不推荐在model.load_state_dict()
中添加False
,网上有很多载入模型问题的解决办法都是这个,但这样忽略载入时的错误,会导致后面评估和训练更多的异常。
③如果不是missing keys问题,也可以在按照如下的代码载入预训练模型pretrain = torch.load(opt.pretrain_path, map_location=torch.device('cpu'))
,即在括号中添加map_location=torch.device('cpu')
。
- 关于DDP的一些参数设置可以参考 PyTorch分布式DPP的基本概念。另外笔者在DDP的启动方面使用了
mp.spawn
,具体可以参考官方文档,和这篇博客最后的部分 DDP及其在pytorch中应用。
- 在8P的性能优化方面,笔者还对
dataloader
中的num_workers
进行了调整,num_workers
的大小同样会对性能产生影响。具体可以参考 pytorch DataLoader的num_workers参数与设置大小详解。简单来说,就是在设备允许的情况下缓慢增加num_workers,直到训练速度不再提高,就停止增加num_workers的值。
- 8P相较于单P会有较多的代码添加和改动。交付前还需在代码中添加performance模式,即只运行少量的step,便于查看程序性能。保存.pth文件也不应每个epoch都保存。 关于交付的具体要求以及其它内容请认真参阅华为方相关文档。
总结
本文介绍了模型迁移过程中分布式训练NPU-8P的调试