Актуальные темы
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Вы на интервью на должность ML Engineer в Google.
Интервьюер: Нам нужно обучить LLM на 1,000 GPU. Как бы вы убедились, что все GPU делятся тем, что они узнали?
Вы: Используйте центральный сервер параметров для агрегации и перераспределения весов.
Интервью завершено.
Вот что вы пропустили:
Одним из основных узких мест во время выполнения при обучении на нескольких GPU является синхронизация GPU.
Например, при обучении на нескольких GPU с использованием параллелизма данных:
- Одна и та же модель распределяется по различным GPU.
- Каждый GPU обрабатывает различный подмножество всего набора данных.
Проверьте это 👇
Это приводит к различным градиентам на разных устройствах.
Поэтому, прежде чем обновлять параметры модели на каждом устройстве GPU, мы должны передать градиенты всем другим устройствам, чтобы синхронизировать их.
Давайте рассмотрим 2 распространенные стратегии дальше!
Алгоритм 1) All-reduce
Очевидный способ — отправить градиенты с одного устройства на все остальные устройства для их синхронизации.
Но это использует большую пропускную способность.
Если у каждой GPU есть "N" элементов и "G" GPU, это приводит к общей передаче G*(G-1)*N элементов 👇
Мы можем оптимизировать это, перенесев все элементы на один GPU, вычислив окончательное значение и отправив его обратно всем другим GPU.
Это значительное улучшение.
Но теперь один GPU должен получать, вычислять и передавать обратно градиенты, поэтому это не масштабируется.
Алгоритм 2) Уменьшение кольца
Фаза #1) Уменьшение по частям
Сначала градиенты делятся на G сегментов на каждом GPU (G = общее количество GPU).
Проверьте это 👇
В итерации каждая GPU отправляет сегмент следующей GPU:
- GPU1 отправляет a₁ на GPU2, где он добавляется к b₁
- GPU2 отправляет b₂ на GPU3, где он добавляется к c₂
- GPU3 отправляет c₃ на GPU4, где он добавляется к d₃
- GPU4 отправляет d₄ на GPU1, где он добавляется к a₄
Проверьте это 👇
Этот процесс выполняется снова:
- GPU1 отправляет (d₄+a₄) на GPU2, где оно добавляется к b₄.
- GPU2 отправляет (a₁+b₁) на GPU3, где оно добавляется к c₁.
- GPU3 отправляет (b₂+c₂) на GPU4, где оно добавляется к d₂.
- GPU4 отправляет (c₃+d₃) на GPU1, где оно добавляется к a₃.
Проверьте это 👇
В финальной итерации следующие сегменты передаются на следующий GPU.
Это приводит к состоянию, когда каждый GPU имеет один целый сегмент, и мы можем передать эти полные сегменты всем другим GPU.
Проверьте это 👇
Этап #2) Только для обмена
Теперь, когда каждый GPU имеет один целый сегмент, мы можем передать эти полные сегменты всем другим GPU.
Процесс выполняется аналогично тому, что мы обсуждали выше, поэтому мы не будем вдаваться в подробности.
Итерация 1 показана ниже👇
Далее мы выполняем итерации 2 и 3.
Они проводятся аналогично тому, что мы узнали на этапе 1.
Проверьте это 👇
Вот и всё!
Веса модели были синхронизированы между GPU.
Хотя общее количество переданных элементов по-прежнему такое же, как в подходе «один GPU - мастер», этот кольцевой подход гораздо более масштабируемый, так как не нагружает весь процесс на один GPU.
Проверьте это 👇

По умолчанию модели глубокого обучения используют только один GPU для обучения, даже если доступно несколько GPU.
Идеальный способ обучения моделей — распределить нагрузку на обучение между несколькими GPU.
График изображает четыре стратегии для обучения на нескольких GPU👇
364,81K
Топ
Рейтинг
Избранное

