Предыстория и мотивация

Позвольте мне вернуть вас на несколько месяцев назад и поделиться историей. В то время я встретился со старым другом, и, поскольку мы оба инженеры, наш разговор быстро перешел к техническим проблемам. Именно во время этого обмена мы наткнулись на проблему, связанную с оптимизацией обслуживания моделей машинного обучения. Наше любопытство заставило нас углубиться в этот вопрос. Впоследствии мы связались с другим другом, тоже инженером, который подтвердил, что столкнулся с таким же препятствием. Повторение этой проблемы привлекло наше внимание, побуждая нас поверить, что мы что-то нашли. Осознавая отсутствие адекватных инструментов для решения этой проблемы, мы приняли решение взять дело в свои руки и разработать решение. По сути, это краткий рассказ о рождении HuggingBench.

Если вам интересно, зачем кому-то оптимизировать обслуживание/вывод модели, позвольте мне поделиться коротким абзацем из исследовательской статьи:

Несколько источников, в том числе компании из технологического сектора, такие как Amazon или NVIDIA, оценивают, что логические выводы могут превышать стоимость обучения в широко распространенных системах, и что логические выводы составляют до 90% затрат на машинное обучение для развернутых систем ИИ.

Очевидно, что модельный вывод может быть огромным источником затрат, и мы тоже с этим столкнулись. Вероятно, это не относится к каждой компании, занимающейся машинным обучением, поскольку вам нужно достичь определенного масштаба, чтобы иметь эти проблемы, но использование машинного обучения быстро растет, как и затраты на логические выводы. К счастью, существует множество отличных инструментов с открытым исходным кодом, которые могут помочь в оптимизации логического вывода. Однако кому-то нужно соединить все точки (интегрировать различные инструменты), а также автоматизировать весь процесс оптимизации, поиска данных, экспериментов, бенчмаркинга и визуализации. Нетривиальный объем работы, который так или иначе наверняка повторяется во множестве разных компаний.

Оптимизация моделей машинного обучения (ML) для получения логических выводов с точки зрения пропускной способности, задержки и использования ресурсов является сложной задачей. На это есть несколько причин:

  • Сложность моделей. В частности, модели глубокого обучения могут быть довольно большими и сложными. Различные архитектуры могут по-разному реагировать на методы оптимизации. Например, сокращение может хорошо работать для плотной нейронной сети, но не так эффективно для конкретной сверточной нейронной сети.
  • Компромиссы. Часто приходится идти на компромисс между точностью и скоростью. Например, квантование модели (снижение точности ее весов) может сделать ее быстрее и меньше, но может снизить ее точность.
  • Аппаратная изменчивость. Оптимизация модели для ЦП может отличаться от оптимизации для ГП или ТПУ. Даже внутри процессоров то, что оптимально для одной архитектуры (например, Intel Skylake), может не подойти для другой.
  • Динамические рабочие нагрузки. Оптимальная конфигурация модели может меняться в зависимости от конкретной рабочей нагрузки или данных, с которыми она сталкивается в рабочей среде. Это особенно актуально для систем, в которых наблюдается переменная частота запросов или сдвиги в распределении данных.
  • Инструменты и опыт. Хотя существуют такие инструменты, как TensorFlow Lite, NVIDIA TensorRT и OpenVINO, которые помогают оптимизировать модели для конкретных платформ, для их эффективного использования требуются специальные знания. Автоматические решения, работающие во всех сценариях и архитектурах, по-прежнему не являются решенной проблемой.
  • Итеративный процесс. Процесс оптимизации часто является итеративным, и универсального решения не существует. Вы вносите изменения, измеряете их влияние, а затем решаете, что делать дальше. Необходима повторная оценка. Это может занять много времени.
  • Меняющийся ландшафт. Область машинного обучения быстро развивается. Часто появляются новые архитектуры, методы и аппаратные платформы, а это означает, что лучшие методы оптимизации также могут меняться со временем.

