заглушки Прискорення виведення великої мовної моделі: методи ефективного розгортання - Unite.AI
Зв'язатися з нами

Оперативна інженерія

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

mm

опублікований

 on

LLM Inference Прискорення

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

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

Давайте почнемо з розуміння того, чому висновок LLM є таким складним у порівнянні з традиційними моделями НЛП.

Виклик логічного висновку з моделями великих мов

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

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

Однією з ключових проблем є авторегресійна природа генерації тексту за допомогою 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.

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

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

from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "TheBloke/Llama-2-7b-Chat-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
And for custom quantization, one might follow these steps using the AutoGPTQ toolkit:
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
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)

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

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

 

Алгоритм Flash Attention

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

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

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

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

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

Розділивши ці фази, Flash Attention може скористатися високопаралельними операціями графічного процесора, значно прискоривши вузьке місце уваги в висновках LLM.

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

from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention
# Load an LLM like OctoCoder
model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder")
# Sample system prompt that guides the model towards being a better coding assistant
system_prompt = """... (system prompt details) ..."""
# Preparing a longer input with the system prompt
long_prompt = system_prompt + "Question: Please write a function in Python that transforms bytes to Gigabytes."
# Converting the model for Flash Attention optimization
model.to_bettertransformer()
# Running the model with 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"Generated in {time.time() - start_time} seconds.")

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

Обрізка LLMs

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

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

from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner
# Load pre-trained LLaMa model
model = AutoModelForSequenceClassification.from_pretrained("llama-base")
# Initialize the pruner with desired configuration
pruner = LLMPruner(
model,
pruning_ratio=0.25,
block_mlp_layers=(4, 30),
block_attention_layers=(4, 30),
pruner_type='taylor'
)
# Execute pruning
pruned_model = pruner.prune()
# Fine-tune the pruned model
pruned_model.fine_tune(training_data)

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

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

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

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

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

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

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

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

Багатозапитова увага

Багатозапитова увага

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

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

Розгортання в реальному світі

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

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

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

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

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

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

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

Висновок

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

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

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

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