Промпт-інжиніринг

Прискорення інференції великих мовних моделей: техніки для ефективного розгортання

mm
Додайте Unite.AI до бажаних джерел у Google
LLM Inference Speed up

Великі мовні моделі (LLM) типу GPT-4, LLaMA та PaLM розширюють межі того, що можливо в обробці природної мови. Однак розгортання цих величезних моделей у виробничих середовищах представляє суттєві виклики щодо обчислювальних вимог, використання пам’яті, затримки та вартості. Коли LLM продовжують зростати більші та більш потужні, оптимізація їхньої продуктивності інференції є критично важливою для реальних застосунків.

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

Давайте почнемо з розуміння, чому інференція LLM така складна порівняно з традиційними моделями NLP.

Виклик інференції великих мовних моделей

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

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

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

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

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

Техніки числової точності

З 32-бітної до 16-бітної точності

З 32-бітної до 16-бітної точності

Одним із напрямків прискорення інференції LLM є використання зменшеної числової точності для ваг моделі та активацій. Сучасні фреймворки глибокого навчання, такі як PyTorch та TensorFlow, зазвичай використовують 32-бітну точність з рухомою комою (FP32) за замовчуванням. Однак дослідження показали, що LLM можуть часто зберігати високу точність навіть при роботі з нижчими точностями, такими як 16-бітна (FP16), 8-бітові цілі числа (INT8) або навіть 4-бітові цілі числа (INT4).

Зниження числової точності пропонує кілька переваг:

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

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

Є два основних підходи до квантування з LLM:

Пост-тренувальне квантування (PTQ): У цьому методі LLM спочатку тренується за допомогою стандартної точності FP32. Після тренування ваги моделі квантуються (перетворюються) у нижчу точність, наприклад INT8 або INT4. PTQ простіше у реалізації, але може привести до більшої втрати точності.

Квантування-чутливе тренування (QAT): З QAT процес квантування імітується під час фази тренування. Це дозволяє моделі навчатися компенсувати помилки квантування, мінімізуючи погіршення точності при розгортанні кінцевої квантованої моделі. QAT складніше, але часто дає кращі результати порівняно з PTQ.

Для практичного застосування можна скористатися попередньо квантованими моделями, доступними на платформах, таких як Hugging Face, які містять різноманітні моделі, оптимізовані за допомогою різних методів квантування. Наприклад, якщо бажано завантажити модель, квантовану за допомогою Auto-GPTQ, користувачі можуть легко завантажити її за допомогою бібліотеки трансформерів Hugging Face. Крім того, для квантування моделі можна використовувати інструменти, такі як AutoGPTQ, які інтегруються з існуючими бібліотеками для ефективного стиснення моделі.

Ось приклад завантаження попередньо квантованої моделі Llama-2-7b за допомогою бібліотеки трансформерів Hugging Face:

from transformers import AutoModelForCausalLM, AutoTokenizer

<p>model_id = "TheBloke/Llama-2-7b-Chat-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
And для власного квантування можна слідувати цим крокам за допомогою інструментарію AutoGPTQ:</p>

<p>from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig</p>

<p>model_id = "llama-2-7b-original"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset="your-dataset", tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)</p>

Пам’ятайте, що квантування може потребувати післяквантової настройки або інженерії промптів для збереження якості моделі. Для нової квантування ви можете повернути користь спільноті, розмістивши свої квантовані моделі на платформах, таких як Hugging Face.

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

 

Алгоритм Flash Attention

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

Алгоритм Flash Attention, представлений у статті FlashAttention, пропонує більш пам’ятно- та паралельно-дружній підхід до операції уваги. Замість перерахунку значень уваги для кожного токену Flash Attention кешує та повторно використовує проміжні матриці ключів/значень, уникając зайвих обчислень.

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

Хоча деталі Flash Attention досить складні, загальна ідея полягає у розкладанні операції уваги на два етапи:

  1. Вбудовування префіксної суми: Цей етап обчислює та кешує вбудовування ключів/значень для всіх вхідних токенів, забезпечуючи ефективне повторне використання під час генерації.
  2. Каузальна увага: Сама операція уваги, тепер оптимізована для використання закешованих вбудовувань ключів/значень з першого етапу.

Відокремлюючи ці етапи, Flash Attention може скористатися високопаралельними операціями ГП, суттєво прискорюючи瓶頸 уваги в інференції LLM.

Ось коротке концептуальне ілюстрування реалізації Flash Attention з LLM:

from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention

<p># Завантаження LLM типу OctoCoder
model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder")</p>

<p># Приклад системного промпту, який спрямовує модель на те, щоб бути кращим помічником з кодуванням
system_prompt = "..."</p>

