Глубокое обучение - агрегирование градиентов на серверах параметров
У меня есть несколько вопросов относительно серверов параметров и выполненного агрегирования градиента. Мой основной источник - книга "Погружение в глубокое обучение" [1]. Я предполагаю модель BSP, т.е. мы синхронизируемся после каждой мини-партии. Я не был уверен, принадлежит ли это сообществу Data Science или AI StackExchange, поэтому я выбрал здесь значение по умолчанию...
Рисунок 12.7.1 в [1] предлагает следующий подход: Предположим, что размер пакета 32. Если у нас есть один графический процессор и 128 обучающих точек данных, каждая эпоха имеет 4 мини-пакета. После каждой мини-партии мы обновляем нашу модель (т.е. есть 4 обновления). Следовательно, мы должны рассчитать четыре градиента (по одному на минипакет).
Для случая с несколькими графическими процессорами предположим, что два графических процессора и 128 обучающих точек данных. Мы скармливаем каждому графическому процессору мини-пакет, позволяем им вычислять градиент, суммировать их и обновлять нашу модель этой суммой. Следовательно, задействованы два шага вместо четырех (с точки зрения BSP).
У меня следующие вопросы:
Правильно ли я понял, как работают серверы параметров? Особенно я не уверен, сохраняем ли мы тот же размер пакета 32 на графический процессор или нам нужно разделить размер пакета на количество графических процессоров.
Почему мы суммируем градиенты, а не усредняем их? Это меня еще больше сбивает с толку, так как в документации PyTorch [2] DistributedDataParallel есть следующее утверждение:
Когда модель обучается на M узлах с пакетом =N, градиент будет в M раз меньше, если> по сравнению с той же моделью, обученной на одном узле с пакетом =M*N (потому что градиенты> между разными узлами усредняются). Вы должны принять это во внимание, если хотите получить математически эквивалентный учебный процесс по сравнению с местным учебным аналогом.
Здесь есть две вещи, которые сбивают с толку:
2.1. В нем указано, что градиенты усредняются, что не соответствует книге D2L, в которой говорится, что мы суммируем градиенты.
2.2. До сих пор я всегда думал, что в мини-пакетном градиентном спуске функция потерь (цель оптимизации) усредняет ошибку точек данных мини-пакета. Следовательно, если M узлов запускают мини-пакетный градиентный спуск с размером пакета N, и мы берем среднее значение их градиентов, мы должны получить число того же порядка величины, как если бы 1 узел запускал мини-пакетный градиентный спуск с размер пакета NM, поскольку один узел усредняет функции ошибок nm точек данных для функции потерь, тогда как с M узлами мы просто берем среднее значение средних.
Я не уверен, можно ли рассматривать класс DistributedDataParallel в PyTorch как сервер параметров (особенно потому, что у них даже есть руководство по созданию сервера параметров в PyTorch [3]), но он соответствует тому, что описано в книге как сервер параметров.
Приветствуется любая помощь в разрешении моего замешательства. Большое спасибо!
С уважением, Максимилиан
[1] https://d2l.ai/chapter_computational-performance/parameterserver.html
[2] https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html
[3] https://pytorch.org/tutorials/intermediate/rpc_param_server_tutorial.html