deep-learning - Pytorch dist.all_gather_object 挂起

标签 deep-learning pytorch distributed

我正在使用 dist.all_gather_object(PyTorch 版本 1.8)从所有 GPU 收集样本 ID:

for batch in dataloader:
    video_sns = batch["video_ids"]
    logits = model(batch)
    group_gather_vdnames = [None for _ in range(envs['nGPU'])]
    group_gather_logits = [torch.zeros_like(logits) for _ in range(envs['nGPU'])]
    dist.all_gather(group_gather_logits, logits)
    dist.all_gather_object(group_gather_vdnames, video_sns)

dist.all_gather(group_gather_logits, logits) 工作正常, 但程序卡在 dist.all_gather_object(group_gather_vdnames, video_sns) 行。

我想知道为什么程序在 dist.all_gather_object() 挂起,我该如何修复它?

额外信息: 我在具有多个 GPU 的本地计算机上运行 ddp 代码。启动脚本是:

export NUM_NODES=1
export NUM_GPUS_PER_NODE=2
export NODE_RANK=0
export WORLD_SIZE=$(($NUM_NODES * $NUM_GPUS_PER_NODE))

python -m torch.distributed.launch \
       --nproc_per_node=$NUM_GPUS_PER_NODE \
       --nnodes=$NUM_NODES \
       --node_rank $NODE_RANK \
       main.py \
       --my_args

最佳答案

事实证明,我们需要手动设置设备 ID,如 docstring 中所述。 dist.all_gather_object() API。

添加

torch.cuda.set_device(envs['LRANK']) # my local gpu_id

并且代码可以工作。

我一直以为 GPU ID 是由 PyTorch dist 自动设置的,事实证明并非如此。

关于deep-learning - Pytorch dist.all_gather_object 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71568524/

相关文章:

python - Caffe Net 不训练(训练时损失不会改变)

python - Tensorflow:针对单个图像中不平衡类的加权稀疏_softmax_cross_entropy

python - 如何在 Windows 10 conda 上安装 torch 音频?

docker - 如何使用 Go SDK 将 `--gpus all` 选项传递给 Docker?

python - 缺失的例子 |使用线程预取和预处理数据

machine-learning - 一个简单的神经网络可以学习应用于四个数字之和的 sin 函数吗?

python - 为 CUDA 9.0 安装 PyTorch 时遇到问题

java - Java 和 .NET 需要分布式缓存

python - 为每个操作创建一个线程还是为各种操作创建一些线程?

mysql - 是否有可能,使用 mysql 的分散解决方案