<p># Підготовка довшого вводу з системним промптом
long_prompt = system_prompt + "Питання: Будь ласка, напишіть функцію на Python, яка перетворює байти в гігабайти."</p>

<p># Перетворення моделі для оптимізації Flash Attention
model.to_bettertransformer()</p>

<p># Виконання моделі з Flash Attention
start_time = time.time()
with torch.backends.cuda.sdp_kernel(enable_flash=True):
result = model.generate(long_prompt, max_new_tokens=60)
print(f"Генеровано за {time.time() - start_time} секунд.")

Хоча Flash Attention пропонує вражаючі прискорення, він працює в межах існуючої архітектури трансформерів. Для повного розблокування потенціалу прискореної інференції LLM нам потрібно дослідити архітектурні інновації, розроблені спеціально для цього завдання.

Обрізання LLM

Обрізання LLM – це техніка, яка зменшує розмір моделі, зберігаючи при цьому її функціональність. Вона використовує оцінку важливості ваг на основі апроксимацій матриці Гесса. При обрізанні менш важливі групи ваг видаляються, а потім модель донастрається для відновлення точності. Пакет LLM-Pruner пропонує скрипти для обрізання з різними стратегіями. Обрізання включає відкриття залежностей, оцінку внеску груп та етап відновлення, який включає коротку післятренувальну настройку.

Ось спрощений приклад коду на Python, що демонструє використання LLM-Pruner для моделі LLaMa:

from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner

<p># Завантаження попередньо тренованої моделі LLaMa
model = AutoModelForSequenceClassification.from_pretrained("llama-base")</p>

<p># Ініціалізація обрізувача з бажаною конфігурацією
pruner = LLMPruner(
model,
pruning_ratio=0.25,
block_mlp_layers=(4, 30),
block_attention_layers=(4, 30),
pruner_type='taylor'
)</p>

<p># Виконання обрізання
pruned_model = pruner.prune()</p>

<p># Донастройка обрізаної моделі
pruned_model.fine_tune(training_data)</p>

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

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

Архітектурні інновації для ефективної генерації тексту

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

Ось деякі з ключових архітектурних інновацій, що забезпечують швидшу інференцію LLM:

Alibi: Архітектура Alibi, представлена в статті PAL-Instruction, розділяє моделювання довгого контексту вводу від процесу генерації тексту самої по собі. Вона використовує стиснене представлення контексту вводу (так званий “алібі”), щоб ініціалізувати процес генерації, уникнувши необхідності обробляти повну вхідну послідовність повторно під час автoregresивної генерації.

Ротарі-вбудовування: Замість використання стандартних позиційних вбудовувань техніка ротарі-вбудовування використовує матриці обертання для кодування позиційної інформації більш ефективно. Цей підхід показав покращення продуктивності та дозволив обробляти довші вхідні послідовності.

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

Багаторазова увага з спільними обчисленнями

Багаторазова увага з спільними обчисленнями

Групова багаторазова увага (GQA): Розробляючи MQA, GQA групує вихідні токени в кластери та обчислює увагу спільно для кожного кластеру. Цей підхід далі знижує обчислювальні вимоги, зберігаючи при цьому високу якість генерації тексту.

Хоча ці архітектурні інновації ще знаходяться в активній стадії дослідження та розробки, вони продемонстрували вражаючі прискорення для завдань інференції LLM, особливо при поєднанні з техніками, такими як Flash Attention та оптимізацією числової точності.

Реальні розгортання: розгляди

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

Апаратне прискорення: Хоча ЦП можуть обробляти інференцію LLM, ГП та інші прискорювачі, такі як ТПУ Google (GOOGL ), є суттєво важливими для досягнення високої пропускної здатності та низької затримки. Вибір правильного апаратного забезпечення та оптимізація використання пам’яті є важливими.

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

Квантування проти якості компромісу: Ступінь квантування (8-біт, 4-біт тощо) безпосередньо впливає на швидкість інференції та використання пам’яті, але також впливає на якість виводу. Цей компроміс потрібно ретельно оцінити для кожного випадку використання.

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

Кешування та оптимізовані часи виконання: Оптимізовані часи виконання глибокого навчання, такі як NVIDIA TensorRT, та фреймворки, розроблені спеціально для розгортання LLM (наприклад, MosaicML’s Composable Inference Suite), можуть забезпечити суттєві прискорення завдяки технікам, таким як об’єднання операторів, оптимізація ядер та розумні стратегії кешування.

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

Висновок

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

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

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

Я провів останні п'ять років, занурючись у захопливий світ машинного навчання та глибокого навчання. Моя пристрасть та експертиза привели мене до внеску у понад 50 різних проектів програмної інженерії, з особливим акцентом на AI/ML. Моя тривала цікавість також привела мене до природної обробки мови, галузі, яку я бажаю дослідити далі.