Налаштування NVIDIA NCCL для мульти-GPU навчання

Навчання на кількох прискорювачах впирається в обмін даними: прогони тривають довше, дороге обладнання простоює. Ми налаштовуємо NCCL під ключ — від аудиту вузла до регламенту запусків. Обмін між прискорювачами перестає бути вузьким місцем, і довгі прогони вкладаються у строк.
Часті запитання

NCCL: чому навчання на кількох прискорювачах не масштабується

Коли модель перестає вміщатися в пам'ять одного прискорювача, її розбивають між кількома, очікуючи кратного прискорення. На практиці друга карта дає приріст помітно менший за подвійний, а на восьми прогін може виявитися довшим, ніж на одній. Причина в тому, що час іде не на обчислення, а на обмін між прискорювачами.

Обмін складається з колективних операцій — розсилання ваг, збору частин тензора, усереднення градієнтів на кожній ітерації. Бібліотека NVIDIA NCCL вирішує, якими каналами й у якому порядку розкласти ці пересилання, щоб жоден прискорювач не чекав на інші довше, ніж потрібно.

Вузьке місце обміну видає себе опосередковано: частка простою прискорювачів зростає разом із розміром кластера, а крива прискорення виходить на плато. Якщо пересилання йдуть через спільну пам'ять і процесор, затримка на кожній ітерації накопичується в години на довгому прогоні.

Налаштування колективних операцій — розмір буфера, кількість одночасних пересилань, пріоритет каналів, прив'язка процесів до пристроїв — змінює картину сильніше, ніж заміна заліза.

Розбираємо, як це закривається: від вимірювання профілю обміну до конфігурації, за якої нелінійне прискорення знову стає лінійним.

Що дає налаштований обмін між прискорювачами

За замовчуванням NVIDIA NCCL сам підбирає топологію обміну — кільце або дерево, кількість каналів, транспорт між вузлами.

На неоднорідній конфігурації цей автовибір помиляється: трафік іде через повільну шину замість прямих лінків між прискорювачами, і утилізація просідає майже вдвічі.

