华为Ascend众智计划项目--3DMPPE_ROOTNET--Pytorch模型迁移至NPU(五)

系列文章目录

项目信息、本地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(五)

文章目录

  • 系列文章目录
  • 前言
  • 一、NPU-8P调试
  • 总结


前言

  本系列文章记录笔者在完成华为昇腾众智项目的主要过程、遇到的问题及解决方案等。Ascend 众智计划是华为围绕 Ascend 基础软件平台推出的一项生态合作计划,旨在汇聚高校、科研院所、企业等组织和机构的开发团队,通过项目合作方式,基于 Ascend 基础软硬件平台开发算子、网络模型及行业参考设计,不断丰富 Ascend 计算产业生态,为加速千行百业智能化升级贡献智慧与力量。笔者负责的是姿态识别模型3DMPPE_ROOTNET的训练任务,该模型是基于Pytorch框架实现的。



一、NPU-8P调试

  1. 参考官方文档的2.1.3 NPU功能打通部分。详细的NPU多卡所需要修改的地方请点击这里。另外文档中也给出了一个可供参考的模型ShuffleNetV2。进行修改时请务必仔细阅读文档, 但不一定完全按照文档进行修改。另外还可以参考modelzoo中已完成的模型。
  2. NPU单P跑起来后多P一般不会出现太多问题。在修复了一些代码bug后程序即可正常在8P上运行。令人意外的是8P的精度竟然超过了论文精度不少,论文精度为0.31,而8P的精度平均可以达到0.37,最高精度达到了0.405。在性能方面,8P没有出现太大问题,较NPU单P提升了5~6 倍。
  3. 另外请注意对代码载入预训练模型的功能进行测试,包括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')
  4. 关于DDP的一些参数设置可以参考 PyTorch分布式DPP的基本概念。另外笔者在DDP的启动方面使用了mp.spawn,具体可以参考官方文档,和这篇博客最后的部分 DDP及其在pytorch中应用。
  5. 在8P的性能优化方面,笔者还对dataloader中的num_workers进行了调整,num_workers的大小同样会对性能产生影响。具体可以参考 pytorch DataLoader的num_workers参数与设置大小详解。简单来说,就是在设备允许的情况下缓慢增加num_workers,直到训练速度不再提高,就停止增加num_workers的值。
  6. 8P相较于单P会有较多的代码添加和改动。交付前还需在代码中添加performance模式,即只运行少量的step,便于查看程序性能。保存.pth文件也不应每个epoch都保存。 关于交付的具体要求以及其它内容请认真参阅华为方相关文档。

总结

本文介绍了模型迁移过程中分布式训练NPU-8P的调试

你可能感兴趣的:(华为-Ascend,pytorch,华为,深度学习)