不同队列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