Отказ узла — это не авария, а календарь
Одна машина работает без сбоя долго. Возьмите шестьдесят четыре машины — и события, случающиеся с одной раз в год, начнут происходить в парке каждые несколько дней. Прогон длиной в недели гарантированно застанет несколько таких событий: сбой памяти, отвалившийся сетевой адаптер, перезагрузка узла.
Инженер, который планирует обучение на сотнях ускорителей и не заложил это в архитектуру, узнает про арифметику на третьей неделе, когда прогон упадет и его придется начинать сначала. Мы начали с нее.
Что стоит за нулем рестартов с нуля
Три механизма, простые по отдельности и работающие только вместе.
- Частые снимки состояния. Сохраняется не только модель, но и состояние оптимизатора и позиция в потоке данных. Иначе после восстановления модель доучивается на уже виденных примерах, что тихо портит результат.
- Асинхронная запись. Снимок пишется в фоне, обучение не ждет диск. Иначе частые снимки сами становятся статьей потерь.
- Автоматический подъем. Прогон перезапускается с последнего снимка без участия человека, включая исключение больного узла из парка.
Итог измеряется просто: сколько машинного времени теряется на одном отказе. Минуты — приемлемо. Часы — означают, что за неделю сгорит бюджет небольшого проекта.
Куда уходят девять процентов
91% эффективности масштабирования означает: увеличив парк вдвое, мы получаем чуть меньше двукратного ускорения. Потери складываются из понятных статей.
| Статья потерь | Что с ней делали |
|---|---|
| Обмен градиентами между узлами | Совмещение обмена с вычислениями: пока считается одна часть сети, для другой уже идет синхронизация |
| Ожидание самого медленного узла | Выравнивание нагрузки и контроль машин с просевшей частотой из-за нагрева |
| Подача данных | Отдельная работа с загрузчиком, о ней ниже |
| Запись снимков состояния | Асинхронная запись и разнесение по времени между узлами |
Дальнейшее выжимание процентов возможно, но окупается только на очень длинных прогонах. Мы остановились там, где стоимость инженерного времени сравнялась с экономией машинного.
Загрузчик данных душит раньше сети
Распространенное заблуждение: узкое место распределенного обучения — межузловая связь. На практике первым сдается конвейер подачи данных. Сотни ускорителей требуют изображений с такой скоростью, что обычное чтение мелких файлов из хранилища перестает справляться задолго до того, как упрется сеть.
Что помогло: упаковка мелких файлов в крупные последовательные блоки, декодирование и предобработка ближе к ускорителям, локальный кеш горячей части выборки на узлах. Признак проблемы простой — загрузка ускорителей пилообразная, с провалами. Если она такая, оптимизировать модель бессмысленно.
Воспроизводимость — требование, а не роскошь
Прогон, который нельзя повторить, невозможно и отладить. Фиксируются версии данных, порядок их подачи, код и конфигурация. Каждый снимок состояния привязан к этому набору.
Практическая польза вскрывается при первой же аномалии: когда качество внезапно проседает на середине обучения, нужно точно знать, на каких данных это произошло. Без фиксации остается только гадать и запускать заново.
Сокращение цикла вчетверо — что это дало
Формально сокращение времени одного прогона. Практически — изменение способа работы исследовательской команды. Когда цикл занимает недели, проверяется одна гипотеза за раз и цена ошибки в постановке эксперимента огромна. Когда цикл короче в четыре раза, эксперименты становятся дешевле, и команда проверяет то, что раньше отбрасывала на этапе обсуждения.
Сбойный узел лучше исключить, чем чинить на ходу
Отдельный класс проблем — машина, которая формально жива, а фактически тормозит весь прогон: просела частота из-за нагрева, деградировала память, барахлит сетевой адаптер. При синхронном обучении такой узел задает темп всем остальным, и парк из пятисот ускорителей работает со скоростью самого больного.
Поэтому в контур встроен контроль темпа по узлам: машина, стабильно отстающая от медианы, выводится из прогона автоматически, а обучение продолжается на оставшихся. Разбираться с железом можно потом и спокойно. Ловить это глазами по графикам — значит терять сутки счета на каждую такую машину.
Когда все это не нужно
- Дообучение готовой модели под свою задачу: помещается на одну-две машины, и вся эта инфраструктура избыточна.
- Небольшая выборка: на десятках тысяч изображений распределенное обучение упрется в переобучение раньше, чем в мощности.
- Разовый эксперимент: аренда мощностей на короткий прогон дешевле построения собственного контура.
Мы считаем это до начала работ, потому что предложить заказчику кластер там, где хватает одной машины, — самый быстрый способ испортить отношения на второй встрече.
Направления рядом — распределенное обучение, высоконагруженные модели и эксплуатация ML.