GPU云服务器
检查项 | 说明 |
检查项 | 说明 |
检查代码逻辑 | 确保所有参与通信的Rank(进程)执行的是完全一致的集合通信操作序列。 |
确认数据一致性 | 所有Rank传入的张量(Tensor)需保证数据类型、形状和设备完全一致。
|
添加运行时检查代码(可选) | 您还可以在在对应代码位置,封装一个带检查的all_reduce,示例如下: 说明 仅调试阶段使用,避免增加通信开销。 import torch import torch.distributed as dist def safe_all_reduce(tensor, op=dist.ReduceOp.SUM): """ 带参数检查的 all_reduce 包装函数,用于调试 NCCL 不匹配问题。 """ rank = dist.get_rank() # 1. 检查数据类型 dtype_int = torch.tensor(int(tensor.dtype == torch.float32), device=tensor.device) # 简单示例:检查是否为 float32 # 在实际场景中,可以将 dtype 映射为整数 ID 进行 gather 检查 # 2. 检查形状 (Shape) shape_tensor = torch.tensor(tensor.shape, device=tensor.device, dtype=torch.int) # 收集所有进程的形状信息 (以 Rank 0 为主节点进行校验) world_size = dist.get_world_size() shape_list = [torch.zeros_like(shape_tensor) for _ in range(world_size)] dist.all_gather(shape_list, shape_tensor) # 校验逻辑 if rank == 0: base_shape = shape_list[0] for i, s in enumerate(shape_list): if not torch.equal(base_shape, s): raise RuntimeError( f"NCCL Mismatch Detected! Rank {i} shape {s.tolist()} " f"does not match Rank 0 shape {base_shape.tolist()}" ) print("Shape check passed.") # 执行原始通信 dist.all_reduce(tensor, op=op) # 使用示例 # safe_all_reduce(my_tensor) |