Головна / Статті / Оптимізація інференсу LLM: попереднє заповнення, декодування та корпоративні LLMOps

Оптимізація інференсу LLM: попереднє заповнення, декодування та корпоративні LLMOps

Проблеми заповнення попередніми даними та декодування, безперервне групування даних, FlashAttention, квантація, PagedAttention, спекулятивне декодування, часткове заповнення попередніми даними та роз’єднане надання послуг.

1809 слів

Розробка високопродуктивних та економічно ефективних систем обробки LLM полягає у врахуванні реальних обмежень апаратного забезпечення, а не у простому обгортанні API з надією, що GPU будуть постійно зайняті.

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

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

1. Два етапи, два вузькі місця

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

Попереднє заповнення (зазвичай залежить від обчислювальних можливостей)

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

Декодування (зазвичай залежить від пропускної здатності пам’яті)

Після надходження запиту токени приходять по одному. На кожному кроці повні ваги моделі та зростаюча історія KV-даних завантажуються з пам’яті високої пропускності (HBM) у SRAM GPU. При низьких розмірах пакетів цей процес повторюється так часто, що GPU змушений чекати на пропускну здатність пам’яті, а не на обчислення.

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

Рівняння затримки

Загальна затримка запиту складається з частин, пов’язаних із попереднім заповненням даних та самим декодуванням:

T_total  =  TTFT  +  (N_tokens − 1) × TPOT
  • TTFT (час до першого токена) включає повне попереднє заповнення інформації для запиту та перший токен результату — це те, що користувач сприймає як початкову швидку відповідь.
  • TPOT (час на кожен токен результату), або затримка між токенами, — це постійні витрати на кожен наступний крок декодування.
  • N_tokens — це довжина готового результату.

Фактор (N − 1) є навмисним: перший токен вже знаходиться всередині TTFT, тому лише решта множиться на TPOT. Поєднання прямого обчислення попереднього заповнення з TTFT — це поширена помилка. TTFT орієнтований на користувача та мусить включати цей перший крок декодування.

2. Вхідні дані перед тим, як GPU отримають трафік

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

