不同队列megatron server logits不一致,逐层对比第一次出现diff是在all reduce之后,NCCL默认调用Ring,改为Tree后前向logits能bit位一致I

通过逐层对比激活值发现,在第一次attention里经过linear_proj后开始出现diff,跟进发现是在进行all_reduce通信后激活无法bit位一致, 怀疑NCCL通信导致的

NCCL_NVLS_ENABLE = 0 禁用NVLink SHARP

  • export NCCL_MAX_NCHANNELS=8 (对齐不同队列的channel数)
  • export NCCL_MIN_NCHANNELS=8(对齐不同队列的channel数)

在使用 NCCL_ALGO 为 Ring 时,如果不配置 channel 数,不同队列多次评测logits bit位不一致。
如果 NCCL_ALGO 为 Tree 时不配置 channel 数,不同队列多次评测logits bit位是一致的。

nvlink带宽不一样 channel数不一样,最后nccl选择的算法也不一样, 两个队列强制设置相同channel后,前向logits能bit位一致

    os.environ['NCCL_NVLS_ENABLE'] = '0'
    os.environ['NCCL_ALGO'] = 'Tree'
export NCCL_MAX_NCHANNELS=8
export NCCL_MIN_NCHANNELS=8

参考资料:nccl env variable