手电筒:Nccl 可用但未使用(?)

Torch: Nccl available but not used (?)

我使用 PyTorch 1.9.0,但在尝试 运行 模型的分布式版本时出现以下错误:

File "/home/ferdiko/fastmoe/examples/transformer-xl/train.py", line 315, in <module>
    para_model = DistributedGroupedDataParallel(model).to(device)
  File "/home/ferdiko/anaconda3/envs/fastmoe/lib/python3.9/site-packages/fastmoe-0.2.1-py3.9-linux-x86_64.egg/fmoe/distributed.py", line 45, in __init__
    self.comms["dp"] = get_torch_default_comm()
  File "/home/ferdiko/anaconda3/envs/fastmoe/lib/python3.9/site-packages/fastmoe-0.2.1-py3.9-linux-x86_64.egg/fmoe/utils.py", line 30, in get_torch_default_comm
    raise RuntimeError("Unsupported PyTorch version")

如果我 运行 torch.cuda.nccl.version() 我得到 2708。开发者建议 运行:

x = torch.rand(10).cuda() 
print(torch.cuda.nccl.is_available(x))

这给了我 False。这是否真的意味着 PyTorch 和 NCCL 存在问题?

torch.cuda.nccl.is_available 接受一个张量序列,如果它们在不同的设备上,有希望你会得到一个 True:

    In [1]: import torch
    
    In [2]: x = torch.rand(1024, 1024, device='cuda:0')
    
    In [3]: y = torch.rand(1024, 1024, device='cuda:1')
    
    In [4]: torch.cuda.nccl.is_available([x, y])
    Out[4]: True

如果你只给它一个张量,torch.cuda.nccl.is_available 将遍历它,但同一个张量的不同部分总是在同一个设备上,所以你总是会得到一个 False :

    In [5]: torch.cuda.nccl.is_available(x)
    Out[5]: False

    In [6]: torch.cuda.nccl.is_available([x])
    Out[6]: True