PyTorch是一个广泛应用于机器学习的开源框架,具有速度快、效率高的特点。近年来广受好评的AMD处理器,具有多核、多任务性能好、性价比高等优点。开发者一直希望两者联手,在AMD处理器上使用PyTorch进行深度学习的开发和研究。前段时间发布的PyTorch1.8增加了对AMDROCm的支持,这对于想在AMD上使用PyTorch进行深度学习的开发者来说是个好消息。不过,对于使用AMDcpu的开发者来说,使用PyTorch进行AI开发可能就没那么顺利了。不,我们从PyTorch的Github上发现了这样一个未解决的问题。github地址:https://github.com/pytorch/pytorch/issues/52142有开发者表示:AMDCPU电脑上的PyTorch,用数据并行单机多GPU训练CNN会造成死锁,同样的代码在Deadlocks不会出现在带有IntelCPU的计算机中。TensorFlow也不存在这个问题。我们遇到了什么错误?我们仔细看看这个死锁是怎么产生的?在提交的Issue中,开发者表示在for循环的训练中,代码会一直运行到forwardpropagationoutput=model(images)。代码会一直停留在model(images)阶段,此时gpu的利用率为0%(内存使用率不为0),3个cpu核的利用率达到100%,而其他cpu核的利用率是0%。使用ctrl+c和ctrl+z停止后,进程PID和GPU内存使用量保持不变。kill、pkill和fuser-k/dev/nvidia*命令会导致僵尸进程(也称为Defunct进程)。僵尸进程的父进程pid为1,无法杀死。唯一的解决办法是重新启动系统。该代码在3台配备Intelcpus的计算机上运行良好,但在4台配备AMDcpus的计算机上会出现上述问题。开发者进一步测试了GTX1080、TitanV、TitanRTX、QuadroRTX8000和RTX3090,证明该bug与GPU型号无关。此外,该项目提到分布式数据并行(DDP)也有类似的问题。有兴趣的开发者可以通过以下配置重现此错误:使用一台带有AMDcpu和多个NVIDIAgpu的机器;Linux、Python3.8、cuda11.0、pytorch1.7.1、torchvision0.8.2;在torchvision中训练resnet18模型编写代码;尝试测试数据并行(DP)和分布式数据并行(DDP)以检查两者是否都是这种情况。根据项目描述,复现后可能会出现:使用AMDcpu时,第一个epoch训练和第一个迭代的前向传播会出现死锁;使用intelcpu时,同样的代码运行良好。对于此次发现的bug,有网友表示也存在同样的问题。发现该漏洞的研究人员在ImagNet、miniImageNet、CIFAR10等数据集上进行了实验。由于CIFAR10轻量级且易于调试,因此开发者在CIFAR10上给出了相应的代码示例:另外,有开发者表示使用TensorFlow不会导致此错误。提交Issue后,PyTorch运维团队成员也纷纷留言参与讨论。当被问及“测试阶段是否包含使用AMDCPU的用例”时,该成员表示:“经过与其他队友的讨论,我们意识到测试阶段没有涉及AMDCPU的用例,我们没有办法重现这个问题“此时。如果我们在今年晚些时候通过支持更多硬件类型来改进测试环境,我们将重新考虑这个问题。”此前有网友发现AMDCPU在PyTorch多卡并联卡住的问题,在查看日志找到错误原因后,问题得到解决,本次暴露的bug目前还没有解决。
