rank通信域创建超时导致训练中断
收藏回复举报
rank通信域创建超时导致训练中断
发表于2025-04-02 09:35:04
0 查看
【问题现象】 

客户反馈使用mindspeed-llm单机跑PP场景训练任务时,训练任务会中断,调试发现rank0和rank1卡在了Megatron函数torch.distributed.batch_isend_irecv 

image.png

 

image.png 

 

rank0和rank1异常堆栈信息,存在HCCL超时报错 

image.png 

 

image.png 

 

【版本信息】 

HDK:24.1.rc2.1 

CANN:7.6.0.1.220:8.0.0 

torch_npu:d2.3.1.post4 

 

【分析过程】 

1、收集plog日志,分析发现rank0和rank1在创建8卡通信域,rank2-7在下发BatchSendRecv,rank间互相等待导致超时 

rank0-1:关键字topoinfo_exchange表示rank在创建通信域阶段,rankNum[8]表示通信域为8卡 

image.png

 

image.png

 

rank2-7:关键字transport表示rank在建链阶段,本端和对端在下发BatchSendRecv算子资源创建时,建链超时 

image.png

 

2、分析Megatron对应源码p2p_communication.py,其中group表示创建通信域生成的通信组,尝试将group注释掉,此时使用的group为已初始化好的默认group,rank0和rank1创建通信域时不会超时,训练恢复正常 

image.png

 

3、客户反馈使用cuda+torch+megatron无异常,使用npu+torch_npu+mindspeed-llm才会出现该问题,和研发确认后得知torch和torch_npu在BatchSendRecv算子的实现上不一样,torch的BatchSendRecv算子在单条流上不会阻塞 

 

【问题根因】 

rank间下发操作冲突,rank0和rank1在创建通信域,rank2-7在下发BatchSendRecv,导致互锁超时,训练失败 

 

【解决方案】 

torch_npu实现的BatchSendRecv算子在单条流上会阻塞,目前可以通过使用默认的通信域group规避该问题 

 

【相关知识】 

一、超时问题会发生在hccl算子执行的多个阶段中,原因也大相径庭,可根据log日志中的报错信息初步判断处于哪个阶段再进行排查: 

1、通信域超时 

若报错日志中出现如下图中的打印,报错日志中一般有topoinfo_exchange的打印,一般在通信域创建的时候就发生了报错 

image.png

 

2、建链超时 

若报错日志中出现如下图中的建链失败表格打印,报错日志中一般有transport的打印,一般对应着是在算子下发资源创建时,本端和对端建链超时 

image.png

 

3、执行超时 

若在报错日志中能看到notifywait报错,如下图所以,一般对应着是在算子执行过程中,notifywait task执行超时了 

image.png

 

二、BatchSendRecv是一种将多个小批量数据合并成一个大的批量数据包进行发送和接收的技术,这样可以减少通信次数,从而降低网络延迟和带宽消耗。 

 

BatchSendRecv的工作原理 

BatchSendRecv通过将多个小的数据包合并成一个大的数据包进行发送和接收,减少了通信次数。具体来说,当应用程序需要发送数据时,它会将多个小的数据包缓存起来,等到缓存的数据量达到一定阈值时,再一次性发送出去。接收方也是如此,它会等待接收足够的数据后再进行处理,这样可以显著减少网络传输的次数,提高通信效率。 

 

BatchSendRecv在PP通信中的优势 

1、减少通信次数:通过合并多个小数据包为一个大数据包进行传输,减少了网络请求的次数,降低了网络延迟。 

2、提高通信效率:批量处理可以更有效地利用网络带宽,减少因频繁小数据包传输带来的开销。 

3、优化资源利用:批量处理可以减少CPU和网络的负载,使得资源能够更有效地被利用。 

BatchSendRecv在不同场景下的应用 

BatchSendRecv适用于需要频繁进行小数据传输的场景,特别是在分布式系统和微服务架构中,这种技术可以显著提升系统的整体性能和响应速度。 

我要发帖子