Ключові елементи:

  • Багатошарове семантичне кешування: точне збіг ключа та значення плюс векторна схожість за формулою cos θ ≥ τ. Повторні запити ніколи не торкаються моделі; витрати та затримки знижуються одночасно.
  • Інтелектуальне маршрутизування моделей: легкий класифікатор надсилає дані для класифікації/форматування до невеликих моделей, а складніші завдання чи багатоетапне використання інструментів передаються моделям вищого рівня.
  • 3. Двигун виконання: безперервне групування та потік пам’яті

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

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

    4. Пряме усунення «вузьких місць» на кожному етапі

    Кешування, маршрутизація та групування даних керують обсягом трафіку. Наступні механізми змінюють самі етапи обробки.

    Попереднє заповнення: FlashAttention

    Витрати на попереднє заповнення зростають пропорційно квадрату довжини запиту, коли класичний підхід до обробки даних створює повну матрицю оцінок розміром N×N у пам’яті HBM. FlashAttention — це ядро, що враховує обмеження вводу-виводу, яке обчислює точні значення уваги під час потокової обробки даних через вбудовану SRAM, зменшуючи трафік у HBM без необхідності апроксимацій у математичних розрахунках. Це забезпечує точний результат та скорочення часу обробки довгих запитів. Він є стандартним у більшості систем обробки даних та поєднується з розділенням даних на частини та їх подальшою обробкою.

    Квантування

    Декодування вимагає значних ресурсів для переміщення ваг з HBM у SRAM. Квантування зменшує розмір ваг — від FP16 до FP8, INT8 або 4-бітних форматів (AWQ, GPTQ) — тож кожен токен займає менше байтів. Це підвищує ефективну пропускну здатність та дозволяє зберігати більше послідовностей у пам’яті. Очікуйте незначного зниження точності, що потребує підтвердження через власні тести.

    Кеш KV з сторінкуванням (PagedAttention)

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

    Спекулятивне декодування

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

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

    5. Планування обох фаз: часткове попереднє заповнення та дезагрегація

    Попереднє заповнення та декодування вимагають різних ресурсів процесора. Використання одного пулу GPU дозволяє тривалому процесу попереднього заповнення монополізувати обчислювальні ресурси та збільшувати затримку між токенами у всіх інших запитах. Для вирішення цієї проблеми пропонуються два взаємодоповнюючі підходи.

    Часткове попереднє заповнення

    Замість одного величезного пакета переднього заповнення розділіть запит на сегменти та поєднайте їх із кроками декодування в одній партії (Sarathi / Sarathi-Serve). Це зменшує сплески TTFT для сусідніх завдань та поєднує обчислювально-залежні та пам’яттю-залежні операції. Постійне групування вибирає, які запити ділять крок; часткове переднє заповнення визначає, як виконувати обтяжливе переднє заповнення, не ускладнюючи процес декодування.

    Роздільне обслуговування

    Часткове переднє заповнення зменшує взаємне впливання; роздільне обслуговування усуває його, розміщуючи окремі етапи на різному обладнанні (DistServe, Splitwise). Переднє заповнення виконується на пулах, оптимізованих для обчислень, а декодування — на пулах, оптимізованих для пропускної здатності, причому дані KV передаються через міжпристроєвий з’єднувач. Кожен етап масштабується на чіпах, які відповідають його вузькому місцю.

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

    6. Системний вплив та компроміси

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

    Багатошарове семантичне кешування — точні дані у форматі KV та порівняння векторів. У такому разі запити повністю уникають використання моделі. Витрати: пошук у векторному просторі (від однозначних до кількох десятків мс), а також застарілі чи неповні відповіді, якщо значення τ занадто низьке.

    Інтелектуальне маршрутизування — класифікатор складності спрямовує прості завдання до менших моделей. Це знижує середню вартість обробки токенів; неправильне маршрутизування погіршує якість результатів.

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

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

    Структуроване зберігання KV — фіксовані блоки усувають фрагментацію. Більші розміри груп; потрібне керування блоками та сумісне ядро для обробки уваги.

    Спекулятивне декодування — невеликий модель пропонує варіант; велика модель перевіряє його спільно. Кілька токенів на один великий крок; чутливість до другої моделі та рівня прийняття рішень.

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

    7. Завершення циклу

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

    Чек-лист планування пропускної здатності

    Коли показник TTFT зростає, перевіряйте розподіл довжин запитів, частку успішних запитів до семантичного кешу, наявність технології FlashAttention та чи довгі запити все ще монополізують GPU у вигляді однієї великої операції. Коли показник TPOT зростає при високій конкурентності, перевіряйте ефективний розмір пакетів даних, час перебування даних у форматі KV, рівень квантування та чи процес декодування знову не перейшов у режим, обмежений обсягом пам’яті.

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

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

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

    Примітки для операторів

    Семантичні кеші потребують перевірки значень TTL та τ; занадто низьке значення τ призводить до неточних відповідей. Маршрутизатори потребують даних про складність з позначками, інакше вони неправильно надсилають складні запити до малих моделей. Для безперервного групування даних необхідні показники задоволення вимог щодо затримок у черзі, щоб „вища пропускна здатність“ не приховувала проблем із взаємодією. Для спекулятивного декодування потрібні панелі керування для перевірки проектних версій — якщо їх прийняття знижується, ви оплачуєте другу модель без жодного прискорення.

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

    Посилання

    Основні дослідження, що лежать в основі цих механізмів (номери належать їм, а не вам):

    1. Orca — розподілений трансформерний сервіс — Yu та ін., OSDI 2022 (USENIX).
    2. PagedAttention — управління пам’яттю — Kwon та ін., SOSP 2023 (arXiv:2309.06180).
    3. GPTQ — квантування після навчання — Frantar та ін., 2022 (arXiv:2210.17323).
    4. AWQ — квантування ваг з урахуванням активації — Lin та ін., 2023 (arXiv:2306.00978).
    5. FlashAttention — точна увага з урахуванням операцій вводу-виводу — Dao та ін., NeurIPS 2022 (arXiv:2205.14135).
    6. Speculative decoding — швидке інференс трансформерів — Leviathan, Kalman, Matias, ICML 2023 (arXiv:2211.17192).
  • Sarathi / Sarathi-Serve з частковим заповненням даних та декодуванням за допомогою piggybacking — Agrawal та ін., 2023–2024 (arXiv:2308.16369).
  • DistServe з розділенням процесів заповнення даних та декодування — Zhong та ін., OSDI 2024 (USENIX).
  • Rозділення фаз у Splitwise для генеративних інференцій — Patel та ін., ISCA 2024 (arXiv:2311.18677).