一点关于多机训练失败的问题定位的经验分享
近期解决了一个多机数据并行训练失败的问题(https://bbs.huaweicloud.com/forum/thread-133720-1-1.html),这个问题比较有代表性,故把一些定位经验分享出来,供用户参考。
1. 用户的问题场景是单机8卡训练能够正常,但是两机16卡训练失败。HCCP报错误码-17,因为数据并行训练时需要AllReduce的,需要调用HCCL/HCCP服务,该错误码表示错误是由device的实际ip与rank_table中的ip不一致导致的;但是用户通过命令查到的device的实际ip与rank_table是一致的。分别登上用户的两台机器,发现两台机器的rank_table配置的没问题,都是16P;但是两台机器上的启动脚本是由问题的,其中脚本中的server_id都设成了0。server_id是用来计算rank_id的,由于是16P环境,其中一台机器上的8卡的rank_id是0--7,另一台机器是8--15。HCCP报错误码-17是由于两台机器都认为自己的卡是0--7,导致了其中一台机器device的实际ip与rank_table中的ip不一致。
2. 在解决了上述问题后,发现仍然没有训练成功,发现16卡都是报连接不上另一台机器的卡的错误(0号卡连不上8号卡,1号卡连不上9号卡,2号卡连不上10号卡,......),这时发现两机报错时间差距是2分多钟。由于HCCL默认的等待超时时间是2分钟,故将HCCL的超时等待时间配置成了600秒。
3. 在解决了上述问题后,发现还是没有训练成功,仍然报本机卡连接不上另一台机器的卡的错误。首先在一台机器上执行命令
hccn_tool -i 0 -netdetect -s address 192.98.xxx.yyy
hccn_tool -i 0 -net_health -g
其中192.98.xxx.yyy是另一台机器上0号卡的device_ip,这两条命令是用来查询本机0号卡到另一台机器上0号卡的连通状态,依次方式可查询其余对等7卡的连通状态。发现这8卡的都是连通的。那么为何AllReduce失败呢?经过与HCCL同事交流,利用命令hccn_tool -i X -tls -g (将X换成0--7中的数)查询TLS状态,发现一台机器上的TLS设置是开启的,另一台机器上是no certificate found。TLS开启表示HCCL通信是加密的,否则是非加密的,no certificate found表示没有加密证书,是非加密通信。也就是一台机器是加密的,另一台是非加密的,这就导致了通信失败。在解决了这个问题后终于能够正常训练了。
所以,有单机扩展到多机训练时,需要注意的有:1)rank_table要确保正确;2)HCCL超时时间可以设长一点;3)机器的系统时间需要确认不能差太多;4)启动脚本要注意,RANK_ID,DEVICE_ID,RANK_SIZE需要正确设置;5)当怀疑底层网络不通时,可以利用上述命令进行测试;6)确保参与通信的所有卡的TLS状态一致。