我使用dist.all_gather_object (PyTorch版本1.8)从所有GPU收集示例ids:
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发布于 2022-03-22 09:28:35
结果,我们需要手动设置设备id,就像文档串 of dist.all_gather_object() API中提到的那样。
添加
torch.cuda.set_device(envs['LRANK']) # my local gpu_id密码起作用了。
我一直认为GPU是由PyTorch dist自动设置的,结果不是。
https://stackoverflow.com/questions/71568524
复制相似问题