- BrainTools - https://www.braintools.ru -

Меня зовут Антон, я DevOps-инженер в команде Data/ML-продуктов Selectel [1]. Если вам нужно запустить небольшой инференс одной ML-модели, можно взять команду бэкендеров, дать им эту модель, они обернут ее в эндпоинт — и готово. Достаточно короткого скрипта из нескольких строк на Python. Но что если нужно запускать несколько моделей, оптимизировать выполнение, работать с ансамблем моделей, задействовать CPU и GPU одновременно и т. д.? Все эти проблемы решает NVIDIA Triton Inference Server. Правда, он добавляет одну новую: разобраться с ним и его документацией — тот еще квест.
В статье посмотрим, насколько сложной задачей может оказаться создание собственного инференса и какие аспекты нужно учитывать. Научимся запускать различные форматы моделей, посмотрим на основные фичи Inference-платформы Selectel, запустим несколько популярных LLM и моделей, а также познакомимся со способами оптимизации конфигурации и проектирования интерфейса для модели.
Используете Terraform? Помогите нам сделать новый сервис лучше. Пройдите [2] короткий опрос — мы выберем самые интересные кейсы и пригласим вас на онлайн-интервью. За участие — плюшевый Тирекс или бонусы на услуги Selectel.
Используйте навигацию, если не хотите читать текст целиком:
→ Немного предыстории [3]
→ Демо Inference-платформы [4]
→ Рецепты приготовления Triton Inference Server [5]
→ Заключение [6]
В конце 2024 года мы анонсировали новый продукт — частную инсталляцию Inference-платформы Selectel [7]. За время проведения демонстраций, общения с клиентами и эксплуатации платформы мы пришли к вполне очевидному выводу — для работы с ней пользователям нужны туториалы и грамотные инструкции по NVIDIA Triton Inference Server. Сначала я написал небольшую книгу рецептов [8] с туториалами по работе с Inference-платформой Selectel и NVIDIA Triton Inference Server в целом. Но сейчас очевидно, что нужно копнуть чуть глубже и датальнее разобрать примеры.
Кстати, подробная статья о миграции на Triton и о том, зачем нужен специализированный инференс-сервер, есть в документации NVIDIA [9]. Правда, она на английском, но я уверен, вас это не остановит.
Мы же тем временем перейдем к разбору примеров работы с Inference-платформой и NVIDIA Triton Inference Server.

В этой главе я расскажу о трех сценариях, которые мы показываем на демонстрации нашего продукта. Их можно воспроизвести у себя самостоятельно, обладая следующей инфраструктурой:
Также понадобятся ноды с GPU. Для их настройки можно использовать GPU-оператор. Как это сделать, я описывал в статье на Хабре [13]. Также не забываем [14] на шаблонах групп нод включить автоскейлинг! О нем тоже есть подробная статья [15].
Что касается слоя Application, нам понадобятся следующие сервисы.
Подробные примеры с кодом для каждого сценария лежат в директории [19] нашего репозитория. Я же обозначу основные моменты в данной статье.
Для всех сценариев нужно задать конфигурацию для модели. Используем Falcon7b [20] как базовый пример деплоя с бэкендом на Python. Структуру репозитория можно посмотреть на GitHub [21]. Сам же пример был взят из другого репозитория [22] — здесь мы хотели показать, как использовать бэкенд Python для работы с моделями с Hugging Face. Сейчас же лучше использовать формат VLLM или TensorRT, если вы хотите деплоить такие модели в продакшн.
Все файлы заливаем в объектное хранилище, например, утилитой Rclone [23]. Заполним конфигурационный файл:
provider = other
env_auth = false
access_key_id = #сюда вставьте ваш access key от объектного хранилища
secret_access_key = #сюда вставьте ваш secret key от объектного хранилища
region = ru-1
endpoint = s3.ru-1.storage.selcloud.ru
```
И загрузим конфигурацию модели в бакет S3:
```
rclone copy model_repository/ selectel:<bucket_name>/model_repository
На этом базовая подготовка закончена, можно приступать к деплою Triton!
Суть сценария заключается в получении эндпоинта из нашей модели.

