Развертывание модели машинного обучения

Дмитрий Шурмакин — ML Engineer

Intro

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

FastAPI - это фреймворк, который обеспечивает высокую производительность и простоту в разработке веб-приложений и API.

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

Подробно с этим инструментом вы должны были познакомиться ранее в соответствующем блоке

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

  1. Разработка Модели: Сначала разрабатывается и обучается модель машинного обучения на основе предоставленных данных.
  2. Создание API: С использованием FastAPI создается веб-приложение, которое предоставляет API для доступа к модели. Методы API определяются на основе задачи и типов запросов, которые модель должна обрабатывать.
  3. Контейнеризация: После создания API, приложение и его зависимости упаковываются в Docker-контейнер, обеспечивая изолированное и переносимое выполнение.
  4. Тестирование и Проверка: В контексте CI/CD, Docker Compose может быть использован для локального тестирования и проверки приложения в изолированной среде перед его развертыванием.
  5. Развертывание Приложения: Подготовленный контейнер с приложением развертывается на выбранной платформе или инфраструктуре. В продакшн-среде для управления контейнерами и их развертыванием могут использоватся инструменты, такие как Kubernetes или другие платформы оркестрации контейнеров, которые обеспечивают более надежное и масштабируемое решение.
  6. Оркестрация и Управление: В production предпочтение отдается использованию специализированных инструментов оркестрации, таких как Kubernetes, для управления жизненным циклом контейнеров, обеспечивая высокую доступность и удобство управления.

Что необходимо, что бы создать веб-приложение

Для создания веб-приложений мы используем ASGI-сервер (ASGI - спецификация интерфейса для создания асинхронных веб-серверов обеспечивающих стандартизированный способ обработки HTTP запросов и ответов), такой как Uvicorn

WSGI (Web Server Gateway Interface) - это стандарт взаимодействия между веб-сервером и Python-скриптом, который превращает скрипт в веб-сайт. Для работы по стандарту WSGI, скрипт должен содержать специальную функцию, которая принимает HTTP-запросы и их обработчик. Когда сервер получает запрос, он использует эту функцию для обработки запроса. Стандарт WSGI поддерживается многими веб-серверами и описан в PEP 333
ASGI (Asynchronous Server Gateway Interface) - это асинхронный аналог стандарта WSGI, который предоставляет интерфейс для взаимодействия между веб-приложениями, написанными на Python, и веб-серверами.

Uvicorn работает как сервер для приложений, принимает входящие HTTP запросы и направляет их на соответствующее приложение для обработки.

FastAPI, в свою очередь, может работать с различными ASGI-совместимыми серверами и обеспечивает эффективную и масштабируемую обработку запросов.

Альтернативы FastAPI: сравнение с Flask и Django

FastAPI, Flask и Django/DRF (Django Rest Framework) - это три популярных веб-фреймворка для Python, используемые для создания веб-приложений и API. Вот сравнение основных характеристик и особенностей каждого из них:

Характеристика FastAPI Flask Django/DRF
Архитектура Основан на асинхронных запросах, позволяет создавать API с использованием асинхронных функций Python Основан на синхронной модели, обрабатывает запросы последовательно Так же поддерживает асинхронную модель обработки запросов.
Производительность Высокая производительность благодаря архитектуре Быстрый и легковесный, но работает с синхронной моделью обработки запросов, что делает его медленнее относительно FastAPI. Имеет обширную функциональность, но из-за своей монолитной архитектуры может быть менее производительным в сравнении с более легковесными фреймворками.
Валидация данных Встроенная поддержка валидации данных с использованием Pydantic на глубоком уровне. Валидация данных часто осуществляется с использованием сторонних библиотек, такие как WTForms или Marshmallow, Pydantic. Имеет свои средства валидации данных (Djantic) и много других инструментов для работы с формами и моделями данных.
Документация Более доступная документация с примерами и лучшими практиками, сгруппированная по уровню опыта разработчика. Генерация интерактивной документации API из кода на основе OpenAPI (Swagger). Документация часто создается с использованием сторонних расширений, такие как Flask-RESTPlus или Flask-Swagger. Для генерации документации существуют сторонние решения, такие как drf-yasg и drf-spectacular, обеспечивают автоматическую генерацию документации API на основе аннотаций в коде.
Экосистема Фреймворк, активно развивается, судя по количеству рекевестов и issues. Сейчас на github имеет 71.5к звезд и 658 контрибьютеров. Имеет 60к упоминаний в репозиториях. В различных подборках найдено 94 расширения и плагинов. Устоявшийся фреймворк с большим количеством сторонних библиотек и расширений. Фреймворк развивается, но активность коммитов самая минимальная из всей тройки. Сейчас на github имеет 66.5к звезд и 717 контрибьютеров. Имеет 35.7к упоминаний в репозиториях. В различных подборках найдено 113 расширения и плагинов. Django имеет огромное сообщество пользователей и множество готовых решений для различных задач, что обеспечивает широкий выбор инструментов и библиотек. Сейчас на github имеет 77.1к звезд и 2523 контрибьютеров. Имеет 550к упоминаний в репозиториях. В различных подборках найдено 230 расширения и плагинов.

Архитектура и производительность:

FastAPI основан на асинхронной архитектуре, что обеспечивает высокую производительность. Flask использует синхронную модель, что делает его медленнее, чем FastAPI. Django также поддерживает асинхронную обработку запросов, но его монолитная архитектура может снижать производительность.

Встроенные функции:

FastAPI имеет встроенную поддержку валидации данных и генерации интерактивной документации API. Flask требует использования сторонних библиотек для этих функций. Django предоставляет свои собственные средства валидации данных и генерации документации API.

Экосистемы:

Каждый из фреймворков обладает активной экосистемой и большим количеством расширений. Django, с его огромным сообществом и обширными инструментами, предлагает широкие возможности расширения функциональности. Самым активным по динамике роста популярности (Github Stars), обсуждаемости (вопросы на Stack Overflow, issues), а так же частоте коммитов, является FastAPI, что конечно не говорит, говорит о приоритете выбора именно этого фреймворка, только на основании этих параметров, но может сделать ваше разработку проще в случае возникновения проблем.

Трудоустройство:

Сейчас FastAPI так же востребован на рынке, даже по сравнению с более устоявшимися фреймворками.

Выбор фреймворка:

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