Моделі та платформи ШІ

TensorRT-LLM: Комплексний посібник з оптимізації великомасштабних мовних моделей для максимальної продуктивності

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

Відповідно до зростаючого попиту на великомасштабні мовні моделі (LLM), забезпечення швидкої, ефективної та масштабованої інференції стало більш важливим, ніж будь-коли. NVIDIA’s (NVDA ) TensorRT-LLM прийшов, щоб впоратися з цією проблемою, надаючи набір потужних інструментів та оптимізацій, спеціально розроблених для інференції LLM. TensorRT-LLM пропонує вражаючий набір поліпшень продуктивності, таких як квантування, фузія ядер, пакетна обробка в польоті та підтримка چندгPU. Ці вдосконалення роблять можливим досягнення швидкості інференції до 8 разів швидше, ніж традиційні методи на основі CPU, змінюючи спосіб розгортання LLM у виробництві.

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

Прискорення інференції LLM за допомогою TensorRT-LLM

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

Як це працює

TensorRT-LLM прискорює інференцію, оптимізуючи нейронні мережі під час розгортання за допомогою технік, таких як:

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

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

Оптимізація продуктивності інференції за допомогою TensorRT

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

Деякі з найбільш ефективних технік включають:

  • Квантування: Це зменшує числову точність параметрів моделі, зберігаючи при цьому високу точність, ефективно прискорюючи інференцію.
  • Фузія тензорів: Об’єднуючи декілька операцій в одне ядро CUDA, TensorRT мінімізує накладні витрати на пам’ять та збільшує пропускну здатність.
  • Автонастройка ядер: TensorRT автоматично вибирає найкраще ядро для кожної операції, оптимізуючи інференцію для даного графічного процесора.

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

Прискорення завдань штучного інтелекту за допомогою TensorRT

TensorRT прискорює завдання глибокого навчання, включно з оптимізацією точності, такою як INT8 та FP16. Ці зменшені формати точності дозволяють значно швидшу інференцію, зберігаючи при цьому точність. Це особливо цінно в реальних додатках, де низька затримка є критичним вимогам.

INT8 та FP16 оптимізації особливо ефективні в:

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

Розгортання, запуск та масштабування з NVIDIA Triton

Як тільки ваша модель була оптимізована за допомогою TensorRT-LLM, ви можете легко розгорнути, запустити та масштабувати її за допомогою NVIDIA Triton Inference Server. Triton – це відкритий програмний продукт, який підтримує динамічне пакетування, ансамблі моделей та високий пропуск. Він забезпечує гнучке середовище для управління моделями штучного інтелекту у великомасштабному режимі.

Деякі з ключових функцій включають:

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

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

Ключові функції TensorRT-LLM для інференції LLM

Відкритий Python API

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

Пакетна обробка в польоті та пагінація уваги

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

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

МультігPU та мультінодова інференція

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

Підтримка FP8

З появою FP8 (8-бітова плаваюча кома), TensorRT-LLM використовує графічні процесори NVIDIA H100 для конвертування ваг моделі у цей формат для оптимізованої інференції. FP8 забезпечує зменшене споживання пам’яті та швидші обчислення, особливо корисні у великомасштабних розгортаннях.

Архітектура та компоненти TensorRT-LLM

Поняття архітектури TensorRT-LLM допоможе вам краще використовувати його можливості для інференції LLM. Давайте розглянемо ключові компоненти:

Визначення моделі

TensorRT-LLM дозволяє визначати LLM за допомогою простого Python API. API створює графічну репрезентацію моделі, роблячи її легшою для управління складними шарами, залученими в архітектурах LLM, таких як GPT або BERT.

Прив’язка ваг

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

Виразний аналіз та фузія

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

Плагіни

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

Наприклад, плагін Flash-Attention значно покращує продуктивність шарів уваги у моделях Transformer.

Бенчмарки: Збільшення продуктивності TensorRT-LLM

TensorRT-LLM демонструє значне збільшення продуктивності інференції LLM на різних графічних процесорах. Ось порівняння швидкості інференції (визначається у токенах за секунду) за допомогою TensorRT-LLM на різних графічних процесорах NVIDIA:

Модель Точність Довжина вхідних/вихідних даних H100 (80GB) A100 (80GB) L40S FP8
GPTJ 6B FP8 128/128 34,955 11,206 6,998
GPTJ 6B FP8 2048/128 2,800 1,354 747
LLaMA v2 7B FP8 128/128 16,985 10,725 6,121
LLaMA v3 8B FP8 128/128 16,708 12,085 8,273

Ці бенчмарки показують, що TensorRT-LLM забезпечує суттєве покращення продуктивності, особливо для довгих послідовностей.

Практичний досвід: Встановлення та збірка TensorRT-LLM

Крок 1: Створення контейнерного середовища

Для зручності використання TensorRT-LLM пропонує зображення Docker для створення контрольованого середовища для збірки та виконання моделей.

docker build --pull \
--target devel \
--file docker/Dockerfile.multi \
--tag tensorrt_llm/devel:latest .

Крок 2: Запуск контейнера

Запустіть контейнер розробки з доступом до графічних процесорів NVIDIA:

docker run --rm -it \
--ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --gpus=all \
--volume ${PWD}:/code/tensorrt_llm \
--workdir /code/tensorrt_llm \
tensorrt_llm/devel:latest

Крок 3: Збірка TensorRT-LLM з джерельного коду

У контейнері скомпілюйте TensorRT-LLM наступною командою:

python3 ./scripts/build_wheel.py --trt_root /usr/local/tensorrt
pip install ./build/tensorrt_llm*.whl