Ничего сложного — просто получение эндпоинта HTTP/GRPC нашей модели.
Мы взяли за основу чарт с GitHub [24]. Дописали работу с Istio, объектным и файловым хранилищами. Для своих опытов вы можете использовать пример от NVIDIA, в случае работы с нашей платформой — следуйте инструкциям в репозитории [25].
После деплоя вам будет доступен дашборд Grafana, где указываются статусы Triton, метрики насыщения, данные GPU, логи и трафик.

Дашборд Inference-платформы.
В целом, вы сами сможете реализовать такой дашборд с помощью этих референсов:
Проверим работоспособность инференса:

Проверить работу инференса можно с помощью Curl.
В следующем сценарии рассмотрим, что будет с инференсом под нагрузкой.
В этом сценарии мы подадим нагрузку на наш инференс-сервер. В values [29] чарта укажем параметры автоскейлинга и таргет, по которому будет происходит масштабирование.
autoscaling:
minReplicas: 1
maxReplicas: 2
metrics:
- type: Pods
pods:
metric:
name: avg_time_queue_us
target:
type: AverageValue
averageValue: 1000000000m

Этапы автоскейлинга. Подробнее я описывал в статье об автоскейлинге инференса на GPU в Kubernetes [15].
Метрику avg_time_queue_us создает Prometheus-адаптер, используя формулу:
- seriesQuery: 'nv_inference_queue_duration_us{namespace!="",pod!=""}'
resources:
overrides:
namespace:
resource: "namespace"
pod:
resource: "pod"
name:
matches: "nv_inference_queue_duration_us"
as: "avg_time_queue_us"
metricsQuery: 'avg(rate(nv_inference_queue_duration_us{<<.LabelMatchers>>}[30s])/(1+rate(nv_inference_request_success{<<.LabelMatchers>>}[30s]))) by (<<.GroupBy>>)'
Нагрузку я подаю с помощью утилиты perf_analzyer. Вы же можете использовать locust, k6 и другие инструменты нагрузочного тестирования. Отправим десять одновременных запросов от пользователей в течении 100 секунд.
perf_client -u $INFERENCE_URL -m falcon7b --input-data data.json -v --output-tensor-format=json --input-tensor-format=json --concurrency-range 10 -p 200000 --request-period 100

Как видно из графика, нагрузка уменьшилась в два раза после аллоцирования новой реплики.
Перейдем к последнему сценарию. Проверим возможность обновлять модели без даунтаймов.
Мы задеплоим две версии модели и подадим 90% трафика на первую версию, 10% — на вторую.

Канареечный деплой работает и для инференсов тоже.
В этом сценарии активно участвуют Istio и kiali. Istio перенаправляет трафик на нужные версии Triton. В нашем случае это отдельные инсталляции деплоймента в values [30].
После деплоя и подачи трафика на эндпоинт мы можем посмотреть анимацию трафика в kiali. В этом сервисе можно отслеживать статусы ошибок запросов на каждую версию, а также изменить процентное соотношение трафика.

