Как правильно использовать Распределенную Параллель Данных в Pytorch - PullRequest
1 голос
/ 06 июля 2019

Я относительно новичок в 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, но я пока не могу понять, как избежать этой проблемы.Любая помощь высоко ценится.

...