Ви не програли на засіданні щодо бюджету на GPU. Фізика винна. І ланцюги постачання. І програмна екосистема, яка перетворила чіпи одного вендора на де-факто CPU сучасного машинного навчання.
Якщо ви останнім часом пробували купити GPU, ви вже знаєте симптоми: строки постачання, що схожі на жарт, “еквівалентні” альтернативи, які такими не є, та проблема чергування, що тягнеться від закупівель до планування, живлення та сховища. Ви не виправите ринок. Але ви можете швидко зрозуміти його, щоб приймати розумні рішення й не допустити краху продакшену.
Найпростіше пояснення (із нудною правдою)
ШІ “поглинуло” ринок GPU, тому що глибоке навчання — це надзвичайно ефективний спосіб перетворити обчислення на продуктову цінність, а GPU — найекономічніший апарат для такого перетворення в масштабі. Коли один клас навантажень може прибутково споживати практично будь-яку кількість паралельних обчислень, це не лише збільшує попит. Це переписує визначення «достатньо».
Є три сили, що працюють одночасно, і вам потрібні всі три, щоб зрозуміти, чому ринок зламався:
- Форма математики: Тренування й сервіс сучасних нейромереж — переважно величезні матричні множення та векторні операції — робота, з якою GPU справляються абсурдно добре.
- Пропускна здатність пам’яті: ШІ — це не лише обчислення; це переміщення тензорів. HBM та широкі шини на підкладці — це чит‑код, і GPU їх мають.
- Програмне забезпечення + ефект мережі: CUDA, cuDNN, NCCL і десятиліття інструментів означали, що ви могли швидше перетворювати капітальні витрати на моделі на GPU, ніж деінде. Ринок пішов шляхом найменшого тертя.
Як тільки кілька великих гравців довели, що масштабування GPU масштабує доходи, всі інші почали наздоганяти. Це не хайп. Це стимул.
Одна суха операційна істина: раніше ми купували акселератори, щоб пришвидшити програми. Тепер ми купуємо акселератори, щоб пришвидшити організації. GPU‑кластер — це виробнича лінія, а продукт — швидкість ітерацій.
Для чого насправді підходять GPU
GPU — це не магія. Це дуже специфічна торгівля: величезна пропускна здатність для вузького класу паралельної роботи, і готовність змусити вас працювати з обмеженнями (розмір пам’яті, пропускна здатність пам’яті, інтерконект, накладні витрати на запуск кернелів і програмний стек, що може кусатися).
Пропускна здатність: модель «багато дрібних працівників»
CPU — це кілька дуже здатних працівників із великими набором інструментів. GPU — тисячі вужчих працівників з одним і тим же ключем, які крутять той самий болт. ШІ насправді — це «багато однакових болтів», особливо під час тренування: множити матриці, акумулювати градієнти, повторювати.
HBM: прихована зірка шоу
Якщо ви дивитесь тільки на FLOPS, ви приймете погані рішення. Багато реальних прогонів тренування обмежені тим, як швидко ви можете переміщувати ваги й активації через пам’ять. GPU поєднують обчислення з дуже високою пропускною здатністю пам’яті — особливо з HBM. Це не маркетинг; часто це різниця між 30% та 90% завантаженням.
Інтерконект: масштабування — це здебільшого мережа
Коли ви тренуєтеся на кількох GPU, ви перестаєте «робити математику» й починаєте «робити розподілені системи». Синхронізація градієнтів — це задача all-reduce. Різниця між PCIe‑only і NVLink/NVSwitch може бути різницею між масштабуванням і хаосом.
Операційний висновок: купівля більшої кількості GPU іноді найшвидший спосіб виявити, що ваша топологія мережі неправильна.
Чому робочі навантаження ШІ домінують
Історично GPU були сумішшю ринків: ігри, візуалізація, часткове HPC, рендер‑ферми. Той ринок був великий, але фрагментований. ШІ перетворило його на одного, ненажерливого покупця з уніфікованими потребами: щільна математика, величезна пропускна здатність пам’яті, швидкий інтерконект, стабільні драйвери і передбачувана модель програмування.
Тренування — це товар масового споживання, інференс — бізнес латентності
ШІ має два основні виробничі режими:
- Тренування: максимізувати пропускну здатність і ефективність масштабування. Ви погоджуєтеся на пакетність. Вас цікавить утилізація й вартість за токен/зразок.
- Інференс: мінімізувати латентність і вартість за запит, не порушуючи SLA. Вас цікавить хвостова латентність, стратегія батчингу та відбиток пам’яті.
Обидва режими хочуть GPU, але з різних причин:
- Тренування потребує щільності обчислень, пропускної здатності пам’яті і інтерконекту.
- Інференс часто потребує ємності пам’яті і передбачуваної продуктивності, бо модель має поміститися й відповідати швидко.
Чому CPU не наздогнали (переважно)
CPU ставали кращими, векторні блоки покращувалися, і є серйозні CPU‑розгортання для інференсу. Але для великих моделей і масштабного тренування економіка на користь GPU: «вартість виконання одиниці щільної лінійної алгебри» довший час була кращою на GPU, а програмні стеки це ще підсилювали.
Також: сучасні AI‑пайплайни — це тепер проблема стека. Це не «мій код запускається на кремнії». Це CUDA‑кернелі, злиті операції, змішана точність, бібліотеки комунікацій, компілятори й рантайм‑планувальники. Платформа, яка робить це найменш болісним, виграє попит.
Короткий жарт №1: Купувати GPU для ШІ — це як взяти хаскі на утримання: ви його не «володієте», ви просто відповідаєте за його щоденну потребу в бігу.
Економіка: одна діаграма, яку треба пам’ятати
Уявіть просте відношення:
Цінність, вироблена за одиницю часу ÷ вартість за одиницю часу.
ШІ зробило це відношення експоненційним для компаній, які могли постачати кращий пошук, кращі рекомендації, кращі інструменти для коду, краще таргетування реклами, кращу підтримку клієнтів або цілком нові продукти. Коли це відношення достатньо велике, ви перестаєте питати «чи потрібні нам GPU?» і починаєте питати «скільки ми можемо отримати, не зруйнувавши дата-центр?»
Попит не масштабується лінійно; амбіції — так
Коли GPU були для графіки, попит можна було прогнозувати за споживчими трендами. Коли GPU — це конкурентна перевага, попит стає стратегічним. Якщо наступна ітерація моделі може змінити ваші продуктові метрики, ви охоче виділите більше бюджету на тренування. Ваш конкурент теж. Так ринки поїдаються: не одною революцією, а петлею зворотного зв’язку.
Постачання повільне, а пакування — це горловина
Навіть якщо є потужності по силікону, висококласні GPU залежать від просунутого пакування, постачання HBM, підкладок і тестових потужностей. Це не нескінченно, і ви не можете просто «увімкнути» більше за ніч. Строки постачання — спосіб ринку сказати: фізичний світ досі керує ситуацією.
Операційний податок: живлення і охолодження
Рак з великою кількістю GPU — це раак з високою щільністю потужності. Це означає, що ваші обмеження зміщуються з «бюджету» на «вати й BTU». Багато команд відкривають — запізно — що їх контракт з дата-центром припускав світ, де 10–15 kW на стійку були нормою. Тепер приходять 30–60 kW стійки, і ваш реліз блокується роботою з об’єктом, а не апаратурою.
Програмний стек, що закріпив попит
Люди недооцінюють, наскільки ринок GPU — це історія про програмне забезпечення. Апарат важливий, але час розробника важить більше. Переможна платформа — та, що дає найкоротший шлях від «маю ідею» до «вона навчається за ніч і метрики покращилися».
CUDA — це ров, зроблений з інструментів і звичок
Екосистема CUDA мала роки на зміцнення: кернелі, бібліотеки, профайлери, дебагери, бібліотеки колективної комунікації (NCCL), примітиви змішаної точності та підтримка вендора. Більшість ML-фреймворків припускають її наявність. Багато передових оптимізацій з’являються там першими. Це створює градієнт прийняття: найпростіше рішення стає дефолтним, а закупівлі йдуть за ним.
Змішана точність перетворила «занадто велике» на «можливе»
Tensor cores і тренування зі змішаною точністю — це не просто твіки продуктивності. Вони змінили масштаб моделей, зробивши тренування дешевшим за одиницю прогресу. Коли правильні числові трюки доступні в мейнстрим-стеку, розмір моделі зростає. Ріст моделей підштовхує попит на GPU. Попит стимулює інвестиції. Петля повторюється.
Розподілене тренування: вибір бібліотеки може змінити витрати
Команди часто ставляться до масштабування на багатьох GPU як до галочки. Це не так. Ваш вибір data parallelism, tensor parallelism, pipeline parallelism і стратегії комунікацій може змінити вартість тренування у кілька разів.
І якщо ваш all-reduce б’ється з вашою топологією, жодна кількість «більше GPU» вас не врятує. Ви просто заплатите за швидше розчарування.
Парафразована ідея (приписують): Werner Vogels радив будувати системи, припускаючи, що дещо зламається, щоб ваш сервіс продовжував працювати.
Де насправді вузькі місця (підказка: не завжди GPU)
У продакшені «нестача GPU» іноді просто означає «недовантаження GPU». Перш ніж витратити ще мільйон, дізнайтеся, куди йде ваш час. Є п’ять поширених горловин:
1) Вхідний pipeline і сховище
Ваше тренування не може тренуватися, якщо воно не може читати. Data loader-и, бурі з дрібними файлами, мережеві файлові системи, об’єктні стораджі, обмеження на запити і декомпресія можуть виснажувати GPU. Кластер з 80% простою GPU зазвичай — це історія про сховище та CPU в костюмі GPU.
2) Передобробка на CPU
Токенізація, аугментація, декодування, інженерія ознак, парсинг JSON — усе це може стати лімітом. Якщо один потік CPU готує батчі для вісьмох GPU — вітаємо: ви побудували дуже дорогий обігрівач простору.
3) Ємність пам’яті GPU і фрагментація
OOM не завжди означає «модель занадто велика». Іноді це фрагментація алокатора, кілька процесів на одному GPU або неконтрольоване кешування. Іноді це ваш розмір батчу. Іноді — витік пам’яті в кастомному розширенні. Діагностуйте, не здогадуйтеся.
4) Насичення інтерконекту
Мульти‑нодове тренування — це важка комунікація. Якщо fabric переповнений або неправильно налаштований, ефективність масштабування руйнується. Слідкуйте за NCCL retries, повільними collective‑операціями і нерівними часами кроків між ранками.
5) Живлення та термічне тротлінг
GPU спроектовані так, щоб досягати лімітів по потужності і теплу. Якщо в дата-центрі спекотно, повітря неправильно циркулює або ліміти потужності встановлені невірно, GPU знизить тактові частоти. Воно вам не скаже. Просто тихо виконуватиме менше роботи, а ваші завдання триватимуть довше.
Факти та історичний контекст, які мають значення
- GPU стали універсальними обчислювачами у середині 2000‑х, коли розробники почали використовувати графічні конвеєри для неграфічної математики (рання епоха GPGPU).
- CUDA запущено 2007 року, що зробило програмування GPU набагато зручнішим, ніж хаки зі шейдерами, і дало стабільну ціль для інструментів і бібліотек.
- AlexNet (2012) загалом вважають тим моментом, коли GPU‑прискорене глибоке навчання стало «очевидно того варте» для комп’ютерного зору, бо воно навчалося ефективно на GPU.
- HBM з’явилося в середині 2010‑х і змінило профіль продуктивності топових акселераторів, значно підвищивши пропускну здатність пам’яті.
- Tensor cores (кінець 2010‑х) вивели матричну математику зі змішаною точністю в мейнстрим, множачи ефективну пропускну здатність для тренувальних навантажень.
- NCCL зміцніло як дефолт для GPU‑колективів, що зробило мульти‑GPU і мульти‑нодове тренування доступнішим для команд без кастомного налаштування MPI.
- Трансформери (з 2017) спрямували ШІ до навантажень, що агресивно масштабуются з обчисленнями й даними, прискоривши попит на великі кластери.
- У 2020–2022 роках глобальні збої в ланцюгах постачання плюс зростання попиту погіршили строки поставок, але хвиля ШІ не чекала на заводи.
- Щільність потужності дата-центрів стала головним обмеженням, коли стійки з акселераторами перемістилися з «висока» до «перепланування об’єкта» території.
Три корпоративні міні-історії з передової
Міні-історія №1: Інцидент через неправильне припущення
Середня SaaS‑компанія перейшла від сервісу інференсу на одному GPU до вузла з кількома GPU, щоб зменшити хвостову латентність. Команда припустила, що «більше GPU» означає «більше запасу», і запланувала кілька реплік моделі на хості. Вони також припустили, що топологія PCIe фактично однорідна.
Не була. Половина GPU ділила PCIe‑свіч із NIC, і під навантаженням патерн трафіку став негарним. P99 латентність почала повільно підніматися, потім стрибати. Сервіс не падав; він став ненадійним так, що клієнти помітили. On‑call побачив, що GPU‑util виглядав «нормально», і це затримало правильну діагностику.
Зрештою хтось запустив перевірку топології і зрозумів, що найзавантаженіші репліки були закріплені на GPU з найгіршими шляхами host-to-device і device-to-network. Виправлення не вимагало героїзму: встановили явну афінність GPU, перемістили мережево‑важкі репліки на GPU з кращою локальністю PCIe і припинили надмірне оверсубскрайбінг I/O вузла.
Урок закріпився: ніколи не припускайте, що шина «достатньо швидка». Шина часто і є продуктом.
Міні-історія №2: Оптимізація, яка відбилася боком
Дослідницька група відчайдушно хотіла покращити пропускну здатність тренування, тож вони збільшили кількість воркерів data loader, увімкнули агресивне кешування і переключилися на вищий коефіцієнт стиснення, щоб зменшити читання зі сховища. Графіки GPU виглядали краще протягом години. Усі потиснули один одному руки.
Потім вузол почав свапатися. Не трохи. Дуже. Стиснений кеш розрісся в пам’яті, page cache змагався з pinned GPU буферами, і kernel почав рекламацію. CPU‑завантаження підскочило, тоді як корисна робота впала. Час кроку тренування став шумним, потім стабільно гіршим. Завдання почали тайм-аутитися, а планувальник кластера додав ретраїв, роблячи ситуацію схожою на «випадкову нестабільність».
Виправлення було нудним: обмежити розмір кешу, припинити pin‑ування великої кількості батчів, зменшити кількість воркерів і вимірювати end‑to‑end час кроку замість «відсотка зайнятості GPU». Оптимізований pipeline оптимізував неправильну метрику.
Цей режим відмови поширений у AI‑системах: ви можете так покращити одну стадію, що оголите найгіршу поведінку наступної. Вітаємо, ви знайшли реальний вузький елемент, зробивши його злим.
Міні-історія №3: Нудна, але правильна практика, яка врятувала ситуацію
Фінтех компанія запускала GPU‑інференс для оцінки шахрайства. Нічого гламурного: суворий SLA, стабільний трафік і команда безпеки, що читає changelog‑и драйверів як казки на ніч. Вони підтримували золоті образи для кожної моделі GPU, фіксували версії драйверів і валідовували поєднання CUDA/cuDNN у staging, що збігався з продукційним обладнанням.
Одного вікенду вендор випустив термінове оновлення безпеки з підвищенням драйвера. Інша команда спробувала розгорнути його масово. Платформна команда фінтеху відмовилась, бо мала правило: жодної зміни драйвера GPU без канарки, що проганяє реальне навантаження інференсу й перевіряє і коректність, і розподіл латентності.
Канарка провалилася. Не катастрофічно — гірше. Новий драйвер вніс тонку регресію продуктивності в їхній точній суміше кернелів. Під навантаженням P99 деградувала достатньо, щоб порушити SLA. Оскільки у них були гістограми базової лінії й трафік‑реплей, вони виявили це до розгортання.
Виправлення — застосували оновлення безпеки негайно лише на вузлах без GPU, потім запланували контрольований GPU‑роллаут з міграційними заходами (буфер потужності, налаштування батчів) і відстрочили застосування повної версії драйвера. Практика не була захопливою. Вона була різницею між «тихим вікендом» і «розбором інциденту з керівництвом».
Плейбук швидкої діагностики
Якщо тренувальне завдання повільне або латентність інференсу стрибає, не починайте з обвинувань моделі GPU. Почніть з доведення, куди йде час. Ось порядок, який заощаджує години.
Перш за все: чи GPU взагалі зайняті?
- Перевірте utilization і споживання потужності.
- Перевірте, чи завдання compute‑bound або memory‑bound.
- Перевірте, чи не відбувається тротлінг (потужність/термальне).
Друге: чи pipeline даних годує звіра?
- Виміряйте швидкість читання і IOPS на шляху до датасету.
- Перевірте насичення CPU (особливо один «гарячий» ядро).
- Шукайте бурі дрібних файлів, накладні витрати декомпресії і джиттер мережевого сховища.
Третє: чи працює масштабування multi‑GPU, чи ви платите за синхронізацію?
- Перевірте топологію інтерконекту і ширину/швидкість лінків.
- Слідкуйте за помилками NCCL, ретраями або повільними collective.
- Порівняйте час кроку для кожного ранка; дисбаланс часто вказує на проблеми fabric або страгглерів.
Четверте: чи планувальник вам не брешуть?
- Підтвердіть призначення GPU, налаштування MIG і обмеження cgroup.
- Переконайтесь, що немає «невидимих сусідів» на тому ж GPU або NIC.
- Перевірте NUMA‑локальність, якщо передобробка на CPU має значення.
Короткий жарт №2: GPU ніколи не «простає»; він просто чекає, поки решта вашої архітектури наздожене.
Практичні завдання: команди, виводи, рішення
Ось перевірки, які я фактично запускаю (або прошу когось запустити), коли має значення продуктивність, ємність або стабільність. Кожна містить команду, що типовий вивід говорить і яке рішення приймати далі.
Завдання 1: Підтвердити, що GPU видимі та драйвер в порядку
cr0x@server:~$ nvidia-smi
Tue Jan 13 12:10:11 2026
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14 Driver Version: 550.54.14 CUDA Version: 12.4 |
|-----------------------------------------+----------------------+----------------------|
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA A100-SXM4-80GB On | 00000000:41:00.0 Off | 0 |
| 34% 56C P0 265W / 400W| 61234MiB / 81920MiB | 92% Default |
+-----------------------------------------+----------------------+----------------------+
Що це означає: Версії драйвера/CUDA, модель GPU, використання пам’яті, утилізація і споживання потужності. Якщо GPU‑Util низький, але пам’ять висока, можливо ви обмежені вводом або синхронізацією.
Рішення: Якщо GPU не в списку або показують помилки, зупиніться і виправте драйвери/прошивку/інтеграцію runtime контейнера перед подальшим тюнінгом.
Завдання 2: Виявити термальне або потужнісне тротлінг
cr0x@server:~$ nvidia-smi -q -d PERFORMANCE,POWER,TEMPERATURE | sed -n '1,120p'
Performance State : P0
Clocks Throttle Reasons
Idle : Not Active
Applications Clocks Setting : Not Active
SW Power Cap : Not Active
HW Slowdown : Active
HW Thermal Slowdown : Active
Power Readings
Power Draw : 395.12 W
Power Limit : 400.00 W
Temperature
GPU Current Temp : 86 C
Що це означає: «HW Thermal Slowdown: Active» каже, що GPU знищує тактові частоти. Це реальна втрата продуктивності.
Рішення: Виправте потік повітря, криву вентиляторів, температуру на вході або щільність стійки перед тим, як купувати більше GPU. Тротлінг — це оплата за апарат, який ви не можете використовувати.
Завдання 3: Перевірити NVLink‑з’єднання (якщо застосовно)
cr0x@server:~$ nvidia-smi nvlink -s
GPU 0: NVLink Status
Link 0: 25 GB/s
Link 1: 25 GB/s
GPU 1: NVLink Status
Link 0: 25 GB/s
Link 1: 25 GB/s
Що це означає: NVLink‑лінки підняті і відображають очікувану пропускну здатність.
Рішення: Якщо лінки впали, не робіть припущень про масштабування multi‑GPU; перевіряйте сидіння апаратури, прошивку або підтримку платформи.
Завдання 4: Перевірити ширину і швидкість PCIe
cr0x@server:~$ sudo lspci -s 41:00.0 -vv | egrep -i 'LnkCap|LnkSta'
LnkCap: Port #0, Speed 16GT/s, Width x16
LnkSta: Speed 16GT/s (ok), Width x16 (ok)
Що це означає: Якщо ви бачите x8 замість x16 або нижчі GT/s, ви втрачаєте смугу пропускання.
Рішення: Виправте налаштування BIOS, проблеми з riser/cable або розміщення у слотах. Неправильне узгодження PCIe — тихий вбивця продуктивності.
Завдання 5: Перевірити NUMA‑локальність GPU‑до‑CPU
cr0x@server:~$ nvidia-smi topo -m
GPU0 GPU1 CPU Affinity NUMA Affinity
GPU0 X NV2 0-31 0
GPU1 NV2 X 0-31 0
Що це означає: Афінність CPU і відображення NUMA‑нодів. Якщо передобробка важка, неправильне NUMA‑розміщення збільшує латентність і знижує пропускну здатність.
Рішення: Закріпіть CPU‑потоки і data loader‑и до NUMA‑ноду, локального до GPU, які вони годують.
Завдання 6: Шукати тиск фрагментації пам’яті GPU
cr0x@server:~$ nvidia-smi --query-compute-apps=pid,process_name,used_gpu_memory --format=csv
pid, process_name, used_gpu_memory [MiB]
23144, python, 61234 MiB
Що це означає: Підтверджує, який процес споживає пам’ять. Кілька процесів можуть фрагментувати пам’ять і викликати непередбачувані OOM.
Рішення: Якщо кілька PID несподівано ділять GPU, виправте планування/ізоляцію (Kubernetes device plugin, Slurm GRES або systemd‑розміщення).
Завдання 7: Перевірити насичення CPU і steal‑time (VM або шумні сусіди)
cr0x@server:~$ mpstat -P ALL 1 3
Linux 6.5.0 (server) 01/13/2026 _x86_64_ (64 CPU)
12:11:02 PM CPU %usr %nice %sys %iowait %irq %soft %steal %idle
12:11:03 PM all 780.0 0.0 90.0 15.0 0.0 5.0 0.0 10.0
12:11:03 PM 7 99.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0
Що це означає: Одне ядро завантажене на 99% може стати вузьким місцем (токенізація, декомпресія). Високий %steal вказує на віртуалізаційну конкуренцію.
Рішення: Паралелізуйте передобробку, обережно збільшуйте кількість воркерів або відвантажуйте передобробку. Якщо %steal високий — перемістіть на виділені хости.
Завдання 8: Перевірити пропускну здатність сховища для читання (приклад local NVMe)
cr0x@server:~$ sudo fio --name=readtest --filename=/mnt/datasets/.fio_test --rw=read --bs=1M --ioengine=libaio --direct=1 --numjobs=1 --iodepth=32 --size=4G --runtime=30 --time_based
read: IOPS=2850, BW=2850MiB/s (2988MB/s)(83.5GiB/30001msec)
Що це означає: Якщо ви тренуєтесь з локального NVMe і отримуєте лише кілька сотень MiB/s, щось не так (опції монтування, стан пристрою, файлова система).
Рішення: Якщо пропускна здатність нижча за потреби pipeline, виправте сховище або кешуйте датасети локально перед тюнінгом кернелів GPU.
Завдання 9: Перевірити мережеву пропускну здатність до джерела даних (базова санітарна перевірка)
cr0x@server:~$ iperf3 -c datahost -P 4 -t 10
[SUM] 0.00-10.00 sec 37.5 GBytes 32.2 Gbits/sec sender
[SUM] 0.00-10.00 sec 37.4 GBytes 32.1 Gbits/sec receiver
Що це означає: Підтверджує досяжну пропускну здатність. Якщо ви очікуєте 100 Gbit/sec і бачите 20–30, ви обмежені конфігурацією NIC, свічем або налаштуванням хоста.
Рішення: Виправте MTU, bonding, конфігурацію порту свічу або маршрут. Розподілене тренування не вибачає слабкі лінки.
Завдання 10: Виявити I/O wait як тихого голодуючого GPU
cr0x@server:~$ iostat -xz 1 3
avg-cpu: %user %nice %system %iowait %steal %idle
18.40 0.00 6.10 32.50 0.00 42.90
Device r/s rkB/s await %util
nvme0n1 220.0 2800000.0 14.2 96.0
Що це означає: Високий %iowait і майже 100% завантаження пристрою вказують на насичення сховища. Простою GPU часто корелює з цим.
Рішення: Додайте швидше сховище, шардуйте датасети, обережно збільшуйте паралелізм читання або заздалегідь стажуйте дані на локальні диски.
Завдання 11: Перевірити виділення GPU в Kubernetes (якщо ви використовуєте K8s)
cr0x@server:~$ kubectl describe pod infer-6c9c8d7f6f-kp2xw | sed -n '1,160p'
Limits:
nvidia.com/gpu: 1
Requests:
nvidia.com/gpu: 1
Node-Selectors: gpu=true
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m default-scheduler Successfully assigned prod/infer-... to gpu-node-12
Що це означає: Підтверджує, що pod запросив і отримав GPU, і куди він потрапив.
Рішення: Якщо pod‑и попадають на неправильні типи нод або конкурують за GPU, виправте label‑и нод, taints/tolerations і конфігурацію device plugin.
Завдання 12: Шукати скидання GPU або Xid помилки в логах
cr0x@server:~$ sudo journalctl -k -S -2h | egrep -i 'NVRM|Xid|pcie|nvlink' | tail -n 20
Jan 13 10:44:02 server kernel: NVRM: Xid (PCI:0000:41:00): 79, GPU has fallen off the bus.
Jan 13 10:44:05 server kernel: pcieport 0000:00:03.1: AER: Corrected error received: id=00e1
Що це означає: «fallen off the bus» часто вказує на проблеми з сигналізацією PCIe, прошивкою, подачею живлення або серйозні помилки драйвера.
Рішення: Перестаньте трактувати це як баг застосунку. Залучіть апаратний відділ/вендора, перевірте BIOS/прошивку, перепідсадьте карти, перевірте подачу живлення і запустіть burn‑in тести.
Завдання 13: Підтвердити persistence mode і application clocks (якщо потрібно)
cr0x@server:~$ sudo nvidia-smi -pm 1
Enabled persistence mode for GPU 00000000:41:00.0.
Що це означає: Persistence mode зменшує накладні витрати ініціалізації і може стабілізувати латентність для деяких інференс‑навантажень.
Рішення: Увімкніть для довгоживучих сервісів; для спільних інтерактивних машин оцініть вплив і політику.
Завдання 14: Перевірити hugepages / тиск пам’яті, що може шкодити RDMA і продуктивності
cr0x@server:~$ grep -E 'HugePages|MemAvailable' /proc/meminfo
MemAvailable: 18234564 kB
HugePages_Total: 0
HugePages_Free: 0
Що це означає: Низький MemAvailable означає, що ОС під тиском; hugepages можуть бути потрібні для деяких RDMA/NIC налаштувань або тюнінгу продуктивності.
Рішення: Якщо тиск пам’яті високий — зменшіть кешування, виправте ліміти контейнера або додайте RAM. Якщо RDMA потребує hugepages — налаштуйте їх явно.
Завдання 15: Підтвердити, що runtime контейнера бачить GPU
cr0x@server:~$ docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14 Driver Version: 550.54.14 CUDA Version: 12.4 |
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| 0 NVIDIA A100 On | 00000000:41:00.0 Off | 0 |
+-----------------------------------------------------------------------------+
Що це означає: Якщо це не проходить, помилки вашого додатка можуть бути сантехнічними, а не ML‑проблемою.
Рішення: Виправте NVIDIA Container Toolkit, сумісність драйвера/runtime і права cgroup/device перед тим, як звинувачувати фреймворк.
Поширені помилки: симптом → корінь → виправлення
1) «GPU utilization низький, але завдання повільне»
Симптом: GPU‑Util 10–40%, час кроку високий, CPU виглядає завантаженим або %iowait підвищений.
Корінь: Вузьке місце в input pipeline: пропускна здатність сховища, декомпресія, токенізація або contention data loader‑ів.
Виправлення: Пропрофілюйте час data loader‑а; переставте датасети на локальний NVMe; збільшіть паралелізм передобробки; перейдіть на шардені/упаковані формати; зменшіть кількість читань дрібних файлів.
2) «Мульті‑GPU масштабування гіршає після додавання нод»
Симптом: 2 GPU швидше, ніж 8 GPU; додавання нод збільшує час епохи.
Корінь: Інтерконект або накладні колективів домінують: NCCL all‑reduce насичує fabric, свічі оверсубскраібнуті, відсутня топологічна обізнаність.
Виправлення: Валідируйте пропускну здатність fabric; забезпечте правильні налаштування NCCL для вашої топології; уникайте оверсубскрайбінгу; розгляньте gradient accumulation або зміну стратегії паралелізму.
3) «OOM відбуваються рандомно, хоча розмір батчу стабільний»
Симптом: Та сама конфігурація іноді вміщується, іноді OOM через години.
Корінь: Фрагментація пам’яті, витоки тензорів, кілька процесів на одному GPU або зростання кешування.
Виправлення: Забезпечте один процес на GPU, якщо тільки ви навмисно не партиціонуєте; моніторьте пам’ять на процес; перезапускайте витікливі воркери; використовуйте налаштування алокатора і чекпоінтинг.
4) «Інференс латентність стрибає кожні кілька хвилин»
Симптом: P50 стабільний, P99 періодично стрибає.
Корінь: Фонові завдання викликають contention на PCIe/NVMe, паузи GC на CPU, kernel page reclaim або зміни тактових частот GPU.
Виправлення: Ізолюйте хости інференсу; встановіть CPU pinning; керуйте батчером; увімкніть persistence mode; приберіть шумні cron‑задачі; налаштуйте memory limits.
5) «GPU‑вузол падає або скидається під навантаженням»
Симптом: Xid‑помилки, GPU падає з шини, вузол перезавантажується, тренувальне завдання вмирає.
Корінь: Проблеми з подачею живлення, поганий riser/cable, термічний біг, нестабільна прошивка або дефектне апаратне забезпечення.
Виправлення: Шукайте логи Xid; валідируйте стабільність PCIe‑лінків; проганяйте burn‑in; оновіть BIOS/прошивку; залучіть вендора; тимчасово зменшіть power cap, щоб підтвердити підозру.
6) «Ми купили GPU, але не можемо їх розгорнути»
Симптом: Апарат прибув; розгортання заблоковане через інфраструктуру або дизайн стійки.
Корінь: Припущення щодо потужності/охолодження базувалися на епосі CPU‑стійок.
Виправлення: Плануйте бюджет потужності на стійку рано; перевіряйте PDUs, охолодження, containment і ліміти автоматичних вимикачів; моделюйте кейси відмов (наприклад, один CRAC down).
7) «Альтернативні GPU «еквівалентні», але продуктивність гірша»
Симптом: Той самий код моделі, повільніше тренування/інференс на GPU від іншого вендора.
Корінь: Різниця в зрілості кернелів/бібліотек, відсутність злитих операцій, менш оптимізований стек комунікацій або нижча ефективна пропускна здатність пам’яті для вашого навантаження.
Виправлення: Бенчмаркуйте саме ваше навантаження, а не синтетичні FLOPS. Закладіть інженерний час на портування і тюнінг або не прикидайтеся, що це plug‑and‑play.
Чеклісти / покроковий план
Чекліст A: Перед тим як купувати більше GPU
- Виміряйте duty cycle GPU: якщо utilization низький, вирішіть проблеми з подачею/IO перед масштабуванням.
- Квантифікуйте розподіл часу кроку: data loader vs forward/backward vs all‑reduce.
- Провалідуйте інтерконект: ширина/швидкість PCIe; статус NVLink; пропускна здатність fabric для multi‑node.
- Перевірте термічний запас: упевніться, що немає тротлінгу при очікуваних температурах навколишнього середовища.
- Перевірте електропостачання: бюджет стійки, ємність PDU, резервні живлення і power cap‑и.
- Підтвердіть фіксацію стеку: версії драйвера/CUDA/фреймворків, які ви можете відтворити.
Чекліст B: Перший тиждень нового GPU‑кластера (зробіть навіть якщо «тимчасово»)
- Встановіть золотий образ для кожної моделі GPU; зберігайте іммутабельні збірки.
- Запустіть burn‑in тести і моніторте Xid‑помилки та PCIe AER попередження.
- Зафіксуйте базову продуктивність: час кроку, tokens/sec, P99 латентність, споживання потужності і терміки.
- Валідуйте топологію: NUMA‑мапінг, розміщення GPU, локальність NIC і NVLink‑лінки.
- Налаштуйте спостережуваність: node exporter + DCGM‑метрики + таймінги на рівні job.
- Напишіть рукбук: що робити при падінні GPU з шини, бурі OOM або зависанні NCCL.
Чекліст C: Загартування сервісу інференсу (щоб тримати SLA)
- Визначте SLO за допомогою P99 і рівня помилок, а не середніх значень.
- Впровадьте load shedding і backpressure; уникайте нескінченних черг.
- Використовуйте явний батчинг з обмеженнями; вимірюйте вплив на хвостову латентність.
- Ізолюйте шумних сусідів: виділені ноди або суворі cgroups/квоти.
- Канарьте оновлення драйверів/runtime з реплеєм трафіку і перевірками коректності.
- Тримайте буфер потужності для деплоїв і на випадок «помер один GPU».
Чекліст D: План сховища для тренувань (бо GPU ненавидять чекати)
- Надавайте перевагу шардованим датасетам, щоб зменшити накладні витрати на метадані і читання дрібних файлів.
- Стадійте на локальний NVMe для повторних епох, коли це можливо.
- Вимірюйте IOPS і пропускну здатність під конкуренцією; бенчмарки одного клієнта брешуть.
- Слідкуйте за поведінкою кешу; встановлюйте явні ліміти, щоб уникнути хаосу page‑reclaim.
- Вирівнюйте формат даних під патерн доступу: послідовні читання перемагають; випадкові — програють.
FAQ
1) Чому ми не можемо просто використовувати CPU для всього?
Можна для деякого інференсу і менших моделей. Але для масштабного тренування і високопродуктивного інференсу GPU дають кращу пропускну здатність на ват і на долар для щільної лінійної алгебри, плюс зрілі кернелі і бібліотеки.
2) Чи нестача GPU — це лише хайп ШІ?
Ні. Хайп може роздути плани, але підґрунтя в тому, що робочі навантаження ШІ перетворюють обчислення на вимірювану бізнес‑цінність. Коли це трапляється, попит стає стратегічним і стійким.
3) Яка найважливіша технічна причина, чому GPU виграють для ШІ?
Пропускна здатність пам’яті в парі з масивним паралельним обчисленням. Багато AI‑кернелів чутливі до пропускної здатності; HBM і широкі внутрішні шляхи тримають математику насиченою.
4) Чому NVLink/NVSwitch так важливі?
Тому що розподілене тренування проводить багато часу на синхронізації параметрів і градієнтів. Швидші лінки GPU‑to‑GPU зменшують накладні на комунікацію і покращують ефективність масштабування.
5) Чому «еквівалентні» акселератори часто гірші?
Через зрілість програмного забезпечення. Fusion кернелів, бібліотеки, компілятори і стеки комунікації потребують років, щоб укріпитися. Якщо швидкий шлях фреймворку припускає одну екосистему, альтернативи можуть йти повільним шляхом.
6) Що я маю моніторити на GPU‑вузлах у продакшені?
Щонайменше: GPU utilization, використання пам’яті, споживання потужності, температура, причини тротлінгу, ECC/Xid помилки, стан PCIe‑лінку і таймінги кроків або гістограми латентності на рівні job.
7) Як визначити, чи ви compute‑bound або input‑bound?
Якщо utilization і споживання потужності GPU низькі, а CPU/iowait високі — ви, найімовірніше, input‑bound. Якщо GPU завантажені і час кроку стабільний — ви більше compute‑bound. Підтвердіть часовими вимірюваннями всередині job.
8) Чому латентність інференсу стрибає, навіть коли середня utilization GPU низька?
Хвостова латентність чутлива до очікувань у чергах, поведінки батчера, пауз на CPU, page reclaim і конкуренції на PCIe/NVMe. Майже проста GPU не гарантує послідовних відповідей.
9) Який найбезпечніший спосіб оновлювати драйвер GPU?
Канарка на ідентичному обладнанні з реплеєм трафіку. Перевірте коректність і розподіл латентності. Потім розгортайте поступово з буфером ємності. Ставтеся до драйверів як до оновлень ядра: потужні, ризиковані і не для п’ятниці ввечері.
10) Який найшвидший спосіб витрачати гроші на GPU?
Купити їх до того, як ви перевірили живлення, охолодження, пропускну здатність сховища, мережевий fabric і здатність підтримувати стабільний програмний стек. Апарат надійде вчасно; ваша готовність — ні.
Наступні кроки, які можна зробити цього тижня
Якщо ви відповідаєте за надійність систем з GPU або за план закупівель, що не має розвалитися — зробіть ці кроки. Вони практичні і дають результат.
- Збережіть базову лінію реального навантаження на вашому поточному обладнанні: час кроку, tokens/sec, P95/P99 латентність, споживання потужності, терміки.
- Пропустіть плейбук швидкої діагностики для одного повільного завдання і одного «здорового». Запишіть, чим вони відрізняються.
- Доведіть, що ваш шлях даних може годувати GPU: пропускну здатність сховища і здатність передобробки CPU під конкуренцією.
- Змепіть топологію (PCIe, NUMA, NVLink) і задокументуйте її. Потім закріпіть робочі навантаження умисно.
- Складіть мінімальний runbook GPU: що робити при Xid‑помилках, бурях OOM, зависаннях NCCL і термічному тротлінгу.
- Припиніть купувати за FLOPS. Купуйте за end‑to‑end пропускною здатністю для вашого навантаження і за операційною вартістю підтримки стабільності.
Ринок GPU не зламався тому, що всі раптом стали ірраціональними. Він зламався тому, що навантаження ШІ раціонально ненажерливі, і найшвидший шлях їх поставити — був GPU‑форми протягом років. Ставтеся до GPU як до виробничої залежності, а не до розкоші. Побудуйте нудні системи навколо них: живлення, охолодження, сховище, планування і контроль змін. Ось як ви перетворите дефіцит у передбачуваний результат.