Kiali предоставляет интерфейс для отслеживания трафика между версиями моделей.
В следующей главе мы рассмотрим альтернативные сценарии работы с Triton: как он работает с различными форматами моделей, популярными LLM и как можно подобрать оптимальный конфигурационный файл.
Итак, мы посмотрели, как работают основные фичи Inference-платформы Selectel. В этой главе расширим список доступных для нас функциональностей за счет использования ядра платформы Triton Inference Server.
Я подготовил несколько примеров по использованию различных форматов моделей. Для каждого формата у Triton реализован отдельный бэкенд. Он также предоставляет возможность реализовывать свои бэкенды, если готовые не подходят.
Эти примеры предназначены для демонстрации гибкости Triton Inference Server в работе с различными форматами моделей и бэкендами, а также для предоставления практических примеров развертывания и использования моделей в различных сценариях.
Достаточно популярная на данный момент модель предоставления LLM as a Service — Foundation models. В Triton мы можем использовать два бэкенда: TensorRT LLM [39] и vLLM [40].
Как выбрать между двумя? Если нужны удобство и большой парк моделей, выбирайте VLLM. Если в приоритете производительность инференса, но есть сложности в конфигурации, присмотритесь к TensorRT.
Для импорта конфигурации модели каждого из бэкендов я рекомендую использовать утилиту triton_cli [43]. С помощью простых команд она создаст для вас конфигурацию как для VLLM, так и для TensorRT.
В наших рецептах есть примеры работы как с vLLM [44], так и с TensorRT для Whisper [45]. Вы можете попробовать развернуть эти модели через Helm-чарт или в Docker-контейнере.
Также вы можете найти примеры с использованием импорта моделей из Hugging Face [46] с помощью бэкенда Python и использованием Stable Diffusion [47], где реализован собственный бэкенд для работы с этой моделью в формате TensorRT.
При использовании Triton, возможно, вы задаетесь вопросом, как правильно подобрать формат модели и конфигурацию инференс-сервера. Как вы могли заметить, конфигураций бывает достаточно много. Концептуально я отвечал на этот вопрос в ретроспективе разработки нашей Inference-модели [48].

Как может выглядеть пайплайн поиска лучшего формата модели и конфигурации.
В нашем репозитории с рецептами я выделил два примера: с Model Navigator [49] и Model Analyzer [50].
Model Navigator [51] — это инструмент для оптимизации и развертывания моделей глубокого обучения, разработанный для работы с NVIDIA GPU. Он автоматизирует процессы экспорта, конверсии, тестирования корректности и профилирования моделей, поддерживая такие фреймворки, как PyTorch, TensorFlow и ONNX. Model Navigator позволяет пользователям эффективно искать лучшие варианты развертывания моделей, предоставляя единый интерфейс для различных фреймворков.
Для подготовки моделей к эксплуатации на NVIDIA Triton Inference Server необходимо выполнить несколько действий.
Model Analyzer [52] — это инструмент CLI, который поможет найти оптимальную конфигурацию на имеющемся оборудовании для одиночной, множественной, ансамблевой или BLS-модели, запущенной на Triton Inference Server. Сервис также генерирует отчеты, чтобы помочь лучше понять компромиссы различных конфигураций и их требования к вычислительным ресурсам и памяти [53]. Он запускает несколько инференс-сервисов с Triton и подает нагрузку на них с помощью perf_client [54] — утилиты для высоконагруженных тестов. Далее формирует отчет, в котором указана оптимальная конфигурация, где perf_client показал лучшую производительность.
Стоит отметить, что для подбора конфигурации LLM Model Analyzer работать не будет, для подробностей смотрите pull request [55]. Разработчики рекомендуют для подбора конфигурации в этом случае использовать genai perf в режиме analyze [56].
После деплоя модели в Infererence-платформу вы получается эндпоинт. Но это не конечное приложение для пользователей. Оно скорее нужно, если вы хотите предоставить им интерфейс для работы с моделями. Например, для личного ChatGPT это может быть OpenWebUI [57], а для собственного генератора картинок — Automatic1111 [58].
Если рассматривать небольшие приложения, можно использовать несколько рецептов из нашего репозитория [59]. Например, вы хотите создать Telegram-бота [60]. Рецепт достаточно прост — деплоим Whisper [61] в Inference-платформу, подключаем эндпоинт и самого бота. Теперь вам доступен транскибатор аудио даже без премиум-аккаунта в Telegram!