Хотя существуют инструменты и методы, помогающие оптимизировать модели машинного обучения для производства, быстрое и простое достижение «наиболее оптимальной» конфигурации остается сложной задачей из-за взаимодействия различных факторов. HuggingBench настроен на простой поиск оптимальной конфигурации для всех существующих решений и оборудования надежным, удобным для разработчиков способом с высокой степенью точности производства.

Демократизация модели обслуживания

С такими платформами, как HuggingFace, у нас теперь есть огромное количество моделей машинного обучения с открытым исходным кодом на кончиках наших пальцев. Теперь задача смещается на запуск этих моделей в производство и предоставление определенных гарантий с точки зрения задержки и пропускной способности без увеличения вашего бюджета на инфраструктуру.

Нам нравится подход HuggingFace к демократизации моделей машинного обучения, особенно с учетом аспектов сообщества и открытого исходного кода. Опробовать модели машинного обучения от HuggingFace легко, и они отлично справились со своим API. Мне нравится, как HuggingFace абстрагируется от сложностей, связанных с выполнением выводов, работой с наборами данных, тонкой настройкой, оптимизацией… Под капотом HuggingBench используются некоторые из замечательных библиотек с открытым исходным кодом от HuggingFace, такие как Optimum https://github.com/huggingface/optimum. . Таким образом, HuggingFace вдохновил нас на создание платформы, которая скроет множество сложностей, связанных с оптимизацией моделей и экспериментами. Мы хотим решить проблемы, которые, по нашему мнению, остались нерешенными, и еще больше демократизировать использование модели машинного обучения. Возможность легко развертывать модели в управляемой инфраструктуре — это здорово, но что, если вы хотите запустить собственную модель машинного обучения и иметь полный контроль над ней? Внезапно возникает множество вопросов без ответов.

Как запустить модель ML в «производственной» настройке? Какой сервер вывода использовать? Как оптимизировать модель и настроить параметры сервера для максимальной эффективности? С какой пропускной способностью могут справиться модели машинного обучения? А как насчет задержки и эксплуатационных расходов? Какое оборудование выбрать? Как оптимизировать модель с помощью квантования, обрезки и т. д.

Ответы на приведенные выше вопросы обычно требуют большого количества ручных шагов, и это может быть очень утомительной и трудоемкой работой.

Мы разрабатываем наш инструмент, чтобы обеспечить бесперебойную работу пользователей HuggingFace в их стремлении найти идеальную настройку логического вывода. В этом контексте пользователю просто нужно предоставить идентификатор модели HuggingFace, с которым он хочет поэкспериментировать, что делает процесс невероятно простым. Например, найти оптимальную настройку для запуска модели Microsoft ResNet-50 очень просто:

hbench triton --id microsoft/resnet-50 --device gpu --batch_size 1 4 --client_workers 4 8 --instance_count 1 4 --format trt

HuggingBench становится вашим надежным компаньоном, упрощая и оптимизируя весь процесс. Вот как:

  • Преобразование модели. Существует множество форматов моделей машинного обучения, каждый из которых обладает своими сильными сторонами и служит определенным целям. Например, PyTorch — это формат, удобный для разработчиков, но неэффективный для обслуживания режимов, OpenVINO — это формат, дружественный к процессору, формат ONNX отлично подходит для выполнения оптимизаций, TensorRT действительно хорошо оптимизирован для логических выводов и т. д. Мы помогаем вам легко конвертировать модели в такие форматы, как ONNX, TensorRT. (ТРТ) и OpenVINO.
  • Оптимизация модели. Квантование — это один из методов повышения эффективности обслуживания моделей. По сути, это компромисс между точностью модели и эффективностью. HuggingBench делает все возможное, квантуя модели, когда это применимо, предлагая выбор между точностью с плавающей запятой 32 (fp32) и точностью с плавающей запятой 16 (fp16) (int8 скоро появится)
  • Универсальное развертывание. Для изучения различных вариантов наиболее оптимальной настройки требуется несколько развертываний. (подумайте о другой конфигурации, оборудовании и т. д.). Мы автоматизируем развертывание моделей в различных конфигурациях с помощью Docker, что облегчает быстрое экспериментирование и сравнение различных настроек.
  • Тестирование под нагрузкой.Оценка того, как модельный сервер справляется с определенной нагрузкой, является хорошо известным методом тестирования производительности. Цель состоит в том, чтобы гарантировать, что система может справляться с определенными рабочими нагрузками без деградации или сбоя. HuggingBench позволяет оценить производительность модели в различных условиях, таких как параллелизм и пакетная обработка. Эта функция обеспечивает ценную информацию об общем поведении и масштабируемости системы.
  • Комплексные метрики.Метрики — это один из основных столпов наблюдаемости. Наблюдение за системами во время бенчмаркинга может помочь нам лучше понять узкие места или обнаружить неожиданное поведение. Во время бенчмаркинга HuggingBench записывает показатели производительности и представляет их в виде проницательных диаграмм и информационных панелей на базе Grafana и Prometheus. Эти наглядные пособия дают вам возможность принимать обоснованные решения.

