Руководство по развертыванию моделей машинного обучения с помощью Flask и контейнеризации вашей работы

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

Flask — это микро-веб-фреймворк, реализованный на Python. Используя Flask, мы рассмотрим пример того, как вы можете локально обслуживать свою модель ML для логического вывода. Если вы новичок в Flask, я бы порекомендовал взглянуть на это руководство, которое поможет вам освоиться.

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

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

В этой статье мы рассмотрим эти два шага с обученной нами моделью машинного обучения.

ПРИМЕЧАНИЕ. В этой статье предполагается базовое знание Python, Docker, Flask и использование интерфейса командной строки. Мы также будем использовать базовый HTML/CSS, но вы можете скопировать шаблон как есть. В этой статье также будет использоваться модель ML для обслуживания, но мы не будем рассматривать какую-либо теорию построения модели, для получения конкретной информации о модели обратитесь к этой статье.

Набор данных

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

Построение модели

В этой статье мы не собираемся тратить слишком много времени на построение модели или выбор наиболее точной модели с точки зрения производительности Data Science. Для нашей проблемы регрессии я собираюсь использовать модель RandomForest Regression через структуру Sklearn. Обычно, когда мне нужен быстрый доступ к работающим примерам модели ML, я стараюсь поддерживать набор инструментов модели, который даст мне шаблонный код для ускорения процесса.

Я сериализую модель с помощью модуля Joblib, и чтобы убедиться, что она работает, я быстро предскажу выборку данных.

Обязательно сохраните сгенерированный файл «model.pkl» (можно также создать model.joblib). Это артефакт модели, который мы загрузим для логического вывода на наш сервер Flask.

Хостинг моделей на Flask

Наше приложение Flask будет состоять из двух частей. Во-первых, мы хотим создать шаблон для нашего внешнего интерфейса, используя базовый HTML/CSS. В этом шаблоне все, что мы делаем, — это создаем простую форму, которая будет принимать четыре входа: налог на бензин, средний доход, дороги с твердым покрытием и процент водительских прав населения. Это четыре параметра, которые наша модель ожидает от серверной части, и мы зафиксируем их через эту форму.

Во-вторых, мы можем настроить наше приложение Flask для работы с этими входными данными формы. Давайте взглянем на необходимые импорты и загрузим модель, здесь пригодится наш файл model.pkl.

Давайте протестируем запрос GET на нашем веб-сервере Flask, прежде чем настраивать обработку формы. Мы визуализируем нашу страницу index.html, которую мы создали (извините меня за мои ужасные навыки работы с HTML/CSS).

Если вы запустите следующую команду в том же каталоге, что и ваш файл приложения Flask, вы сможете запустить сервер Flask.

Теперь мы можем обработать входные данные формы и передать их нашей модели.

На стороне HTML мы хотим отразить эту выходную переменную «res», которую возвращает наша модель, поэтому мы добавляем эту часть в наш код index.html.

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

Большой! У нас есть работающее приложение Flask, теперь давайте посмотрим, как мы можем правильно его поместить в контейнер.

Докеризация приложения Flask

Прежде чем начать, убедитесь, что Docker установлен и запущен.

Вам нужно знать две основные сущности Docker: Docker Image и Docker Container. Образ Docker — это то, что содержит наш исходный код, зависимости и среду. Контейнер Docker — это экземпляр образа Docker. Используя образ Docker в качестве шаблона, мы можем запускать контейнеры, которые запустят наше приложение. Чтобы лучше понять разницу, пожалуйста, обратитесь к этой статье.

Чтобы создать наш образ Docker, нам необходимо предоставить файл Dockerfile с инструкциями по установке. С Dockerfiles мы можем использовать базовые образы с предустановленными зависимостями и кодом. Для начала возьмем Base Python Image.

Затем мы используем команду WORKDIR, чтобы установить рабочий каталог внутри контейнера. Не обязательно использовать корневой каталог в контейнере, так как это может привести к похожим именам файлов и меньшим проблемам такого рода.

Теперь для настройки нашей среды нам нужно предоставить зависимости, которые нам нужно установить, мы можем сделать это через файл requirements.txt.

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

Затем мы можем скопировать оставшиеся файлы в наш рабочий каталог.

Наконец, используя CMD, мы можем предоставить команду по умолчанию при запуске нашего контейнера.

Теперь, когда у нас есть файл Dockerfile, мы можем создать образ Docker, выполнив следующую команду по тому же пути, что и ваш файл Dockerfile.

Это создаст образ Docker с тегом «ramveg/ml-app», не стесняйтесь переименовывать его по своему желанию. По умолчанию это также относится к «последней» версии, если вы хотите изменить это, вы можете сделать «ramveg/ml-app:dev» или что-то в этом роде.

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

При желании вы также можете проверить содержимое своего контейнера с помощью следующей команды.

Это должно запустить оболочку в вашем контейнере, где вы можете запускать обычные команды Linux, чтобы получить представление о вашей структуре каталогов. Здесь мы видим все файлы, которые мы скопировали.

Теперь мы можем запустить контейнер, ключевым моментом здесь является то, что нам нужно указать порт 5000, так как это порт по умолчанию, на котором работает Flask.

Если мы перейдем к «localhost: 5000», мы должны увидеть то же приложение Flask, которое было у нас локально. Просто для проверки мы также можем снова выполнить вывод.

Дополнительные ресурсы и заключение



Вы можете получить доступ ко всему коду для примера по ссылке выше. Я надеюсь, что благодаря этой статье вы получили более глубокое представление о развертывании моделей в производственной среде. Для получения дополнительной информации о хостинге моделей машинного обучения ознакомьтесь с моими сериями MLFlow и SageMaker. Если вам интересно узнать больше о контейнерах, есть отличный курс Udemy Стивена Грайдера, который поможет вам начать с нуля.

Если вам понравилась эта статья, не стесняйтесь связаться со мной в LinkedIn и подписаться на мою Информационную рассылку. Если вы новичок в Medium, зарегистрируйтесь с помощью моего Реферала для участников.