Я относительно новичок в PyTorch, но у меня хороший опыт работы с Keras & TensorFlow.Я следовал этой статье , чтобы использовать DDP в моем собственном учебном скрипте.Однако по какой-то причине я всегда получаю:
процесс 0 завершается со статусом выхода 1.
Я пытался запустить один и тот же код на нескольких платформах GPU(Google Colab, Kaggle, Floyd Hub), но все они в значительной степени выдавали мне ту же ошибку.
Я также пытался отключить опцию join=True
, но затем процесс обучения даже не начинается.
Код, связанный с DDP:
def setup(rank, world_size):
os.environ['MASTER_ADDR'] = 'localhost'
os.environ['MASTER_PORT'] = '12355'
# initialize the process group
dist.init_process_group("gloo", rank=rank, world_size=world_size)
# Explicitly setting seed to make sure that models created in two processes
# start from same random weights and biases.
torch.manual_seed(42)
def cleanup():
dist.destroy_process_group()
def run_demo(fn, *args):
mp.spawn(
fn,
args = (args[0], args[1], args[2], args[3], args[4]),
nprocs = 1, # Also tried 2 , but no difference
join = True
)
И мой код обучения:
def train(model, X, batch_size = 32, epochs = 75, gradient_acc = 0):
setup(1, 2)
device = model.get_default_device()
model = model.to(device, non_blocking = True)
ddp_model = DDP(model, device_ids = [0]) # Only one GPU
# ...
ddp_model.hidden_enc = ddp_model.init_hidden_enc()
ddp_model.hidden_dec = ddp_model.init_hidden_dec()
ddp_model.train()
for ep in range(epochs):
loss_br = 0; nb_batch_steps = 0
for step, batch in enumerate( data_loader ):
batch = batch.to(device, non_blocking = True)
nb_batch_steps += 1
loss = ddp_model(batch)
# ...
cleanup()
Позвоните на код тренировки:
if __name__ == "__main__":
run_demo(
train,
model,
holder[:], # X
32,
75,
3
)
Я хочумодель для работы на нескольких процессах с использованием распределенного параллельного пакета.Интересно, что иногда я получаю исключение Out of Memory
для CUDA, когда я запускаю его без использования DDP.Я понимаю, что spawn.py
завершает все процессы, если какой-либо из доступных процессов существует с status code > 1
, но я пока не могу понять, как избежать этой проблемы.Любая помощь высоко ценится.