Я пытаюсь выполнить распределенное обучение с использованием DistributedDataParallel (DDP) PyTorch на нескольких графических процессорах, но обнаруживаю ошибку RuntimeError, указывающую, что тензоры находятся на разных устройствах. Это происходит во время прямого прохода, и обучение работает нормально на одном графическом процессоре.
Среда:
Traceback (most recent call last):
File "/path/to/script.py", line 45, in
mp.spawn(train, args=(world_size,), nprocs=world_size, join=True)
File "/usr/local/lib/python3.10/dist-packages/torch/multiprocessing/spawn.py", line 240, in spawn
return start_processes(fn, args, nprocs, join, daemon, start_method='spawn')
File "/usr/local/lib/python3.10/dist-packages/torch/multiprocessing/spawn.py", line 198, in start_processes
while not context.join():
File "/usr/local/lib/python3.10/dist-packages/torch/multiprocessing/spawn.py", line 160, in join
raise ProcessRaisedException(msg, error_index, failed_process.pid)
torch.multiprocessing.spawn.ProcessRaisedException:
-- Process 0 terminated with the following error:
Traceback (most recent call last):
File "/usr/local/lib/python3.10/dist-packages/torch/multiprocessing/spawn.py", line 69, in _wrap
fn(i, *args)
File "/path/to/script.py", line 35, in train
outputs = model(inputs)
File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "/usr/local/lib/python3.10/dist-packages/torch/nn/parallel/distributed.py", line 1156, in forward
output = self.module(*inputs[0], **kwargs[0])
File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "/path/to/script.py", line 14, in forward
return self.fc(x)
File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/linear.py", line 114, in forward
return F.linear(input, self.weight, self.bias)
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument mat1 in method wrapper_CUDA__addmm)
Я гарантировал, что torch.cuda.set_device(rank) вызывается, и данные явно перемещаются на устройство. Проблема сохраняется только при настройке с несколькими графическими процессорами. Что может быть причиной этого и как я могу это решить? Возможно, что-то связано с синхронизацией DDP или работой с устройством загрузки данных?
Я пытаюсь выполнить распределенное обучение с использованием DistributedDataParallel (DDP) PyTorch на нескольких графических процессорах, но обнаруживаю ошибку RuntimeError, указывающую, что тензоры находятся на разных устройствах. Это происходит во время прямого прохода, и обучение работает нормально на одном графическом процессоре. Среда: [list] [*]Версия PyTorch: 2.0.1
[/list] Минимальный воспроизводимый пример: Вот минимальный сценарий, воспроизводящий проблему. Он определяет простую модель и фиктивный загрузчик данных. [code]import torch import torch.nn as nn import torch.distributed as dist import torch.multiprocessing as mp from torch.nn.parallel import DistributedDataParallel as DDP
class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.fc = nn.Linear(10, 10)
model = SimpleModel().to(rank) model = DDP(model, device_ids=[rank])
optimizer = torch.optim.Adam(model.parameters())
# Dummy data loader (on CPU initially) inputs = torch.randn(4, 10) # Batch size 4, input size 10 labels = torch.randint(0, 10, (4,)) data_loader = [(inputs, labels)] # Single batch for minimal example
for epoch in range(1): # Minimal loop for batch in data_loader: inputs, labels = batch inputs = inputs.to(rank) labels = labels.to(rank) optimizer.zero_grad() outputs = model(inputs) loss = nn.CrossEntropyLoss()(outputs, labels) loss.backward() optimizer.step()
dist.destroy_process_group()
if __name__ == "__main__": world_size = 4 mp.spawn(train, args=(world_size,), nprocs=world_size, join=True) [/code] Как запускается скрипт: я запускаю скрипт с помощью следующей команды: [code]torchrun --nproc_per_node=4 script.py [/code] Полное сообщение об ошибке: ошибка возникает во время прямого прохода модели (выходные данные = модель(входные данные)). Вот полная трассировка: [code]Traceback (most recent call last): File "/path/to/script.py", line 45, in mp.spawn(train, args=(world_size,), nprocs=world_size, join=True) File "/usr/local/lib/python3.10/dist-packages/torch/multiprocessing/spawn.py", line 240, in spawn return start_processes(fn, args, nprocs, join, daemon, start_method='spawn') File "/usr/local/lib/python3.10/dist-packages/torch/multiprocessing/spawn.py", line 198, in start_processes while not context.join(): File "/usr/local/lib/python3.10/dist-packages/torch/multiprocessing/spawn.py", line 160, in join raise ProcessRaisedException(msg, error_index, failed_process.pid) torch.multiprocessing.spawn.ProcessRaisedException:
-- Process 0 terminated with the following error: Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/torch/multiprocessing/spawn.py", line 69, in _wrap fn(i, *args) File "/path/to/script.py", line 35, in train outputs = model(inputs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1501, in _call_impl return forward_call(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/parallel/distributed.py", line 1156, in forward output = self.module(*inputs[0], **kwargs[0]) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1501, in _call_impl return forward_call(*args, **kwargs) File "/path/to/script.py", line 14, in forward return self.fc(x) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1501, in _call_impl return forward_call(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/linear.py", line 114, in forward return F.linear(input, self.weight, self.bias) RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument mat1 in method wrapper_CUDA__addmm) [/code] Я гарантировал, что torch.cuda.set_device(rank) вызывается, и данные явно перемещаются на устройство. Проблема сохраняется только при настройке с несколькими графическими процессорами. Что может быть причиной этого и как я могу это решить? Возможно, что-то связано с синхронизацией DDP или работой с устройством загрузки данных?