Latest / M365.FM – подкаст про Microsoft 365, Copilot і ШІ українською / Повільний інференс на GPU: відкат на CPU, конфлікти версій CUDA/TensorRT і помилки контейнерів (ШІ-дубляж)
Transcript
- 0:00Все почалося з попередження, а потім настала тиша.
- 0:02Рахунок за GPU зростав так, ніби прискорювач ніколи не спав,
- 0:05проте вихідні дані повзли, ніби світло вимкнули.
- 0:07Дашборди були зеленими, а клієнти – ні.
- 0:09Ця аномалія не вкладалася в логіку.
- 0:12Майже нульове завантаження GPU при стрибках затримки.
- 0:15Жодних сповіщень, жодних червоних ліній просто час випаровувався.
- 0:18Докази вказують на єдину патологію, яка маскується під норму.
- 0:22Ось наша обіцянка.
- 0:23Ми відстежимо артефакти, назвемо «Винуватця» та виправимо патологію.
- 0:27Ми розглянемо три режими збоїв, відкат до CPU,
- 0:29невідповідність версій CUDA та ONNX Stensort,
- 0:32а також помилки конфігурації контейнерів,
- 0:34і доведемо це показниками затримки, пропускної здатності
- 0:37та використання GPU до і після.
- 0:38Підготовка кейсу, середовище та профіль жертви.
- 0:41Кожна конфігурація розповідає свою історію,
- 0:43і ця починається зі звичайного орендаря під навантаженням.
- 0:46Робоче навантаження – це дифузія тексту в зображення,
- 0:48варіанти Stable Diffusion, що працюють з роздільною здатністю 512 на 512
- 0:51і з масштабуванням до 1024 на 1024.
- 0:53Трафік має сплесковий характер.
- 0:55Паралельність становить від 8 до 32 запитів.
- 0:58Розміри пакетів варіюються від 1 до 8.
- 1:00Рівні обслуговування суворо ставляться до затримок у хвості.
- 1:02Порушення P95 прямо конвертуються у штрафи та зменшення кредитів.
- 1:06Моделі не екзотичні, але вибір має значення.
- 1:08Конвейери Stable Diffusion експортовані в ONNX,
- 1:11оптимізації перехресної уваги, такі як сформерс або масштабована точкова увага,
- 1:14та вибір плановальників, що обмінюють кроки на якість.
- 1:17Екосистема має прискорюватися, якщо інфраструктура працює чесно.
- 1:20Апарат незабезпечення на папері виглядає гідно.
- 1:23Карти Nvidia RTX та серії A у хмарі від 16 до 32 гігабайтів VRM.
- 1:27PCI-E стоїть між хостом і пристроєм як пункт оплати.
- 1:30Достатньо швидкий при налаштуванні, але карає,
- 1:32коли операції введення-виведення переходять на сторінкові передачі.
- 1:34У цьому середовищі нічого не є випадковим.
- 1:36Інструментарій складається зі знайомих рівнів.
- 1:38PyTouch використовується для експорту, а потім ONNX, Runtime або Tensort бере на себе висновок.
- 1:42Драйвери CUDA знаходяться в основі всього.
- 1:45Ядра уваги обіцяють швидкість, якщо версії збігаються.
- 1:48Розгортання суворо контейнеризоване, незмінні образи,
- 1:51CI-керовані релізи, блогрін за політикою.
- 1:53Це обмеження має створювати безпеку.
- 1:55Воно також може законсервувати дефекти.
- 1:58Бізнес-ризики не є абстрактними.
- 1:59Вартість одного запиту визначає маржу.
- 2:01Резервування GPU оплачується погодинно, незалежно від того, чи працюють ядра.
- 2:05Коли затримка зростає з секунд до пів хвилини, пропускна здатність колапсує.
- 2:08Одна помилка в конфігурації перетворює прискорювач на обігрівач,
- 2:11дорогий, тихий і зайнятий чим завгодно, крім допомоги черзі.
- 2:14При детальнішому розгляді профіль жертви звужується.
- 2:17Паралельність 16, пакети по 2, щоб залишатися під лімітами VRM на 512 з кроком до 1024 для якості.
- 2:24Орендар очікує стабільного показника P95.
- 2:27Натомість трасування показує хаотичні затримки, великі дельти між P50 і P95,
- 2:32а також коливання циклу роботи GPU від 5% до 40% без очевидної причини.
- 2:36Графіки CPU свідчать про інше.
- 2:38Ядра завантажені наповну, хоча попередньої обробки немає.
- 2:41Докази вказують на три можливі шляхи.
- 2:43По-перше, перемикання на CPU.
- 2:45Коли провайдер виконання CUDA або Tensor не завантажується,
- 2:48рушій тихо обирає графік CPU.
- 2:50Модель працює, але із затримкою у 10-30 разів.
- 2:53По-друге, невідповідність версій.
- 2:55ONNX Runtime скомпілювано під одну версію CUDA,
- 2:57вузли працюють на іншій, рушій і Tensor стають недійсними
- 3:00і перебудовуються з універсальними ядрами.
- 3:02Завантаження відображається, але швидкі шляхи втрачені.
- 3:05По-третє, помилки конфігурації контейнерів, перевантажені образи,
- 3:09відсутні підключення GPU, невірні налаштування NVIDIA Toolkit
- 3:12та виділення пам'яті, що збільшують затримку під навантаженням.
- 3:15Зрештою, це не таємниця моделей.
- 3:17Це справа про достовірність інфраструктури.
- 3:20Ми відстежимо артефакти, порядок провайдерів,
- 3:22логи можливостей, підключення пристроїв
- 3:24і зіставимо їх із трьома показниками,
- 3:26затримка, пропускна здатність та використання GPU.
- 3:29Все почалося із запиту, який мав тривати секунди, але не тривав.
- 3:38Показник GPU мовчав занадто тихо.
- 3:41Графік CPU тим часом злетів, як пожежна тривога.
- 3:43Після детальнішого аналізу стало зрозуміло, Рушій зробив вибір.
- 3:46Він виконав завдання, розраховане на GPU за допомогою CPU.
- 3:48Жодних сповіщень не надійшло.
- 3:50Результат, зрештою, повернувся.
- 3:51Це і є тихий саботажник, перемикання на CPU.
- 3:54Чому це важливо? Просто пояснити.
- 3:55Stable Diffusion на CPU – це марна трата часу.
- 3:58Модель працює, але затримка зростає, у 10-30 разів повільніше, а пропускна здатність падає.
- 4:03У середовищі, де цінуються мілісекунди, такий розрив фатальний.
- 4:06Рахунок продовжує відображати час GPU, хоча пристрій не виконує роботу.
- 4:09Хронологія виявила закономірність.
- 4:10Контейнери, що запускалися локально з CUDA, працювали миттєво.
- 4:13Розгорнуті на вузлі кластера з дещо іншим стеком драйверів,
- 4:16ті самі контейнери завантажувалися, проходили перевірку справності, а потім деградували.
- 4:19Ендпоінт справності перевіряв лише одне, чи працює сервер,
- 4:22тож він ніколи не перевіряв, чи насправді виконує роботу GPU.
- 4:25У цьому середовищі нічого не буває випадково.
- 4:27Тиша – це теж артефакт.
- 4:29Ключовий артефакт – це порядок провайдерів виконання в ONNX Runtime.
- 4:33Рушій приймає список «спробувати Тенсорт», потім CUDA, потім CPU.
- 4:37Якщо CUDA не ініціалізується через невірний драйвер, відсутні бібліотеки
- 4:41чи непідключений пристрій, ОАРТі тихо переключиться на провайдер виконання CPU.
- 4:44Жодних виключень, жодних збоїв, лише рядок у логах, часто десь глибоко внизу.
- 4:48Провайдер виконання CUDA недоступний – перемикання на CPU.
- 4:51Цей рядок – зізнання, яке більшість команд ніколи не читають.
- 4:54Ось найдивніше.
- 4:55Графіки використання на перший погляд виглядають оманливо нормально.
- 4:58Запити все одно завершуються.
- 5:00Карта сервісів зелена, але робочий цикл GPU ледь сягає 5%,
- 5:03тоді як навантаження на CPU стрімко зростає.
- 5:06P50 затримка зростає вчетверо, а P95 стає непередбачуваною.
- 5:09Сплески трафіку лише погіршують ситуацію.
- 5:11Черги ростуть, а автоскейлер додає нові репліки, які успадковують той самий дефект.
- 5:15Це схоже на естафету, де спринтер не вийшов на старт, і його етап біжить бібліотекар.
- 5:19Естафетна паличка рухається, але зовсім не зі швидкістю бігуна.
- 5:21Іншими словами, система видає правильний результат ціною всього бюджету СЛО.
- 5:25Під час відстеження послідовності завантаження артефакти накопичуються дуже швидко.
- 5:28Логи завантаження провайдерів показують спроби ініціалізації CUDA з перевіркою версії драйвера.
- 5:33Якщо контейнер зібрано під CUDA 12, 2, а на вузлі лише 12, ініціалізація не вдається.
- 5:39Якщо Nvidia-контейна Toolkit не налаштовано, точка монтування пристрою не з'являється в контейнері.
- 5:44Немає, де в Nvidia, немає ліпкуда.
- 5:46Отже, якщо специфікація пода не запитує GPU явно, планувальник ніколи не призначить пристрій.
- 5:52Будь-яка з цих причин призводить до прихованої деградації продуктивності.
- 5:55Відтворити цю проблему досить легко.
- 5:57На неправильно налаштованому вузлі простий інференс показує CPU-Execution Provider там,
- 6:03де очікується TENSO-RT або CUDA-Execution Provider.
- 6:07Відправте запит, GPU залишається бездіяльним.
- 6:10CPU потоки стрибають, зображення генерується за 20-40 секунд замість від 2 до 6.
- 6:15Повторіть те саме на вузлі з правильними драйверами, запит виконується миттєво,
- 6:19а завантаження GPU стабільно зростає.
- 6:22Докази свідчать, що поточні механізми захисту є лише пролюдське око.
- 6:25Зонди стану Health Probes повертають 200, бо сервер відповідає.
- 6:28Немає перевірки при запуску, чи працює GPU-шлях.
- 6:31Перевірок продуктивності не існує, тому оркестратор вважає репліки справними.
- 6:34Система не бачить різниці між прискоренням і емуляцією.
- 6:37Контрзахід має бути радикальним за задумом.
- 6:40Повна відмова, якщо GPU-Execution Provider відсутній або працює з помилками.
- 6:44Заборона запуску на CPU в продуктовому середовищі.
- 6:47При запуску процесу перерахуйте провайдери, переконайтеся, що TENSO-RT або CUDA завантажені та кількість пристроїв відповідає очікуванням.
- 6:54Залогуйте набір можливостей QDNN, доступні тензорні ядра, ліміти пам'яті і завершуйте роботу з помилкою, якщо чогось не вистачає.
- 7:01Жертвуйте доступністю заради цілісності, дозвольте оркестраторам перезапустити поднасправному вузлі.
- 7:05Щоб це працювало надійно, запровадьте перевірку прив'язки вводу-виводу IO-байндинг.
- 7:08Прив'язуйте вхідні та вихідні дані до пам'яті пристрою та перевіряйте простий інференс під час старту.
- 7:13Один прогрівочний прогін, що задіює ядро Fused Attention.
- 7:16Якщо час виконання перевищує ліміт затримки, вважайте шлях деградованим і вбивайте POD.
- 7:20Додайте набір тестових запитів Canary з детермінованими зернами SIDS.
- 7:23Порівнюйте затримку з базовим вікном продуктивності.
- 7:26Якщо відхилення перевищує допуск, сповіщайте команду та зупиняйте розгортання.
- 7:29Це може здатися жорстким, але альтернатива значно гірша.
- 7:32Кластер, що працює, втрачаючи час і бюджет.
- 7:35Зафіксуйте порядок провайдерів, відхиліть резервний CPU і змусте систему довести свою швидкість, перш ніж вважати її робочою.
- 7:41Тільки тоді зелений означатиме прискорення.
- 7:43Файл доказів B, невідповідність версій, несумісність CUDA, ONNX та Tensor.
- 7:49Якщо GPU не використовувався, наступне питання, чи міг він працювати на повній швидкості, навіть якщо він присутній.
- 7:54Дані вказують на більш тонкий збій.
- 7:56Версії збігаються достатньо для запуску, але недостатньо для відкриття швидкого шляху.
- 8:00Система виглядає прискореною, доки не подивишся на таймінги.
- 8:03Чому це важливо? Очевидно.
- 8:04Дифузіні конвоїри живуть або вмирають, залежно від продуктивності механізму Attention.
- 8:08Коли ONNX, Runtime і Tensor не можуть завантажити очікувані ними ядра через невідповідність версій CUDA, CAN або Tensor, вони тихо переходять на загальні реалізації.
- 8:17Модель працює.
- 8:18Використання коливається від 30 до 50%, а затримка виходить за межі бюджету.
- 8:23Збірка виглядає так само, робота виконується повільніше.
- 8:26При детальнішому огляді артефакти стають точними.
- 8:29Логи завантаження провайдерів повідомляють про успіх з підказкою.
- 8:32Перехід на ядра за замовчуванням або вимкнення з формерс.
- 8:36Ви побачите, що десеріалізація плану Tensor не вдається через несумісність перебудови рушія, що ініціює компіляцію на вузлі.
- 8:42Рушії, створені на одній мінорній версії Tensor, не десеріалізуються на іншій.
- 8:46Перебудова завершується, але отриманий план може не містити Fused Attention або оптимізації FP16.
- 8:51Гонка завершується.
- 8:52Без сплесків робочі цикли тензорних ядер залишаються приглушеними.
- 8:56Ось найменш очевидна частина.
- 8:57Команди трактують те, що воно працює як оптимальний стан.
- 9:00У цьому середовищі нічого не є випадковим.
- 9:03Якщо скейлд нижнє підкреслення Product Attention не активний, якщо сформерс вимкнено,
- 9:06якщо кан повідомляє про обмежений робочий простір, продуктивність ввічливо падає.
- 9:10Простими словами, невідповідні бінарні файли змушують використовувати ядра,
- 9:13які потребують більше переміщень пам'яті та меншої щільності обчислень.
- 9:16Псі стає помітним у трасуванні.
- 9:18Хвостові затримки зростають разом із паралелізмом.
- 9:20Уявіть стек як набір замків.
- 9:22Driver, CUDA Toolkit, CAN, пропорції збірки ONNX, Runtime та Tensor.
- 9:28Один зубець не на місці, і ключ повертається лише наполовину.
- 9:31OART рекламує граф можливостей для кожного виконавчого провайдера.
- 9:34Якщо скомпільований OART очікує CUDA, 12, 2, а драйвер вузла надає 12, 1.
- 9:39CUDA завантажується з обмеженими функціями або не завантажується зовсім.
- 9:43Якщо на вузлі Tensor 8, 6, а плани були згенеровані на 8, 4,
- 9:46десеріалізація не вдається і перезапускається з консервативною тактикою.
- 9:50Система тихо віддає перевагу коректності над швидкістю.
- 9:53Бенчмарки доводять втрати на практиці.
- 9:55З активними сформерс або SDPD фузійний attention помітно скорочує час виконання.
- 9:59Дослідження послідовно показують прискорення від 2 до 5 разів у шляху attention залежно від роздільної здатності та розміру пакету.
- 10:05Вимкніть їх через невідповідність версій і ви втратите ці множники.
- 10:09Об'єднання токенів TOME додається до цих прискорень.
- 10:12Без фьюзд ядер перевага обмежується пропускною здатністю пам'яті та неоптимізованими макетами.
- 10:17Розрив збільшується при роздільній здатності 1024 на 1024 та вищій паралельності.
- 10:21Щоб відстежити артефакти, почніть із переліку можливостей.
- 10:24Під час запуску виведіть точний список провайдерів та їхні заявлені функції.
- 10:28Версія Tensor, доступність FP16 та INT8, максимальний робочий простір, евристика згортки CAN, наявність NCCL для мульти-GPU.
- 10:38Для ONNX Runtime виведіть пріоритети IP.
- 10:41Tensor, CUDA, потім CPU.
- 10:43Перевірте, що саме прив'язується до вузлів вашого графа.
- 10:46Зареєструйте, чи призначаються вузли уваги Attention Tensor з об'єднаними ядрами чи загальним ядрам CUDA.
- 10:52Далі дослідіть середовище.
- 10:54Опитайте драйвер.
- 10:55NVIDIA SMI показує модуль ядра та сумісність CUDA.
- 10:58Считайте версії бібліотек у контейнері.
- 11:00LípCuda, LípCablas, LípCAN, Linwinfer.
- 11:03Якщо образ містить бібліотеки CUDA 12, 3, а драйвер госта підтримує лише 12, 2, режим сумісності може завантажитися з обмеженнями.
- 11:11Якщо образ очікує заголовки Tensor 8, 6, а вузол надає 8, 4, виклики ARRI погіршаться або анулюють певні оптимізації.
- 11:18Рішенням є матриця збірки, а не сподівання.
- 11:21Зафіксуйте точні версії в єдиному джерелі істини.
- 11:24Базовий образ із сумісністю драйверів, мінорною версією CUDA, CAN, хешем збірки OART та версією Tensor.
- 11:30Створюйте образи для виведення відповідно до цієї матриці та відхиляйте вузли, що не збігаються, через мітки вузлів та перевірки допуску.
- 11:36Попередньо створюйте та кешуйте рушії Tensor для кожного варіанта моделі та роздільної здатності на тій самій версії Tensor, яку ви розгортаєте.
- 11:41Ставтеся до файлів плану як до артефактів, прив'язаних до матриці.
- 11:44Ніколи не покладайтеся на створення рушія на вузлі у продуктивному середовищі.
- 11:47Це маскує відхилення та подовжує час холодного старту.
- 11:50Щоб закріпити результат, додайте CI-тести, що перевіряють можливості ядер.
- 11:54Запустіть контейнер в ізольованому середовищі з цільовим драйвером і перевірте,
- 11:57чи завантажує Tensor ядра FP16, чи об'єднані вузли уваги, чи активна прив'язка I.O., чи розпізнані сформерс або SDP.
- 12:05Запустіть детермінований набір підказок і скасуйте збірку, якщо затримка перевищує базовий рівень або логи містять повідомлення про відкат до інших методів.
- 12:13Зберігайте знімок можливостей разом із дайджестом образу, щоб відкати відновлювали як код, так і характеристики продуктивності.
- 12:19Зрештою, докази свідчать, що відхилення версій – це не баг, як бачите.
- 12:22Це ціна, яку ви платите швидкістю.
- 12:27Ерозія ефективності через неправильну конфігурацію закладена в проєкті.
- 12:33Навіть коли версії збігаються, контейнер може саботувати ефективність всередини.
- 12:37Докази вказують на повільний витік, роздутість образу, відсутність GPU-інфраструктури та поведінку алукатора, що спотворює затримку під навантаженням.
- 12:44Ніщо не падає, все деградує.
- 12:47Чому це важливо? Просто.
- 12:49Контейнери формують реальність середовища виконання.
- 12:51Якщо образ заважкий, а холодні старти довгі, репліки запізнюються на інцидент.
- 12:56Якщо пристрої GPU не змонтовані або середовищу, виконання бракує правильних прапорів, провайдери виконання поводяться неправильно.
- 13:01Якщо арени пам'яті накопичують виділення, це через активність ARM викликає підкачування та стрибки затримки.
- 13:06Модель виглядає нормально.
- 13:08Контейнер тихо обтяжує кожен запит.
- 13:10При детальнішому розгляді виявляється накопичення артефактів під час збірки.
- 13:14Образи перевищують 2 ГБ через компілятори, заголовки та тестові ресурси через відсутність багатоетапної збірки.
- 13:19Відсутній докерігнор залучає ноутбуки, кеші та експериментальні ваги у виробничі шари.
- 13:24Кожне розгортання завантажує гігабайти через мережу.
- 13:27Маштабуйте це на пули вузлів, і холодний старт стає правилом, а не винятком.
- 13:31Докази не є загадковими.
- 13:33Історія Дока розповідає цю історію по шарах.
- 13:35Середовище виконання виявляє другий рівень ерозії.
- 13:38Без явних прапорів GPU, без GPU в Дока або через відсутність конфігурації плагіна пристрою в Кубанітаз,
- 13:44Процес не бачить пристроїв NVIDIA.
- 13:47Помилки конфігурації NVIDIA-контейна Toolkit приховують ліпкуда.
- 13:51Отже, друзі, провайдер виконання завантажується з обмеженнями або не завантажується взагалі.
- 13:55MIG не застосовується, тому навантаження борються за фрагменти пам'яті, створюючи втрати, які планувальники не розуміють.
- 14:00Журнали залишаються ввічливими, продуктивність згасає.
- 14:02Поведінка пам'яті – це третій рівень.
- 14:04За замовчуванням арена пам'яті CUDA в ONNX, рантайм агресивно кешує виділення.
- 14:14Тому передача між хостом і пристроєм відбувається через підкачувані буфери, перетворюючи PCI і на вузьке місце.
- 14:20Відвивід не прив'язаний до пристрою, тому тензори стрибають між CPU та GPU, створюючи невидимі податки на затримку.
- 14:25Спочатку погіршується хвостова поведінка, а потім середня.
- 14:28Ось як виглядає цей набір симптомів у реальних умовах.
- 14:31Ефективна пропускна здатність відстає, попри помірне використання GPU.
- 14:34Затримка при легкому навантаженні прийнятна, але P95 коливається при конкурентності, а потім непередбачувано стрибає.
- 14:40Випадкові OOM Kill скидають репліки при піковому трафіку, створюючи ефект стада.
- 14:44Перезапуски стають каскадними, автоскалювання працює нестабільно, а черги накопичуються.
- 14:47Оператори шукають не ту причину, вважаючи модель важкою, тоді як політики контейнерів спричиняють колапс.
- 14:52Ставтеся до гігієни контейнерів, як до роботи з доказами.
- 14:54Багатоетапні збірки видаляють відбитки пальців.
- 14:56Компілятори та інструменти розробки ніколи не потрапляють у середовище виконання.
- 14:59D-Strelless або Slim базовий образ звужує поверхню атаки та скорочує час завантаження.
- 15:03Аудити Doka Slim або Dive підтверджують, що вижило після збірки.
- 15:06Doka Rignor запобігає випадковому накопиченню зайвого.
- 15:09Результатом є судова чистота.
- 15:10Працює лише те, що має працювати.
- 15:13Налаштування GPU потребують явних вказівок.
- 15:15У Doka оголошуйте всі GPU або точний фрагмент MIG.
- 15:19У Kubanitas запитуйте ресурси NVIDIA GPU і переконайтеся, що плагін пристрою відповідає вашій гілці драйверів.
- 15:25Під час запуску перевіряйте наявність пристрою та сумісність драйверів.
- 15:28NVIDIA SME та LDConfig – це не прикраси, а перевірки допуску.
- 15:31Якщо щось відсутнє або не збігається, запишіть це як порушення та завершіть роботу.
- 15:35Потім налаштувайте ONNX Runtime та Tensor цілеспрямовано.
- 15:38Заблокуйте порядок провайдерів виконання лише на шляхах GPU у виробничому середовищі.
- 15:45Під час запитуйте, що перевищують робочий набір.
- 15:47Обмежте зростання або встановіть попереднє виділення в передбачуваних межах.
- 15:50Увімкніть АВП-16 за замовчуванням, якщо це дозволяють обмеження точності.
- 15:54Захистіть INT вісьмома тестом на точність.
- 15:57Прив'яжіть введення-виведення до пам'яті пристрою, щоб дані потрапляли туди, де відбувається обчислення,
- 16:01та ретельно оберейте потоки, щоб запобігти блокуванню черги.
- 16:03Закріпіть це двома перевірками – працездатність та продуктивність.
- 16:06Працездатність – це не просто статус 200, це підтверджений знімок можливостей.
- 16:10Провайдери завантажені, об'єднані ядра присутні, тензорні ядра розпізнані, введення-виведення обмежене.
- 16:15Продуктивність – це базовий набір запитів, що виконується під час запуску з вікном затримки та мінімальним порогом використання.
- 16:20Якщо контейнер не відповідає обом вимогам, він не допускається до обслуговування.
- 16:24Встановіть бюджети розміру образу для CI, щоб збірки, які перевищують ліміти, завершувалися помилкою.
- 16:28Зберігайте різницю вмісту образів для кожного дайджесту, щоб відкати відновлювали код та гігієну системи.
- 16:33Дані свідчать, що контейнери не просто розгортають ПЕЗЕ, вони кодують поведінку під навантаженням.
- 16:38Коли вони шумні, важкі або невизначені щодо GPU, вони перетворюють прискорення на формальність.
- 16:43Коли вони легкі, чіткі та впевнені, вони зберігають швидкий шлях, за який ви заплатили.
- 16:46У цьому середовищі нічого не буває випадковим.
- 16:48Контейнер або допомагає GPU виконувати роботу, або заважає йому.
- 16:51Лабораторія криміналістики, метрики, що виносять вирок.
- 16:54Затримка, пропускна здатність, рівень використання.
- 16:57Докази важливіші задумки, тому ми фіксуємо набір запитів, блокуємо сіди та прогріваємо систему.
- 17:01Ті самі планувальники, ті самі кроки.
- 17:032025 для 512 розширено до 50 для 1024 на 1024, щоб виявити навантаження.
- 17:09Паралельність утримується на рівні 16 і з перевіркою до 32.
- 17:12Розмір пакета починається з одиниці й обережно зростає, доки не впреця у межі ВІРМ.
- 17:16Жодної екстраполяції, жодних виправдань, лише годинники та лічильники.
- 17:20Затримка свідчить першою.
- 17:21У деградованому стані при використанні CPU або стандартного шляху Attention P50 для 512 на 512 розтягується до двозначних чисел.
- 17:28P95 розповідає справжню історію.
- 17:30Він непередбачувано коливається від 20 до 40 секунд, бо черги накопичують дрібні неефективності.
- 17:35При 1024 на 1024 з 50-ма кроками P95 одразу стає критичним порушенням.
- 17:41Після виправлення DPUP заблоковано, Fused Attention активовано, I.O. прив'язано до пристрою, P50 повертається до низьких значень, а P95 вкладається в бюджет.
- 17:50Діапазон звужується, система стає передбачуваною.
- 17:53Пропускна здатність це підтверджує.
- 17:55При паралельності 16 деградований шлях дає лише краплю.
- 17:58Кількість зображень за хвилину ледь зростає при додаванні реплік, бо кожен екземпляр гальмує сам себе.
- 18:02Масштабування до 32-х множить суперечки, а не продуктивність.
- 18:05Після виправлення залежність вирівнюється.
- 18:07Зображення за хвилину зростають майже лінійно, поки не насититься робочий цикл тензорних ядер або VRM не обмежить пакет.
- 18:13Різниця в нахилі графіка – це і є вирок.
- 18:15Робота справді швидше доходить до фінішу, а не просто створює більше шуму.
- 18:18Використання закриває справу.
- 18:20До цього робочий цикл DPU коливався від 0 до 50% з довгими пласкими провалами.
- 18:25Лічильники ПСІ показують затримки від передачі даних зі сторінкових пам'ятій.
- 18:29Після робочий цикл стабілізується у високому послідовному діапазоні з помітним навантаженням тензорних ядер.
- 18:35CPU повертається до оркестрації та легкої попередньої обробки.
- 18:39Піки ПСІ стискаються, оскільки закріплена пам'ять та прив'язка вводу-виводу усунули зайвий трафік.
- 18:44Ніщо інше, крім реального прискорення, не пояснює ці зміни.
- 18:47Ми додаємо стресову перевірку.
- 18:48При 512 на 512 кроках 2025 оптимізований шлях підтримує паралелізм 16 безхвостових піків.
- 18:54При підвищенні до 32 система поступово деградує.
- 18:56Пі-95 зростає передбачувано, а не хаотично.
- 18:59При 1024 на 1024 на 50 кроках різниця стає ще відчутнішою.
- 19:04Деградований шлях зривається у таймаути.
- 19:07Загартований шлях утримує прийнятні Пі-50 та Пі-95 з пакетом від 1 до 2 до межі VRM.
- 19:12Ось де арени та потоки мають значення.
- 19:15Після налаштування блокування на початку черги зменшується.
- 19:17З точки зору витрат це проста арифметика.
- 19:19Запитів на годину GPU стає у від 2 до 5 разів більше, коли перевірено Fused Attention FP16 та прив'язку вводу-виводу.
- 19:25Ефективна вартість тисячі зображень відповідно падає.
- 19:28Штрафи за холодний старт зменшуються, бо образи компактні, а двигуни попередньо зібрані.
- 19:32Вузли перестають платити податок на компіляцію при першому зверненні.
- 19:35Реєстр збігається з логами.
- 19:37Верифікація запобігає випадковим успіхам.
- 19:39Повторіть на другому пулі вузлів з іншою мінорною версією драйвера.
- 19:42Загартований образ за задумом відмовляється запускатися на невідповідному вузлі.
- 19:46Тому результати порівнянні, а не спотворені.
- 19:49Перехресно перевіряйте знімки можливостей.
- 19:51Той самий порядок провайдерів, той самий тенсорт, ті самі твердження ядра.
- 19:55Повторно запустіть набір запитів і знову зафіксуйте розподіли.
- 19:58Коли гістограми збігаються, впевненість зростає.
- 20:00Коли ні, різниця в можливостях пояснює причину.
- 20:03Зрештою, цифри не сперечаються, вони доводять.
- 20:05Затримка стискається, пропускна здатність зростає, використання стабілізується.
- 20:09Патологія не є гіпотетичною.
- 20:11Вона вимірювана і після виправлення залишає відбитки на кожному графіку.
- 20:14Протокол виправлення – це контрольний список для повторюваного гартування.
- 20:18Контроль доступу на першому місці.
- 20:20Відмовляти в запуску, якщо відсутні провайдери Тенсорт або CUDA.
- 20:24Перераховуйте провайдери, перевіряйте кількість пристроїв,
- 20:26виведьте знімки можливостей CAN, FP16, робочий простір INT8.
- 20:31Якщо чогось не вистачає, завершуйте роботу з кодом помилки.
- 20:33Доступність слідує за цілісністю.
- 20:35Закріплення версій – це основа.
- 20:37Підтримуйте єдину матрицю, гілка драйвера, CUDA, CAN, хеш збірки ONNX, Runtime, Тенсорт.
- 20:42Збирайте образи для виведення відповідно до цієї матриці.
- 20:45Позначайте вузли для відповідності.
- 20:46Обмежуйте доступ на основі рівності.
- 20:48Попередньо зібрані двигуни Тенсорт для кожної моделі та роздільної здатності.
- 20:51Плани – це артефакти, а не припущення під час виконання.
- 20:54Гігієна контейнерів зберігає істину.
- 20:56Використовуйте багатоетапні збірки.
- 20:58Тримайте рантайм бездистрибутива або максимально легким.
- 21:00Включайте суворий докерігнор.
- 21:01Перевіряйте через докахістарі та аудит оптимізації розміру.
- 21:04Встановлюйте бюджети розміру пулу в CI.
- 21:06Блокуйте роздуті образи, підписуйте образи та звіряйте вміст за дайджестом.
- 21:10Налаштуйте GPU першочергово, зафіксуйте порядок IP на Тенсорт CUDA,
- 21:14вимкніть CPU провайдер у продуктиві.
- 21:16Підтвердьте наявність NVIDIA DEV та версію NVIDIA Container Toolkit.
- 21:19Запитуйте gpugvidea.com явно або змішуйте ліцензії та перевіряйте під час запуску.
- 21:24Налаштуйте середовище виконання.
- 21:25Увімкніть HP 16 за замовчуванням.
- 21:28Обмежте INT вісьмома перевірками точності.
- 21:30Прив'яжіть I.O. безпосередньо до пам'яті пристрою, увімкніть закріплену пам'ять, обирайте потоки, щоб уникнути черг.
- 21:37Переналаштуйте або вимкніть ORTC UDA Arena, якщо вона зупиняється за межами робочого набору.
- 21:41Встановіть ASL у продуктивності як код, самотестування при запуску з детермінованими підказками, вікном затримки та мінімальним використанням.
- 21:47Викликайте помилку при зростанні черг.
- 21:49Додайте спостережуваність метрики GPU на запит, сповіщення про деградацію, канейрі запити та порівнювані базові лінії.
- 21:55Розгортайте за модельлю Blue Green з контрольними точками продуктивності та автоматичним відкатом при порушенні.
- 22:00Коли протокол дотримується, прискорення є доведеним, а не передбачуваним.
- 22:04Урок цілком клінічний.
- 22:06Прихований перехід на CPU, розбіжність версій та роздуті контейнери – це не баги.
- 22:10Це передбачувані патерни збоїв, які ви можете заблокувати.
- 22:12Виконуйте протокол, вимірюйте утилізацію GPU, відмовляйтеся від деградованих шляхів, фіксуйте версії, ставтеся до двигунів, як до артефактів.
- 22:18Якщо ви хочете глибше зануритися в ONNX Runtime, роботу з пам'яттю TensorT, коли вимикати арени, дивіться наступний кейс у цій серії та підписуйтесь на лабораторні нотатки.