Хотя HuggingBench все еще находится на ранней стадии разработки, важно устранить некоторые текущие ограничения (мы надеемся решить многие из них по мере продвижения). В настоящее время тесты и эксперименты выполняются в контейнерах Docker на одном компьютере. Это означает, что пользователю необходимо вручную подготовить виртуальную машину и установить HuggingBench, и мы надеемся вскоре внедрить автоматическую подготовку в кластере Kubernetes. Кроме того, проверки точности при преобразовании и оптимизации модели еще не реализованы, а это означает, что этот инструмент еще не готов к работе. Будьте уверены, наша команда активно работает над решением этих проблем и расширением возможностей инструмента. Ваши отзывы бесценны в этом путешествии, и мы призываем вас внести свой вклад, создав проблемы или сообщив об ошибках в нашем репозитории GitHub.

Имейте в виду, что если вы используете управляемые облачные решения для запуска своих моделей машинного обучения, HuggingBench, вероятно, не для вас. Однако, если вы управляете своими серверами логических выводов, вы, вероятно, сможете извлечь выгоду из автоматизированного экспериментирования и оптимизации обслуживания моделей.

Одной из первых проблем, с которыми мы столкнулись, был выбор сервера логического вывода. Мы все являемся свидетелями быстрых изменений в сфере машинного обучения, и это здорово. Однако из-за этого трудно оставаться на вершине игры и иметь возможность выбрать лучший инструмент (сервер) для задачи. Большинство серверов логических выводов используют свои собственные эталонные показатели, но эти числа в основном сравнивают данный сервер с базовым вариантом, который обслуживает модель PyTorch. Это затрудняет легкое сравнение между серверами A и B. Поэтому наша цель — помочь пользователям легко добавлять новые серверы логических выводов в HuggingBench и проводить эксперименты, которые могут сравнивать различные серверы. Каждый сервер логических выводов становится подключаемым модулем, и пользователи могут проводить эксперименты, которые могут помочь в принятии обоснованных решений при выборе сервера логических выводов. На данный момент мы внедрили сервер Nvidia Triton, так как он прошел боевые испытания и поддерживает несколько серверных частей (это означает, что один сервер может работать с несколькими форматами моделей, такими как ONNX, TritonRT, OpenVino…).

Мы будем публиковать обновления нашей работы по мере продвижения в нашем путешествии. Напоследок хочу поделиться несколькими скриншотами, сделанными во время игры с HuggingBench. В следующем сообщении в блоге мы подробно расскажем об использовании HuggingBench, чтобы найти оптимальную настройку логического вывода для некоторых популярных моделей с открытым исходным кодом, доступных на HuggingFace. Оставайтесь с нами 😉!

Если вы так же увлечены этой темой или у вас есть идеи, вопросы, мнения или опыт, которыми вы хотели бы поделиться, не стесняйтесь комментировать или обращаться ко мне в Twitter или LinkedIn.