Представляем Truss, библиотеку с открытым исходным кодом для упаковки и развертывания моделей.

Модельное обслуживание — это не просто сложная проблема, это сложная проблема, которая постоянно требует новых решений.

Обслуживание моделей как часть MLOps — это задача DevOps, заключающаяся в том, чтобы сложный и хрупкий артефакт (модель) работал в нескольких динамических средах. По мере создания и обновления фреймворков для обучающих моделей, а также развития производственных сред с учетом новых возможностей и ограничений, специалистам по обработке и анализу данных приходится заново реализовывать сценарии обслуживания моделей и перестраивать процессы развертывания моделей.

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

Краткое введение: я Тухин Шривастава, генеральный директор Baseten, где впервые была разработана ферма. Работая над тем, чтобы выяснить, что нужно специалистам по данным для реализации MLOps, мы поговорили с лидерами в области обработки данных и услышали такие вещи, как:

  • «Мы хотели избежать каких-либо нестандартных DevOps для самих моделей хостинга. Если бы мы делали это сами, нам, вероятно, пришлось бы развернуть собственный Docker на виртуальных машинах или кластерах Kubernetes, а затем нам пришлось бы позаботиться обо всех связанных с этим вещах DevOps». — Фааез Уль. Хак, руководитель отдела науки о данных @ Pipe
  • «Наша команда состоит в основном из специалистов по данным и лингвистов — мы не являемся экспертами DevOps. Мы можем писать на Python, но не хотим целыми днями писать конфигурацию YAML». — Дэниел Уайтнак, специалист по данным @ SIL.

Рабочей средой специалиста по данным является ноутбук Jupyter, гибкая система с широкими возможностями, предназначенная для повторяющихся экспериментов. Блокнот Jupyter — отличный инструмент для обучения моделей, но как непостоянная и ориентированная на разработку среда не подходит для обслуживания моделей. Для обслуживания моделей требуются такие технологии, как Docker, для создания стабильной и предсказуемой среды.

Как специалисты по обработке данных справляются с обслуживанием моделей сегодня

Обслуживание модели в производстве обычно сводится к нескольким шагам:

  1. Сериализация модели
  2. Поместите модель за веб-сервером, таким как Flask
  3. Упакуйте веб-сервер в образ Docker
  4. Запустите образ Docker в контейнере

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

Но большая проблема заключается в том, что даже основные шаги различаются для каждой среды, а иногда и для разных моделей, созданных с использованием одной и той же среды. Поэтому, даже если вы знаете, как обслуживать модель TensorFlow, вам придется заново учиться обслуживать модель PyTorch и заново проходить этот процесс, когда вы попробуете модель из Hugging Face.

«Ну, все в порядке, — можете сказать вы, — я просто собираюсь использовать одну среду моделирования. Я буду инженером TensorFlow ML». Дело в том, что у нас нет разных фреймворков, потому что специалисты по данным плохо соглашаются. Потому что разные проблемы требуют разных подходов. Каждая популярная среда моделирования превосходна в различных типах базовых алгоритмов и структур. Но технологии обслуживания моделей не обязательно должны быть разрозненными.

Пакеты с открытым исходным кодом, такие как Cog, BentoML и MLflow, помогают упростить процесс развертывания модели. Мы хотели расширить эти идеи и разработать библиотеку с открытым исходным кодом специально для специалистов по обработке и анализу данных в стартапах. Два наших ключевых убеждения:

  1. Создание для пользователей Python. Как специалисты по обработке и анализу данных, Python — это наша зона комфорта. Нам нужна была библиотека развертывания модели, которой можно было бы полностью управлять в Python.
  2. Работа с любой моделью и платформой. Нам нужен был пакет с открытым исходным кодом, который мог бы обрабатывать развертывание модели независимо от ее структуры и облачной платформы.

Руководствуясь этими идеями, мы создали Truss с открытым исходным кодом.

Как обслуживание моделей работает с Truss

Шаг 1: Упаковка стандартизированной модели

Мы находимся в блокноте Jupyter на нашем локальном компьютере, домашнем поле специалиста по данным. Используя трансформеры Hugging Face, мы введем модель t5-small в качестве конвейера для этого примера.

from transformers import pipeline
import truss
 
pipe = pipeline(tokenizer="t5-small", model="t5-small")
scaf = truss.mk_truss(pipe, target_directory="my_model")

Hugging Face — одна из многих популярных платформ, включая LightGBM, PyTorch, scikit-learn, TensorFlow и XGBoost (скоро появятся и другие), которые Trus поддерживает из коробки. Таким образом, все, что нам нужно сделать, это запустить mk_truss на модели, и все будет сериализовано и упаковано, готовое к использованию.

Шаг 2: Прочное местное развитие

С нашей фермой мы можем вызвать модель в нашей среде Jupyter:

print(scaf.server_predict({"inputs" : ["translate: hello world in german"]}))
# Expected result is {'predictions': [{'translation_text': 'Übersetzen: Hallo Welt in deutsch'}]}

Но Truss выходит за рамки вызова модели в коде. Существует множество локальных вариантов разработки, включая запуск модели в контейнере Docker и выполнение запросов к API.

Чтобы запустить докер-контейнер:

truss run-image my_model

Обращаться с просьбой:

curl -X POST https://127.0.0.1:8080/v1/models/model:predict -d "{'inputs': [{'translation_text': 'Übersetzen: Hallo Welt in deutsch'}]}"

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

Шаг 3. Беспрепятственное развертывание в рабочей среде

Благодаря Docker среда разработки, в которой мы работали, точно соответствует возможной производственной среде. В зависимости от того, где вы хотите развернуть свою модель, следуйте конкретным инструкциям по развертыванию для таких платформ, как AWS ECS, Baseten и Google Cloud Run. Вашу модель также можно развернуть в любом месте, где вы можете запустить образ Docker.

Вызов развернутой модели может немного отличаться в зависимости от вашей среды, но это должен быть запрос API, соответствующий запросу на шаге 2, но нацеленный на рабочий домен.

Шаг 4: Совместное использование и итерация

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

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

Самая разочаровывающая часть попытки запустить чужую модель — это воспроизведение их среды. Но теперь, когда ваша модель сохранена как ферма, все, что нужно сделать для ее запуска, — это загрузить ее с GitHub или другого источника репозитория, установить Docker и пакет Truss Python и обслуживать модель локально. Мы рады возможности для большего сотрудничества и итерации в моделировании с открытым исходным кодом.

Модели машинного обучения будут становиться все более изощренными и способными. В свою очередь, надежное обслуживание этих моделей — локально и в производстве — становится как никогда важным. Мы взяли на себя обязательства по долгосрочной поддержке и развитию Truss и дали нам знать, что мы должны добавить в нашу дорожную карту.

Truss предлагает унифицированный подход к моделированию в разных платформах моделей и целях развертывания. Начните с пометки репозитория и работы с сквозным руководством по развертыванию для вашей любимой платформы и платформы.