Після явного задання схеми (алгоритм, рівень прямого доступу, потрібний мережевий інтерфейс, прив'язка процесів до лінків) пропускна здатність обміну зростає в 1,5-2 рази, а крок синхронізації перестає бути найдорожчою частиною прогону.

Ефект особливо видно на масштабуванні кластера. Якщо на восьми прискорювачах синхронізація з'їдала частину кроку, то на кількох десятках вона з'їдає весь бюджет часу, і додавання вузлів не дає прискорення.

Налаштований обмін повертає лінійність: час прогону скорочується пропорційно до кількості прискорювачів, а утилізація кожного тримається у верхній частині діапазону замість простою в очікуванні на інших.

Окремо зникає клас відмов «зависання на синхронізації». Один повільний лінк або втрачений пакет змушують чекати всіх учасників, і задача висить до ручного втручання.

Таймаути обміну, діагностичний лог і контроль стану лінків перетворюють це на передбачуваний збій із зрозумілою причиною: процес зупиняється сам, а несправний шлях виводиться з групи обміну.

Контроль тримаємо на чотирьох метриках: пропускна здатність обміну на крок, час прогону, утилізація прискорювачів і кількість перезапусків. Вони показують, де саме втрачається продуктивність — в обчисленнях, у мережі чи в очікуванні.

NCCL: схеми зв'язку прискорювачів, варіанти й обмеження

Вибір схеми обміну в NCCL визначається двома речами: фізичною топологією вузла і профілем навантаження — розміром повідомлень і тим, як часто прискорювачі синхронізуються.

Бібліотека підбирає режим сама, але на нестандартній топології автовизначення помиляється, і навчання починає чекати на обмін замість того, щоб рахувати.

Схеми та їхні межі застосовності

Варіант Коли підходить Обмеження
Кільцева схема Однорідна топологія, великі повідомлення, багато прискорювачів в одній групі Чутлива до повільної ланки: один відстаючий учасник задає темп усім
Ієрархічний обмін Прискорювачі розбиті на групи всередині вузла та між вузлами Потребує явного опису груп; на дрібних задачах накладні витрати вищі за виграш
Пряме з'єднання прискорювачів Пікові задачі, де обмін іде між сусідніми прискорювачами Працює лише там, де топологія фізично це підтримує, і не виходить за межі вузла
Обмін через пам'ять вузла Неоднорідна топологія, налагодження, невеликий обсяг передач Пропускна здатність пам'яті вузла нижча за прямі лінії — обмін стає вузьким місцем

Схеми не взаємовиключні: для дрібних повідомлень розумніший один режим, для великих — інший, і перемикання за порогом дає помітний приріст на змішаному навантаженні.

Ми знімаємо профіль обміну на реальній задачі, звіряємо його з картою топології та фіксуємо режим у конфігурації запуску — так поведінка відтворюється від запуску до запуску, а не залежить від того, що бібліотека вгадала цього разу.

Етапи налаштування: від аудиту вузла до передачі регламенту

Налаштування NCCL — не перебір змінних середовища, а послідовність, де кожен крок спирається на виміряний профіль навантаження.

Без аудиту топології правка колективних операцій перетворюється на вгадування: вузьке місце може бути в шині між прискорювачами, у мережевому транспорті або в коді навчання.

  1. Аудит кластера. Знімаємо карту зв'язків між прискорювачами та вузлами: де обмін іде напряму, де через проміжну ланку, чи однаковий канал на всіх вузлах. На виході — список вузлів, які поводяться інакше за інших.
  2. Профіль навантаження. Прогоняємо реальне навчання з вимірюванням часу кроку та частки, яку займає обмін між пристроями — видно, що гальмує: мережа, синхронізація градієнтів чи підготовка даних.
  3. Схема обміну. Під профіль добираємо алгоритми колективних операцій, розмір буфера та порядок обміну між групами: великий буфер дає рівний потік, малий — меншу затримку на коротких кроках.
  4. Налаштування. Вносимо правки по одній і після кожної повторюємо вимірювання — так видно внесок зміни, а не сумарний ефект від десятка змінних. Конфігурацію тримаємо в репозиторії.
  5. Перевірка під навантаженням. Кілька задач одночасно, вимкнення вузла, перепідключення: розкид часу кроку має залишитися в допустимих межах.
  6. Приймальні випробування. Порівнюємо час кроку та утилізацію прискорювачів до і після, прогоняємо сценарії відмов, фіксуємо контрольні значення, за якими команда перевіряє кластер після змін.
  7. Передача. Віддаємо регламент: як змінювати параметри, куди дивитися при падінні швидкості, які вимірювання знімати перед релізом.

Конфігурації, схеми топології та регламенти запусків

Після введення кластера в експлуатацію в команди замовника залишається не «набір скриптів від підрядника», а комплект артефактів, за яким запуск повторюється вже без нас.

Нижче — те, що ми передаємо і що перевіряємо на прийманні разом із вашими інженерами: у кожного пункту є власник і місце зберігання у вашому репозиторії.

  • Конфігураційні файли навчання: параметри топології каналів NCCL, розміри буферів обміну, таймаути та пороги повторних спроб — з коментарем, чому вибрано саме це значення.
  • Схема топології: карта зв'язків прискорювачів, розподіл за доменами та маршрути, задіяні під час обміну градієнтами між вузлами.
  • Регламент запуску: порядок прогріву, послідовність перевірок зв'язків і критерії, за яких запуск зупиняють, а не дотягують.
  • Політики доступу: ролі на вузлах, обмеження на правку конфігурацій, порядок надання прав на тестовий і продуктивний контури.
  • Профілі діагностики та пороги оповіщення: що вважається деградацією обміну і в який момент черговий зобов'язаний втрутитися.
  • Експлуатаційна документація: інструкції на випадок деградації, заміни вузла та повернення до попереднього профілю запуску.
  • Журнал змін: які правки вносилися в конфігурації, з якою метою і який вимірюваний ефект дали.
  • Протокол приймання: що перевірено, ким підтверджено і які пункти залишаються на супровід.

Кейс: як прибрали простій прискорювачів на довгих прогонах

Що ламалося

Кластер на кілька десятків прискорювачів, довгі прогони навчання. Задачі падали на 5–8 годині: колективний обмін градієнтами зависав, ранги чекали один на одного, задачу знімав сторожовий таймаут.

Перезапуск займав 40–60 хвилин — прогрів кешів, повторне завантаження даних, вирівнювання стану; корисного часу на добу залишалося менше половини.

Розбір дав три причини. Частина трафіку між вузлами йшла повільним шляхом: топологія зв'язків не враховувалася під час вибору маршруту. Таймаути стояли заводські й не відображали реальну тривалість операцій.

Запис контрольних точок ішов паралельно з обміном і забирав пропускну здатність, а конфігурації на вузлах розходилися — однаковий код поводився по-різному.

Що змінили

Звели NVIDIA NCCL до єдиного профілю на всьому кластері: зафіксували порядок вибору шляхів між вузлами, розвели обмін градієнтами та запис контрольних точок різними каналами, підняли таймаути до реальних значень і ввімкнули докладний журнал — видно, який ранг відстав і на якій операції.

Прогін з 11 годин проходить без жодного збою синхронізації, частка успішних запусків — 9 з 10 проти 1 з 3. Відновлення після падіння займає близько 6 хвилин: стан піднімається з останньої контрольної точки.

Час епохи скоротився приблизно на п'яту частину, а повторюваність тримається в межах шуму — ті самі дані та зерно дають однакові метрики.

NCCL: що робити, якщо кластер вже розгорнуто, а обмін гальмує

Коротка відповідь: якщо навчання вже йде і кластер працює, перезбирати середовище не потрібно. NCCL обслуговує колективні операції на кшталт all-reduce, і більшу частину втрат знімає підбір транспорту, кількості каналів і параметрів буферизації.

Діагностика обміну починається з порівняння фактичного часу кроку з розрахунковим обсягом передач: розходження в рази означає, що прискорювачі простоюють в очікуванні, а не рахують.

Далі відокремлюємо міжсерверний обмін від внутрішньосерверного. Якщо крок деградує лише під час масштабування на кілька вузлів, причина в мережевому інтерфейсі та маршруті — невдало вибраний адаптер веде трафік в обхід швидкого шляху.

Усередині вузла вузьке місце зазвичай у топології зв'язків між прискорювачами і в тому, як процеси розподілені за обчислювальними лініями.

Покрокова оптимізація йде на короткому прогоні паралельно з робочим навчанням: спочатку фіксуємо базовий час кроку, потім змінюємо по одному параметру — транспорт, кількість каналів, розмір буфера, поріг, з якого вмикається групування передач.

Кожну зміну звіряємо на одному й тому самому наборі даних, щоб відокремити ефект налаштування від випадкового розкиду.

Переналаштування середовища виконується без зупинки навчання: правки у змінні та конфігурацію спочатку перевіряються в резервному запуску і лише потім переносяться в основний.

На практиці частка часу, яку крок витрачає на обмін, падає в рази, і кластер перестає впиратися в стелю під час додавання нових прискорювачів.

Часті технічні сумніви перед початком робіт

Перед стартом виринають ті самі сумніви: чи спрацює налаштування на вже зібраному залізі, чи не доведеться переписувати навчання і що залишиться команді після здачі.

Вузли в кластері неоднорідні — обмін не деградує?

Симметрію не припускаємо, а вимірюємо: знімаємо профіль колективних операцій між усіма парами вузлів і задаємо NCCL явну топологію замість автоматичного вибору. Повільні канали залишаються, але перестають гальмувати інші — обмін вирівнюється передбачувано.

У нас кілька різних моделей навчання — конфігурація одна на всіх?

Профіль підбираємо під тип навантаження: у паралельного навчання великої моделі, донавчання та інференсу розрізняються розміри буферів і схема розподілу роботи за прискорювачами. Тримаємо окремі профілі, щоб правка одного режиму не зачіпала інші.

На довгих прогонах обмін сповільнюється — як це зловити?

Деградація накопичується непомітно: зростають затримки, падає частка корисного часу прискорювачів. Ставимо спостережуваність з перших днів — метрики обміну, журнали таймаутів, порівняння пропускної здатності на початку й наприкінці прогону.

Що залишиться нам після передачі і чи не зламає це сусідні задачі?

Передаємо конфігурації, скрипти перевірки та схему топології з поясненнями — налаштування можна змінювати без нас. Середовища ізолюємо: закріплені версії бібліотек, контейнери, обмеження за ресурсами, тому сусідні задачі на тих самих вузлах не страждають.

Обговоримо задачу: що надіслати для оцінки та плану

Щоб повернутися з оцінкою та планом робіт, а не із загальними формулюваннями, нам потрібні вхідні дані по кластеру та навантаженню. Частину даних знімають прямо з працюючої системи — підкажемо, які метрики та команди для цього знадобляться. Опишіть задачу у вільній формі, навіть якщо частина пунктів поки невідома.

  • Топологія: скільки вузлів, скільки прискорювачів на кожному, чим вузли з'єднані між собою.
  • Обмін між прискорювачами: чи ввімкнено NCCL, які змінні середовища задано, який транспорт задіяно.
  • Профіль навчання: кількість параметрів моделі, розмір батча, цільовий час одного кроку, потрібна тривалість прогону.
  • Поточні метрики: скільки займає крок зараз і де втрачається швидкість — на обчисленнях, на обміні чи на читанні даних.
  • Середовище: драйвери та бібліотеки актуальної гілки, система керування задачами, контейнери, планувальник.
  • Обмеження: допустиме вікно простою, вимоги до відкату на попередню конфігурацію, політики доступу до вузлів.
  • Що болить: падіння продуктивності під час масштабування, зависання на старті, помилки в журналах обміну.
  • Терміни та приймання: коли потрібен запуск і хто на вашому боці приймає результат.

За цими вхідними даними ми називаємо терміни впровадження та склад команди — скільки інженерів і на який період. Далі обговоримо задачу деталями і повернемося з оцінкою та планом: етапами, точками контролю та варіантами відкату.

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141