Введение: Почему стоит потратить выходные на сборку TensorRT-LLM
Если вы когда-либо видели, как ваш GPU простаивает с загрузкой 60%, пока ваша LLM еле ползет, вы знаете, что есть резерв производительности. TensorRT-LLM превращает этот запас в пропускную способность: объединенные ядра, страничное внимание, квантование и оптимизации на уровне графов, которые снижают задержку и увеличивают количество токенов в секунду. В этом практическом руководстве мы пройдем путь от установки до сборки движка и обслуживания, чтобы вы могли уверенно развертывать более быстрый и дешевый вывод на GPU NVIDIA.
Этот учебник написан в практичном и ориентированном на решение проблем стиле. Мы будем использовать структуру, основанную на вопросах, с командами, которые можно копировать, распространенными ошибками и точками принятия решений для FP16 vs INT8, пакетирования и стратегий KV-кэша. Мы также будем ссылаться на официальные ресурсы для более глубокого изучения, где это уместно.
Что вы узнаете
- Как настроить среду для TensorRT-LLM
- Как подготовить модель (из Hugging Face или контрольных точек) для сборки движка
- Как создать движки FP16/INT8 и настроить производительность
- Как запустить вывод через Python/C++ и HTTP-сервис
- Как проводить бенчмаркинг, пакетирование и отладку
Для кого это предназначено
- ML-инженеров, развертывающих LLM на GPU NVIDIA
- Практиков, оптимизирующих стоимость/задержку в production
- Разработчиков, переходящих от PyTorch Transformers к высокооптимизированному выводу
- Что такое TensorRT-LLM и когда его следует использовать?
TensorRT-LLM — это стек для вывода, который компилирует модели Transformer в высокооптимизированные GPU "движки". По сравнению с чистым PyTorch или общими средами выполнения, вы обычно получаете:
- Более низкую задержку на токен
- Более высокую пропускную способность при больших размерах пакетов
- Лучшую эффективность использования памяти благодаря страничному KV-кэшу и квантованию
Используйте его, когда вы работаете на GPU NVIDIA и заботитесь о производительности production-уровня. Это особенно ценно для LLM только с декодером (например, Llama, Mistral, Phi, BLOOM) и сценариев, таких как чат-боты, RAG и высокопроизводительные API-сервисы (high-QPS API services).
- Предварительные требования и настройка среды
Основные требования
- GPU NVIDIA с современной вычислительной мощностью (например, Ampere, Ada, Hopper)
- Соответствующие версии CUDA и TensorRT, а также подходящие драйверы
- Python 3.8+ и инструменты сборки, если компилируете из исходного кода
Примечание о версиях: Всегда проверяйте официальную матрицу поддержки TensorRT и примечания к выпуску на совместимые версии CUDA/TensorRT и функции перед установкой.
Варианты быстрого старта
- Контейнеризированный: Используйте контейнеры NVIDIA с предустановленными CUDA/TensorRT — самый быстрый способ избежать несовместимости версий.
- Нативная установка: Следуйте официальному руководству по быстрому старту для базовой TensorRT, а затем установите TensorRT-LLM поверх нее.
- Подготовка модели (Hugging Face → TensorRT-LLM)
Общие источники
- Hugging Face: Варианты Llama/Mistral/BLOOM
- Локальные контрольные точки: Пользовательские тонкие настройки
Контрольный список подготовки
- Убедитесь, что архитектура модели поддерживается TensorRT-LLM.
- Загрузите веса модели и токенизатор.
- При необходимости преобразуйте safetensors в ожидаемые форматы или экспортируйте в ONNX с помощью скриптов проекта.
Совет: Официальное руководство по быстрому старту часто включает скрипты для получения моделей и преобразования их в правильную промежуточную форму. Для пошагового руководства с примером BLOOM см. руководство Dell по преобразованию Hugging Face LLM в TensorRT-LLM.
- Создание движка TensorRT-LLM (сердце рабочего процесса)
Концепции, которые вам следует знать
- Движок: Скомпилированный, аппаратно-оптимизированный артефакт, который вы загружаете для вывода.
- Точность: FP16/BF16 для надежной отправной точки; INT8 или FP8 для более высокой пропускной способности, если точность сохраняется.
- KV-кэш: Страничный KV-кэш уменьшает фрагментацию памяти и повышает производительность при работе с длинным контекстом.
Основные этапы
- Определите конфигурацию сборки: максимальный пакет, длины последовательностей, точность, квантование и архитектуру GPU.
- Укажите свои контрольные точки модели и токенизатор.
- Скомпилируйте движок для целевого GPU(s).
Справка: Создание движков с помощью официальной документации и конфигураций. Если вы планируете обслуживать через Hugging Face Text Generation Inference (TGI), см. примечания к TRT-LLM backend о предварительной компиляции движков для каждой архитектуры GPU и конфигурации.
Стартовое дерево решений
- Первая сборка: FP16, средняя максимальная длина последовательности (например, 4K–8K), умеренный пакет (например, 4–8). Проверьте правильность.
- Масштабирование: Включите страничное KV-кэширование. Увеличьте максимальный размер пакета/луча. Поэкспериментируйте с FP8 или INT8.
- Production: Зафиксируйте конфигурации, которые соответствуют требованиям к задержке/QPS; создайте отдельные движки для каждого сценария (короткие запросы vs длинный контекст).
- Запуск вывода: Python, C++ и HTTP
У вас есть три распространенных пути:
- Python: Быстрое прототипирование, идеально подходит для конвейеров и блокнотов.
- C++: Максимальная производительность, интеграция в собственные сервисы.
- HTTP Serving: Используйте TGI с TRT-LLM backend или примеры обслуживания среды выполнения для масштабируемого развертывания.
Hugging Face TGI backend
- Предварительно скомпилируйте движки для вашей точной конфигурации GPU/точности.
- Запустите TGI с TRT-LLM backend и укажите на каталог движка.
- Отправляйте запросы через /generate или openai-совместимые маршруты и масштабируйте с помощью реплик.
- Настройка производительности, которая действительно имеет значение
С чего начать
- Точность: FP16 — это ваша надежная отправная точка. INT8/FP8 может еще больше сократить задержку, но проверьте качество.
- Пакетная обработка: Динамическая пакетная обработка и объединение запросов значительно увеличивают пропускную способность; измерьте задержку "хвоста".
- Страничный KV-кэш: Необходим для длинных подсказок и потоковой передачи; снижает нагрузку на память.
- Максимальная длина: Увеличение максимальной длины последовательности увеличивает размер движка и может снизить тактовую частоту; создавайте движки, подходящие для конкретной цели.
Практические советы
- Проводите бенчмаркинг с реалистичными подсказками: измеряйте фазы предварительного заполнения и декодирования отдельно.
- Пропускная способность токенизатора имеет значение: делайте это на GPU, если ваша платформа это поддерживает.
- Следите за графами CUDA/объединенными ядрами: они снижают накладные расходы CPU и задержку запуска ядра.
- Для нескольких GPU: Предпочитайте параллелизм тензоров или параллелизм конвейеров в соответствии с размером вашей модели и требованиями к задержке.
- Бенчмаркинг: докажите победу
Контрольный список
- Токенов/сек (пропускная способность) при целевых размерах пакетов
- Время до первого токена (TTFT) и сквозная задержка на запрос
- Загрузка GPU и запас памяти при пиковой QPS
- Точность: BLEU/perplexity или task-specific evals, если вы квантуете
Используйте согласованные начальные значения и наборы подсказок для базовых показателей (PyTorch vs TensorRT-LLM), чтобы проверить правильность и дельты.
- Отладка и распространенные ошибки
- Несовпадающие версии: Согласуйте версии CUDA, драйверов и TensorRT в соответствии с официальной матрицей поддержки.
- Движок недействителен для устройства: Пересоберите движки специально для вашей архитектуры GPU.
- OOM во время сборки: Уменьшите максимальную длину последовательности или пакет; включите страничное KV-кэширование; рассмотрите возможность квантования.
- Снижение точности с INT8: Выполните калибровку на данных, репрезентативных для домена; попробуйте квантование для каждого тензора и проверьте послойную чувствительность.
- Медленный TTFT, несмотря на высокую пропускную способность: Настройте страничное KV-кэширование, включите графы CUDA и проверьте наличие узких мест в токенизаторе.
- Пример рабочего процесса: от модели Hugging Face до production
Сценарий: Вам нужна модель чата с низкой задержкой на A100.
- Выберите модель: вариант Llama/Mistral 7B–13B.
- Подготовьте: Загрузите веса и токенизатор; убедитесь, что архитектура поддерживается.
- Первый движок: FP16, максимальный вход 4K, максимальный выход 1K, пакет 4; страничное KV-кэширование включено.
- Проверьте: Сравните выходные данные с вашей базовой линией PyTorch.
- Оптимизируйте: Попробуйте INT8 или FP8; измерьте TTFT и пропускную способность. Увеличьте пакет для серверного режима.
- Обслуживайте: Используйте TGI TRT-LLM backend; масштабируйте реплики за балансировщиком нагрузки; добавьте потоковую передачу.
- Планирование затрат и мощности
- Пропускная способность на GPU: Измерьте токены/сек при целевом контексте. Используйте это для вычисления пропускной способности QPS.
- Цена за 1 миллион токенов: Благодаря более быстрому декодированию и более высокой загрузке пакетов, TRT-LLM обычно снижает стоимость токена.
- Правильно подбирайте размер движков: Создавайте отдельные движки для коротких и длинных форм, чтобы свести к минимуму потери запаса.
- Часто задаваемые вопросы внутри руководства
В: Нужно ли мне перестраивать движки для каждого типа GPU?
О: Да. Движки зависят от оборудования. Создавайте их для каждой архитектуры GPU, на которой вы будете развертывать.
В: Насколько INT8 влияет на качество?
О: Это зависит от модели и задачи. При наличии хороших данных для калибровки многие модели сохраняют качество, близкое к FP16, при этом обеспечивая значительное увеличение скорости.
В: Могу ли я работать с длинными контекстами (например, 32K)?
О: Да, но тщательно планируйте память. Используйте страничное KV-кэширование и настройте размеры блоков; обратите внимание, что более длинные контексты увеличивают размер движка и стоимость декодирования.
В: Требуется ли TGI?
О: Нет. Вы можете запускать Python/C++ напрямую. TGI удобен для HTTP API production-уровня с автомасштабированием и ведением журналов.
Стоит отметить для ускорения рабочего процесса
Если вы часто итерируете подсказки, сравниваете выходные данные между движками или документируете эксперименты, боковой AI-помощник, который поддерживает быстрые повторные попытки, выполнение блоков кода и веб-фрагменты, может ускорить ваш цикл. Кстати, Sider.AI предлагает настольный интерфейс, настроенный для инженеров — удобен для захвата тестов, тестирования подсказок и организации ваших заметок во время оптимизации вашего конвейера TensorRT-LLM. Контрольный список следующих шагов
- Прочтите официальное руководство по быстрому старту, чтобы проверить свою среду.
- Убедитесь в совместимости CUDA/TensorRT в матрице поддержки.
- Следуйте руководству по созданию движка и сначала выберите FP16.
- Если вы обслуживаете через TGI, предварительно скомпилируйте движки и настройте TRT-LLM backend.
- При желании просмотрите пошаговое руководство для моделей Hugging Face, таких как BLOOM.
Ключевые выводы
- TensorRT-LLM компилирует ваш Transformer в GPU-собственный движок для максимальной пропускной способности и снижения задержки.
- Начните с FP16, включите страничное KV-кэширование и измерьте. Затем изучите INT8/FP8 для большей скорости.
- Движки зависят от GPU и конфигурации; создавайте их для каждой целевой платформы развертывания.
- Для production объедините движки с надежным уровнем обслуживания (например, TGI) и отслеживайте TTFT, пропускную способность и качество.
FAQ
В1: Как правильно установить и настроить TensorRT-LLM?
Используйте контейнер с соответствующими CUDA/TensorRT или следуйте официальному руководству по быстрому старту и матрице поддержки, чтобы избежать расхождений версий. Проверьте драйверы GPU и инструменты сборки перед компиляцией движков.
В2: Как использовать TensorRT-LLM с моделями Hugging Face?
Загрузите модель и токенизатор, убедитесь в поддержке и преобразуйте их по мере необходимости перед созданием движка. Если вы обслуживаете с помощью TGI, скомпилируйте движки для своего GPU и укажите backend на каталог движка.
В3: Следует ли мне выбирать FP16, FP8 или INT8 для TensorRT-LLM?
Начните с FP16 для стабильности, затем попробуйте FP8/INT8, чтобы увеличить пропускную способность. Всегда проверяйте точность задачи после квантования.
В4: Могу ли я обслуживать TensorRT-LLM по HTTP?
Да. Вы можете использовать Python/C++ напрямую или обслуживать через TRT-LLM backend Hugging Face TGI для масштабируемых, готовых к production API с потоковой передачей.
В5: Каковы распространенные узкие места в производительности при использовании TensorRT-LLM?
Накладные расходы токенизатора, неоптимальная пакетная обработка и отсутствие страничного KV-кэширования являются распространенными проблемами. Настройте размеры пакетов, включите графы CUDA и отслеживайте TTFT по сравнению с общим количеством токенов в секунду.