我使用这个命令来使用GPU。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
但是,我想在Jupyter中使用两个GPU,如下所示:
device = torch.device("cuda:0,1" if torch.cuda.is_available() else "cpu")
yvt65v4c1#
假设您希望将数据分布在可用的GPU上(如果您的批处理大小为16,并且有2个GPU,您可能需要为每个GPU提供8个样本),而不是将模型的各个部分真正分布在不同的GPU上。
如果要使用所有可用的GPU:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = CreateModel() model= nn.DataParallel(model) model.to(device)
如果您要使用特定的GPU:(例如,使用4个GPU中的2个)
device = torch.device("cuda:1,3" if torch.cuda.is_available() else "cpu") ## specify the GPU id's, GPU id's start from 0. model = CreateModel() model= nn.DataParallel(model,device_ids = [1, 3]) model.to(device)
通过设置操作系统环境变量来使用特定GPU:
在执行程序之前,按如下方式设置变量CUDA_VISIBLE_DEVICES:export CUDA_VISIBLE_DEVICES=1,3(假设您要选择第2个和第4个GPU)然后,在程序中,您可以使用DataParallel(),就像您想使用所有GPU一样(类似于第一种情况)。这里,程序可用的GPU受操作系统环境变量的限制。
CUDA_VISIBLE_DEVICES
export CUDA_VISIBLE_DEVICES=1,3
DataParallel()
在所有这些情况下,数据都必须Map到设备。如果X和y是数据:
X
y
X.to(device) y.to(device)
ivqmmu1c2#
使用多GPU就像在DataParallel中 Package 模型并增加批处理大小一样简单。
DataParallel
wfveoks03#
另一个选择是为PyTorch使用一些辅助库:
在there中,有一个 * 上下文管理器 * 的概念,用于在以下位置进行分布式配置:
This可能是在CPU/GPU/TPU上训练的最佳选择,而不会改变你原来的PyTorch代码。值得检查Catalyst以获得类似的分布式GPU选项。
wpx232ag4#
当我运行naiveinception_googlenet时,上面的方法对我不起作用。下面的方法解决了我的问题。
naiveinception_googlenet
import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "0,3" # specify which GPU(s) to be used
jdgnovmf5#
如果您希望仅在特定GPU上运行代码(例如,仅在GPU id 2和3上),则可以在从终端触发python代码时使用CUDA_VISIBLE_DEVICES= 2,3变量指定。
CUDA_VISIBLE_DEVICES=2,3 python lstm_demo_example.py --epochs=30 --lr=0.001
在代码中,将其保留为:
device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') model = LSTMModel() model = nn.DataParallel(model) model = model.to(device)
来源:https://glassboxmedicine.com/2020/03/04/multi-gpu-training-in-pytorch-data-and-model-parallelism/
wd2eg0qa6#
2022年,PyTorch说:建议使用DistributedDataParallel而不是此类来进行多GPU培训,即使只有一个节点也是如此。请参见:请使用nn.parallel.DistributedDataParallel,而不要使用多重行程或nn.DataParallel和分散式数据平行。中https://pytorch.org/docs/stable/generated/torch.nn.DataParallel.html#torch.nn.DataParallel因此,似乎我们应该使用DistributedDataParallel,而不是DataParallel。
DistributedDataParallel
6条答案
按热度按时间yvt65v4c1#
假设您希望将数据分布在可用的GPU上(如果您的批处理大小为16,并且有2个GPU,您可能需要为每个GPU提供8个样本),而不是将模型的各个部分真正分布在不同的GPU上。
如果要使用所有可用的GPU:
如果您要使用特定的GPU:(例如,使用4个GPU中的2个)
通过设置操作系统环境变量来使用特定GPU:
在执行程序之前,按如下方式设置变量
CUDA_VISIBLE_DEVICES
:export CUDA_VISIBLE_DEVICES=1,3
(假设您要选择第2个和第4个GPU)然后,在程序中,您可以使用
DataParallel()
,就像您想使用所有GPU一样(类似于第一种情况)。这里,程序可用的GPU受操作系统环境变量的限制。在所有这些情况下,数据都必须Map到设备。
如果
X
和y
是数据:ivqmmu1c2#
使用多GPU就像在
DataParallel
中 Package 模型并增加批处理大小一样简单。wfveoks03#
另一个选择是为PyTorch使用一些辅助库:
PyTorch Ignite库分布式GPU培训
在there中,有一个 * 上下文管理器 * 的概念,用于在以下位置进行分布式配置:
PyTorch lightning 多GPU训练
This可能是在CPU/GPU/TPU上训练的最佳选择,而不会改变你原来的PyTorch代码。
值得检查Catalyst以获得类似的分布式GPU选项。
wpx232ag4#
当我运行
naiveinception_googlenet
时,上面的方法对我不起作用。下面的方法解决了我的问题。jdgnovmf5#
如果您希望仅在特定GPU上运行代码(例如,仅在GPU id 2和3上),则可以在从终端触发python代码时使用CUDA_VISIBLE_DEVICES= 2,3变量指定。
在代码中,将其保留为:
来源:https://glassboxmedicine.com/2020/03/04/multi-gpu-training-in-pytorch-data-and-model-parallelism/
wd2eg0qa6#
2022年,PyTorch说:
建议使用DistributedDataParallel而不是此类来进行多GPU培训,即使只有一个节点也是如此。请参见:请使用nn.parallel.DistributedDataParallel,而不要使用多重行程或nn.DataParallel和分散式数据平行。
中https://pytorch.org/docs/stable/generated/torch.nn.DataParallel.html#torch.nn.DataParallel
因此,似乎我们应该使用
DistributedDataParallel
,而不是DataParallel
。