Хочешь запустить большую языковую модель в продакшене, но не знаешь, как совместить простоту развертывания с промышленной надежностью? Комбинация vLLM и TorchServe решает эту задачу. Она обеспечивает как простой запуск, так и продвинутые возможности для масштабирования.
Этот материал взят из нашей еженедельной email-рассылки, посвященной ИИ. Подпишитесь, чтобы быть в числе первых, кто получит дайджест.
(function () { let link = document .getElementById ("27597fb0-2799-44e7-a1e4-24b624262865-https://proglib.io/w/f1df5b2d-2"); if (! link) return; let href = link .getAttribute ("href"); if (! href) return; let prefix = link .dataset .prefix; let action = link .dataset .action; link .addEventListener ("click", function (e) { let data = new FormData (); data .append ("url", href); apiFetch (action, { method: "POST", body: data }) .then (function (res) {}) .catch (function (err) { console .error (err); }); }) })();
vLLM – один из самых подходящих движков для простого запуска LLM: он предоставляет команду vllm serve для развертывания на одной машине. Однако для развертывания в продакшене требуются дополнительные продвинутые функции, которых у него нет. Такие возможности есть у TorchServe:
- Пользовательские метрики.
- Версионирование моделей.
- Гибкие обработчики, позволяющие легко интегрировать генерацию с дополнением из базы знаний (RAG) и защитные механизмы вроде Llama Guard.
Поэтому логично объединить движок vLLM с TorchServe для создания полноценного решения по запуску LLM в продакшене.
Процесс развертывания включает:
1. Сборка Docker-образа
2. Запуск контейнера с моделью
3. Тестирование
При развертывании с помощью vLLM с TorchServe:
- Веса модели хранятся в локальной папке data.
- Используется скрипт ts.llm_launcher для упрощения запуска.
- Поддерживается автоматическое распараллеливание на нескольких GPU.
- Возможно создание model archive для доступа к расширенным функциям.
Важно отметить, что простой запуск через ts.llm_launcher не дает доступа ко всем возможностям TorchServe. Для использования продвинутых функций (RAG, версионирование) требуется создание model archive, что сложнее, зато обеспечивает большую гибкость, надежность и масштабируемость в продакшене. Прежде, чем мы рассмотрим, как это сделать, стоит разобраться в особенностях интеграции vLLM и TorchServe.
Интеграция движка vLLM в TorchServe
vLLM предлагает множество продвинутых функций, среди которых:
- PagedAttention – эффективное управление памятью.
- Непрерывная пакетная обработка.
- Быстрое выполнение модели через CUDA Graphs.
- Поддержка различных методов квантования – GPTQ, AWQ, INT4/INT8/FP8.
- Интеграция с методами эффективной настройки параметров (LoRA).
- Поддержка моделей с различными архитектурами (Llama*, Mistral).
*Meta и все ее продукты, включая Llama, признаны экстремистскими и запрещены на территории РФ.
Раньше TorchServe использовал синхронный режим, ожидая либо определенное время (batch_delay), либо достаточное количество запросов (batch_size). Теперь он может работать в асинхронном режиме, и запросы сразу передаются в бэкенд для обработки vLLM. Интеграция vLLM в TorchServe позволяет эффективно использовать сильные стороны этих инструментов, обеспечивая оптимальное использование ресурсов и гибкие возможности масштабирования. Вот основные преимущества интеграции:
Оптимизация памяти
- vLLM получает полный контроль над тем, какие запросы обрабатывать.
- Использует PagedAttention для оптимального комбинирования запросов разной длины.
- Работает как «Тетрис», заполняя неиспользуемые участки памяти.
Распределенный вывод
- Поддержка работы на нескольких GPU на одном узле.
- Использование распараллеливания для больших моделей.
- Кастомный параллелизм для запуска единого процесса бэкенда.
Гибкость настройки
- VLLMHandler позволяет быстро развертывать любую совместимую модель.
- Возможность добавления пользовательских шагов предобработки и постобработки.
- Поддержка потокового режима для немедленной отправки токенов.
Для развертывания LLM используется отдельный Dockerfile, основанный на GPU-образе TorchServe и оптимизированный для минимизации размера образа.
Статья по теме
🤖 ИИ в кармане: 11 лучших инструментов для работы с ИИ-моделями
Пошаговый гайд
Подготовка
После установки TorchServe нужно установить vLLM:
Загрузка весов модели (опционально)
Веса сохраняются в $HF_HOME. Можно пропустить этот шаг – тогда vLLM скачает веса при запуске.
Конфигурация модели
Создайте YAML-файл с параметрами фронтенда и обработчика:
Создание архива модели
Здесь используется формат no-archive для удобства экспериментов, веса модели не включаются в архив:
Развертывание
Здесь аутентификация отключена только для локального тестирования, не забудьте включить ее в продакшене:
Тестирование
В интеграции используется OpenAI-совместимый формат API, поддерживается как потоковый stream=1, так и пакетный stream=0 режимы ответов:
Заключение
Главные преимущества этой интеграции:
- Гибкая конфигурация через YAML.
- Поддержка распределенного вывода на нескольких GPU.
- Совместимость с OpenAI API.
- Возможность потоковой генерации ответов.
- Простота развертывания в Docker/Kubernetes.
В планах разработчиков – реализация поддержки мульти-узлового вывода и создание готового Docker-образа для максимального упрощения процесса развертывания.
С какими сложностями вы сталкивались при развертывании LLM в продакшене? Поделитесь своим опытом и расскажите, как решали эти проблемы.
***
🤖 Для тех, кто хочет разобраться в машинном обучении
Курс «Базовые модели ML и приложения» — ваш компактный гид в мир машинного обучения.
Что тебя ждет:
- Концентрированные знания от практика из Stripe
- Фокус на трех ключевых областях: ансамбли, рекомендательные системы, нейросети
- Баланс теории и практики для решения реальных задач
Особенности курса:
- Доступное изложение сложных концепций
- Видеолекции и текстовые материалы
- Пожизненный доступ к контенту
(function () { let link = document .getElementById ("27597fb0-2799-44e7-a1e4-24b624262865-https://proglib.io/w/c995278f-60"); if (! link) return; let href = link .getAttribute ("href"); if (! href) return; let prefix = link .dataset .prefix; let action = link .dataset .action; link .addEventListener ("click", function (e) { let data = new FormData (); data .append ("url", href); apiFetch (action, { method: "POST", body: data }) .then (function (res) {}) .catch (function (err) { console .error (err); }); }) })();