Ця опція особливо корисна, коли ви хочете уникнути проблем з сумісністю, пов’язаних з залежностями Python, або коли зосереджуєтесь на інтеграції з C++ у виробничих системах. Після завершення збірки ви знайдете скомпільовані бібліотеки для часу виконання C++ у каталозі cpp/build/tensorrt_llm, готові для інтеграції з вашими додатками C++.

Крок 4: Пов’язування часу виконання C++ TensorRT-LLM

При інтеграції TensorRT-LLM у ваші проекти C++, забезпечте, щоб шляхи включення вашого проекту вказували на каталог cpp/include. Це містить стабільні, підтримувані заголовні файли API. Бібліотеки TensorRT-LLM пов’язані під час процесу компіляції C++.

Наприклад, ваша конфігурація CMake може включати:

include_directories(${TENSORRT_LLM_PATH}/cpp/include)
link_directories(${TENSORRT_LLM_PATH}/cpp/build/tensorrt_llm)
target_link_libraries(your_project tensorrt_llm)

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

Розширені функції TensorRT-LLM

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

1. Пакетна обробка в польоті

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

Ця функція особливо цінна у реальних додатках, таких як чат-боти або голосові помічники, де час реакції є критичним.

2. Пагінація уваги

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

Пагінація уваги критична для обробки довгих послідовностей та зменшення накладних витрат на пам’ять, особливо у генеративних моделях, таких як GPT та LLaMA.

3. Користувацькі плагіни

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

Наприклад, плагін Flash-Attention – це відоме користувацьке ядро, яке оптимізує шари уваги у моделях Transformer. Використовуючи цей плагін, розробники можуть досягти суттєвого прискорення обчислень уваги – одного з найбільш ресурсоємних компонентів LLM.

4. Точність FP8 на NVIDIA H100

З точністю FP8, TensorRT-LLM використовує останні інновації NVIDIA у архітектурі H100 Hopper. FP8 зменшує відбиток моделі LLM, зберігаючи ваги та активації у 8-бітовому форматі плаваючої коми, що призводить до швидшого обчислення без суттєвої втрати точності. TensorRT-LLM автоматично компілює моделі для використання оптимізованих ядер FP8, ще більше прискорюючи час інференції.

Це робить TensorRT-LLM ідеальним вибором для великомасштабних розгортань, які вимагають першокласної продуктивності та енергоефективності.

Приклад: Розгортання TensorRT-LLM з сервером інференції Triton

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

Крок 1: Настройка репозиторію моделей

Створіть репозиторій моделей для Triton, який буде зберігати файли моделі TensorRT-LLM. Наприклад, якщо у вас скомпільована модель GPT2, ваша структура каталогів може виглядати так:

mkdir -p model_repository/gpt2/1
cp ./trt_engine/gpt2_fp16.engine model_repository/gpt2/1/

Крок 2: Створення конфігураційного файлу Triton

У тому ж каталозі model_repository/gpt2/ створіть конфігураційний файл під назвою config.pbtxt, який розповідає Triton, як завантажувати та запускати модель. Ось базова конфігурація для TensorRT-LLM:

name: "gpt2"
platform: "tensorrt_llm"
max_batch_size: 8

<p>input [
{
name: "input_ids"
data_type: TYPE_INT32
dims: [-1]
}
]</p>

<p>output [
{
name: "logits"
data_type: TYPE_FP32
dims: [-1, -1]
}
]</p>

Крок 3: Запуск сервера Triton

Використайте наступну команду Docker, щоб запустити Triton з репозиторієм моделей:

docker run --rm --gpus all \
-v $(pwd)/model_repository:/models \
nvcr.io/nvidia/tritonserver:23.05-py3 \
tritonserver --model-repository=/models

Крок 4: Надсилання запитів інференції до Triton

Як тільки сервер Triton запущений, ви можете надсилати запити інференції до нього за допомогою HTTP або gRPC. Наприклад, використовуючи curl, щоб надіслати запит:

curl -X POST http://localhost:8000/v2/models/gpt2/infer -d '{
"inputs": [
{"name": "input_ids", "shape": [1, 128], "datatype": "INT32", "data": [[101, 234, 1243]]}
]
}'

Triton обробить запит за допомогою двигуна TensorRT-LLM та поверне логіти як вихід.

Найкращі практики для оптимізації інференції LLM з TensorRT-LLM

Для повного використання можливостей TensorRT-LLM важливо слідувати найкращим практикам під час оптимізації моделі та розгортання. Ось деякі ключові поради:

1. Профіль вашої моделі перед оптимізацією

Перед застосуванням оптимізацій, таких як квантування або фузія ядер, використовуйте інструменти профайлінгу NVIDIA (наприклад, Nsight Systems або профайлер TensorRT), щоб зрозуміти поточні вузькі місця виконання вашої моделі. Це дозволить вам націлитися на конкретні області для покращення, що призведе до більш ефективних оптимізацій.

2. Використовуйте змішану точність для оптимальної продуктивності

Під час оптимізації моделей за допомогою TensorRT-LLM використання змішаної точності (комбінація FP16 та FP32) пропонує суттєве прискорення без суттєвої втрати точності. Для найкращого балансу між швидкістю та точністю розгляньте використання FP8, де це можливо, особливо на графічних процесорах H100.

3. Використовуйте пагінацію уваги для довгих послідовностей

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

4. Настройте паралелізм для багатогPU-середовищ

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

Висновок

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

Цей посібник провів вас через настройку TensorRT-LLM, оптимізацію моделей за допомогою його Python API, розгортання на сервері інференції Triton та застосування найкращих практик для ефективної інференції. З TensorRT-LLM ви можете прискорити свої завдання штучного інтелекту, зменшити затримку та забезпечити масштабовані рішення LLM у виробничих середовищах.

Для подальшої інформації зверніться до офіційної документації TensorRT-LLM та документації сервера інференції Triton.

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