Сравниваем транскрибатор Telegram и наш собственный.
Также стоит упомянуть отличный фреймворк Gradio [62]. Мы также подготовили рецепт [63] его сборки для нашего эндпоинта. Он позволяет на Python достаточно просто создать интерфейс для взаимодействия с моделями.
Как вы могли заметить, в текущей версии Inference-платформы нужно обладать навыками работы с Kubernetes. Она задумывалась как частная инсталляция в проект клиента с возможностью кастомизировать каждый параметр платформы под его нужды. Следовательно, инсталляция скорее всего подойдет в случаях, когда у вас есть команда инженеров, способных работать с K8s.
Сейчас мы разрабатываем PaaS-версии платформы, где первым этапом вы сможете запускать уже известные LLM по концепции foundation models. В этой версии вы не будете напрямую взаимодействовать с K8s — только через API и веб-интерфейс! И здесь мы ищем Gо-разработчика [64], который поможет нашей команде создать качественный продукт.
Автор: antonaleks605
Источник [65]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/14352
URLs in this post:
[1] в команде Data/ML-продуктов Selectel: https://selectel.ru/solutions/artificial-intelligence-machine-learning/
[2] Пройдите: https://forms.selectel.ru/s/cm99r3fdr470ovp01bfglc6ej?utm_source=habr.com&utm_medium=referral&utm_campaign=terraform_article_tritoncook_170425_banner_077_03_ord
[3] Немного предыстории: #1
[4] Демо Inference-платформы: #2
[5] Рецепты приготовления Triton Inference Server: #3
[6] Заключение: #4
[7] Inference-платформы Selectel: https://selectel.ru/services/cloud/inference-platform/
[8] небольшую книгу рецептов: https://github.com/selectel/inference-platform-tutorials
[9] в документации NVIDIA: https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/tutorials/Migration_Guide/migration_guide.html
[10] Kubernetes: https://selectel.ru/services/cloud/kubernetes/?utm_source=habr.com&utm_medium=referral&utm_campaign=kubernetes_article_tritoncook_170425_content
[11] объектное хранилище: https://selectel.ru/services/cloud/storage/?utm_source=habr.com&utm_medium=referral&utm_campaign=storage_article_tritoncook_170425_content
[12] файловое хранилище: https://selectel.ru/services/cloud/file-storage/
[13] в статье на Хабре: https://habr.com/ru/companies/selectel/articles/839528/
[14] забываем: http://www.braintools.ru/article/333
[15] подробная статья: https://habr.com/ru/companies/selectel/articles/844026/
[16] из репозитория: https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack
[17] в репозитории: https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-adapter
[18] с GitHub: https://istio.io/latest/docs/setup/install/helm/
[19] в директории: https://github.com/selectel/inference-platform-tutorials/tree/main/demo-inferp
[20] Falcon7b: https://huggingface.co/tiiuae/falcon-7b
[21] на GitHub: https://github.com/selectel/inference-platform-tutorials/tree/main/demo-inferp/falcon7b/model_repository/falcon7b
[22] из другого репозитория: https://github.com/triton-inference-server/tutorials/tree/main/Quick_Deploy/HuggingFaceTransformers
[23] Rclone: https://docs.selectel.ru/cloud/object-storage/tools/rclone/
[24] чарт с GitHub: https://github.com/triton-inference-server/server/blob/main/deploy/k8s-onprem/README.md
[25] в репозитории: https://github.com/selectel/inference-platform-tutorials/blob/main/demo-inferp/Readme.md
[26] дашборд : https://grafana.com/grafana/dashboards/14876-grafana-loki-dashboard-for-istio-service-mesh/
[27] дашборд DCGM: https://grafana.com/grafana/dashboards/12239-nvidia-dcgm-exporter-dashboard/
[28] дашборд Triton: https://github.com/triton-inference-server/server/blob/main/deploy/k8s-onprem/dashboard.json
[29] values: https://github.com/selectel/inference-platform-tutorials/blob/main/demo-inferp/autoscaling_scenario.yaml
[30] в values: https://github.com/selectel/inference-platform-tutorials/blob/main/demo-inferp/canary_scenario.yaml
[31] ONNX: https://github.com/selectel/inference-platform-tutorials/blob/main/models-format-tutorial/ONNX
[32] OpenVINO: https://github.com/selectel/inference-platform-tutorials/blob/main/models-format-tutorial/OpenVino
[33] TensorFlow: https://github.com/selectel/inference-platform-tutorials/blob/main/models-format-tutorial/TensorFlow
[34] Python: https://github.com/selectel/inference-platform-tutorials/blob/main/models-format-tutorial/Python
[35] PyTorch: https://github.com/selectel/inference-platform-tutorials/blob/main/models-format-tutorial/PyTorch
[36] обучения: http://www.braintools.ru/article/5125
[37] TensorRT: https://github.com/selectel/inference-platform-tutorials/blob/main/models-format-tutorial/TensorRT
[38] FIL backend: https://github.com/triton-inference-server/fil_backend
[39] TensorRT LLM: https://github.com/triton-inference-server/tensorrtllm_backend
[40] vLLM: https://github.com/triton-inference-server/vllm_backend
[41] в репозитории NVIDIA: https://nvidia.github.io/TensorRT-LLM/reference/support-matrix.html
[42] в документации vLLM: https://docs.vllm.ai/en/latest/models/supported_models.html
[43] triton_cli: https://github.com/triton-inference-server/triton_cli
[44] vLLM: https://github.com/selectel/inference-platform-tutorials/blob/main/LLM-and-Popular-models-tutorials/vLLM/Readme.md
[45] с TensorRT для Whisper: https://github.com/selectel/inference-platform-tutorials/tree/main/LLM-and-Popular-models-tutorials/whisper
[46] из Hugging Face: https://github.com/selectel/inference-platform-tutorials/tree/main/LLM-and-Popular-models-tutorials/HuggingFaceTransformers
[47] Stable Diffusion: https://github.com/selectel/inference-platform-tutorials/tree/main/LLM-and-Popular-models-tutorials/stable-diffusion
[48] в ретроспективе разработки нашей Inference-модели: https://habr.com/ru/companies/selectel/articles/867972/%234
[49] с Model Navigator: https://github.com/selectel/inference-platform-tutorials/tree/main/optimization/model-navigator
[50] Model Analyzer: https://github.com/selectel/inference-platform-tutorials/blob/main/optimization/model-analyzer/quick-start.md
[51] Model Navigator: https://github.com/triton-inference-server/model_navigator/tree/main
[52] Model Analyzer: https://github.com/triton-inference-server/model_analyzer
[53] памяти: http://www.braintools.ru/article/4140
[54] perf_client: https://docs.nvidia.com/deeplearning/triton-inference-server/archives/triton_inference_server_1140/user-guide/docs/perf_client.html
[55] pull request: https://github.com/triton-inference-server/model_analyzer/pull/959
[56] genai perf в режиме analyze: https://github.com/triton-inference-server/perf_analyzer/blob/main/genai-perf/docs/analyze.md
[57] OpenWebUI: https://github.com/open-webui/open-webui
[58] Automatic1111: https://github.com/AUTOMATIC1111/stable-diffusion-webui
[59] репозитория: https://github.com/selectel/inference-platform-tutorials/tree/main/UI-examples
[60] Telegram-бота: https://github.com/selectel/inference-platform-tutorials/tree/main/UI-examples/telegram
[61] Whisper: https://github.com/selectel/inference-platform-tutorials/blob/main/LLM-and-Popular-models-tutorials/whisper/Readme.md
[62] Gradio: https://www.gradio.app/
[63] рецепт: https://github.com/selectel/inference-platform-tutorials/tree/main/UI-examples/gradio
[64] Gо-разработчика: https://selectel.ru/careers/all/vacancy/1051/?utm_source=habr.com&utm_medium=referral&utm_campaign=career_article_tritoncook_170425_content
[65] Источник: https://habr.com/ru/companies/selectel/articles/901358/?utm_campaign=901358&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.