Модели и платформы ИИ
TensorRT-LLM: Комплексное руководство по оптимизации вывода крупномасштабных языковых моделей для максимальной производительности
По мере роста спроса на крупномасштабные языковые модели (LLM) обеспечение быстрого, эффективного и масштабируемого вывода стало более важным, чем когда-либо. NVIDIA’s (NVDA ) TensorRT-LLM решает эту проблему, предоставляя набор мощных инструментов и оптимизаций, специально разработанных для вывода LLM. TensorRT-LLM предлагает впечатляющий набор улучшений производительности, таких как квантование, слияние ядер, пакетная обработка в полете и поддержка нескольких GPU. Эти достижения позволяют достичь скоростей вывода до 8 раз быстрее, чем традиционные методы, основанные на CPU, что меняет способ развертывания LLM в производстве.
Это комплексное руководство исследует все аспекты TensorRT-LLM, от его архитектуры и ключевых функций до практических примеров развертывания моделей. Независимо от того, являетесь ли вы инженером ИИ, разработчиком программного обеспечения или исследователем, это руководство даст вам знания, необходимые для использования TensorRT-LLM для оптимизации вывода LLM на GPU NVIDIA.
Ускорение вывода LLM с помощью TensorRT-LLM
TensorRT-LLM обеспечивает значительные улучшения производительности вывода LLM. Согласно тестам NVIDIA, приложения, основанные на TensorRT, демонстрируют до 8-кратного увеличения скорости вывода по сравнению с платформами, основанными только на CPU. Это важное достижение в реальных приложениях, таких как чат-боты, системы рекомендаций и автономные системы, которые требуют быстрых ответов.
Как это работает
TensorRT-LLM ускоряет вывод, оптимизируя нейронные сети во время развертывания с помощью методов, таких как:
- Квантование: уменьшает точность весов и активаций, сокращая размер модели и улучшая скорость вывода.
- Слияние слоев и тензоров: объединяет операции, такие как функции активации и умножения матриц, в одну операцию.
- Настройка ядер: выбирает оптимальные ядра CUDA для вычислений на GPU, сокращая время выполнения.
Эти оптимизации гарантируют, что ваши модели LLM работают эффективно на широком спектре платформ развертывания – от гипермасштабных центров данных до встроенных систем.
Оптимизация производительности вывода с помощью TensorRT
Разработанный на основе параллельной модели программирования CUDA от NVIDIA, TensorRT обеспечивает высокоспециализированные оптимизации для вывода на GPU NVIDIA. Сокращая процессы, такие как квантование, настройка ядер и слияние операций с тензорами, TensorRT гарантирует, что LLM могут работать с минимальной задержкой.
Некоторые из наиболее эффективных методов включают:
- Квантование: это уменьшает числовую точность параметров модели, сохраняя высокую точность, эффективно увеличивая скорость вывода.
- Слияние тензоров: объединяя несколько операций в один ядро CUDA, TensorRT минимизирует накладные расходы на память и увеличивает пропускную способность.
- Автонастройка ядер: TensorRT автоматически выбирает лучшее ядро для каждой операции, оптимизируя вывод для данного GPU.
Эти методы позволяют TensorRT-LLM оптимизировать производительность вывода для задач глубокого обучения, таких как обработка естественного языка, системы рекомендаций и анализ видео в реальном времени.
Ускорение рабочих нагрузок ИИ с помощью TensorRT
TensorRT ускоряет рабочие нагрузки глубокого обучения, включая оптимизации точности, такие как INT8 и FP16. Эти уменьшенные форматы точности позволяют значительно увеличить скорость вывода, сохраняя точность. Это особенно ценно в реальных приложениях, где низкая задержка является важным требованием.
INT8 и FP16 оптимизации особенно эффективны в:
- Потоковом видео: задачи обработки видео на основе ИИ, такие как обнаружение объектов, выигрывают от этих оптимизаций, сокращая время обработки кадров.
- Системах рекомендаций: ускоряя вывод для моделей, которые обрабатывают большие объемы данных пользователей, TensorRT позволяет осуществлять персонализацию в реальном времени в крупном масштабе.
- Обработке естественного языка (NLP): TensorRT улучшает скорость задач NLP, таких как генерация текста, перевод и суммаризация, что делает их пригодными для реальных приложений.
Развертывание, запуск и масштабирование с помощью NVIDIA Triton
После оптимизации модели с помощью TensorRT-LLM вы можете легко развернуть, запустить и масштабировать ее с помощью NVIDIA Triton Inference Server. Triton – это программное обеспечение с открытым исходным кодом, которое поддерживает динамическое пакетирование, ансамбли моделей и высокую пропускную способность. Оно обеспечивает гибкую среду для управления моделями ИИ в крупном масштабе.
Некоторые из ключевых функций включают:
- Параллельное выполнение моделей: запускать несколько моделей одновременно, максимизируя использование GPU.
- Динамическое пакетирование: объединять несколько запросов на вывод в один пакет, сокращая задержку и увеличивая пропускную способность.
- Потоковые аудио- и видеовходы: поддерживать входные потоки в реальных приложениях, таких как анализ видео в реальном времени или услуги распознавания речи.
Это делает Triton ценным инструментом для развертывания оптимизированных моделей TensorRT-LLM в производственных средах, обеспечивая высокую масштабируемость и эффективность.
Основные функции TensorRT-LLM для вывода LLM
Открытый Python API
TensorRT-LLM предоставляет высокомодульный и открытый Python API, упрощающий процесс определения, оптимизации и выполнения LLM. API позволяет разработчикам создавать пользовательские LLM или изменять предварительно построенные модели, не требуя глубоких знаний CUDA или фреймворков глубокого обучения.
Пакетная обработка в полете и страницированная внимательность
Одной из выдающихся функций TensorRT-LLM является пакетная обработка в полете, которая оптимизирует генерацию текста, обрабатывая несколько запросов одновременно. Эта функция минимизирует время ожидания и улучшает использование GPU, динамически объединяя последовательности.
Кроме того, страницированная внимательность гарантирует, что использование памяти остается низким даже при обработке длинных входных последовательностей. Вместо выделения непрерывной памяти для всех токенов в последовательности страницированная внимательность разбивает память на “страницы”, которые можно динамически повторно использовать, предотвращая фрагментацию памяти и улучшая эффективность.
Многопроцессорная и многоузловая обработка
Для более крупных моделей или сложных рабочих нагрузок TensorRT-LLM поддерживает многопроцессорную и многоузловую обработку. Эта возможность позволяет распределять вычисления модели по нескольким GPU или узлам, улучшая пропускную способность и сокращая общее время вывода.
Поддержка FP8
С появлением FP8 (8-битовая浮ющая точка) TensorRT-LLM использует GPU 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.
Тесты производительности: выигрыш производительности TensorRT-LLM
TensorRT-LLM демонстрирует значительные выигрыши производительности для вывода LLM на различных GPU. Вот сравнение скорости вывода (измеренной в токенах в секунду) с помощью TensorRT-LLM на разных GPU 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: Запуск контейнера
Запустите контейнер разработки с доступом к GPU 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
Шаг 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. Пакетная обработка в полете
Традиционная пакетная обработка предполагает ожидание, пока пакет будет полностью собран, прежде чем начать обработку, что может вызвать задержки. Пакетная обработка в полете меняет это, динамически запуская вывод для завершенных запросов внутри пакета, пока другие запросы еще собираются. Это улучшает общую пропускную способность, минимизируя простой и улучшая использование GPU.
Эта функция особенно ценна в реальных приложениях, таких как чат-боты или голосовые помощники, где время ответа критически важно.
2. Страницированная внимательность
Страницированная внимательность – это метод оптимизации памяти для обработки длинных входных последовательностей. Вместо требования контигуированной памяти для всех токенов в последовательности страницированная внимательность позволяет модели разбить данные кэша ключ-значение на “страницы” памяти, которые можно динамически выделять и освобождать по мере необходимости, оптимизируя использование памяти.
Страницированная внимательность имеет решающее значение для обработки длинных последовательностей и сокращения накладных расходов на память, особенно в генеративных моделях, таких как GPT и LLaMA.
3. Пользовательские плагины
TensorRT-LLM позволяет расширить его возможности с помощью пользовательских плагинов. Плагины – это пользовательские ядра, которые выполняют конкретные оптимизации или операции, не охваченные стандартной библиотекой TensorRT.
Например, плагин Flash-Attention – это известное пользовательское ядро, которое оптимизирует многослойные блоки внимания в моделях, основанных на трансформерах. Используя этот плагин, разработчики могут добиться значительного ускорения вычислений внимания – одного из наиболее ресурсоемких компонентов LLM.
Чтобы интегрировать пользовательский плагин в модель TensorRT-LLM, вы можете написать пользовательское ядро CUDA и зарегистрировать его в TensorRT. Плагин будет вызван во время выполнения модели, обеспечивая индивидуальные улучшения производительности.
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, особенно на GPU H100.
3. Используйте страницированную внимательность для длинных последовательностей
Для задач, которые включают длинные входные последовательности, такие как суммаризация документов или многоходовые разговоры, всегда включайте страницированную внимательность, чтобы оптимизировать использование памяти. Это сокращает накладные расходы на память и предотвращает ошибки нехватки памяти во время вывода.
4. Настройте параллелизм для конфигураций с несколькими GPU
При развертывании LLM на нескольких GPU или узлах важно настроить настройки тензорного параллелизма и параллелизма конвейера, чтобы они соответствовали вашей конкретной рабочей нагрузке. Правильная настройка этих режимов может привести к значительному улучшению производительности, распределяя вычислительную нагрузку равномерно по GPU.
Вывод
TensorRT-LLM представляет собой сдвиг парадигмы в оптимизации и развертывании крупномасштабных языковых моделей. С помощью его расширенных функций, таких как квантование, слияние операций, точность FP8 и поддержка нескольких GPU, TensorRT-LLM позволяет LLM работать быстрее и более эффективно на GPU NVIDIA. Независимо от того, работаете ли вы над приложениями реального времени, системами рекомендаций или крупномасштабными языковыми моделями, TensorRT-LLM предоставляет инструменты, необходимые для расширения границ производительности.
Это руководство провело вас через настройку TensorRT-LLM, оптимизацию моделей с помощью его Python API, развертывание на сервере вывода Triton и применение лучших практик для эффективного вывода. С помощью TensorRT-LLM вы можете ускорить рабочие нагрузки ИИ, сократить задержку и обеспечить масштабируемые решения LLM в производственных средах.
Для получения дополнительной информации обратитесь к официальной документации TensorRT-LLM и документации сервера вывода Triton.












