Я хотел бы спросить, как агрегируются градиенты при обучении многоузловому multi-gpu в кластере с использованием Slurm для управления рабочей нагрузкой. Код написан с использованием Pytorch.
Например, при запуске скрипта train.py
в Slurm для обучения модели на 4 узлах с 4GPU на узел, как показано ниже, что именно делает команда srun
?
srun python train.py
В документации написано, что srun
используется для запуска параллельного задания в кластере, управляемом Slurm. Тем не менее, я хотел бы знать, какие шаги он выполняет. Я предполагаю, что он копирует сценарий в 16 графических процессоров, и каждый графический процессор будет запускать сценарий одновременно. Это правильно?
Если я использую torch.distributed.init_process_group()
в своем скрипте для обучения нескольких графических процессоров, как Slurm будет обрабатывать градиенты, собранные с каждого графического процессора вместе с Pytorch? Я предполагаю, что есть главный порт (который является устройством графического процессора в узле, назначенном Slurm), который собирает градиенты. И все 16 графических процессоров в 4 узлах будут передавать градиенты в этот мастер-порт благодаря пакету torch.distributed
? Slurm помогает распределять ресурсы, но он не играет никакой роли в агрегировании градиентов?
Я также не уверен, должен ли я запускать скрипт, используя srun
, как указано выше, или я должен указать torch.distributed.launch
в моей команде, как показано ниже. Я хочу убедиться, что градиенты собраны правильно.
# NGPU equals to number of GPUs/node
export NGPU=4
srun python -m torch.distributed.launch --nproc_per_node=$NGPU train.py
Заранее благодарю за помощь!