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

Это руководство в основном предназначено для демонстрации того, как работает Docker с использованием репозитория, который развертывает модель машинного обучения с использованием fastAPI и Docker.

В этом посте я рассказываю:

  • Объектно-ориентированное программирование
  • Что такое Docker и
  • Как использовать Docker с примером развертывания модели

Объектно-ориентированное программирование (ООП)

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

Как вы можете догадаться, вы не стали бы развертывать модель в рабочей среде, используя обычный Jupyter Notebook с неструктурированным кодом встроенного типа. ООП — это решение.

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

Вот пример класса, который будет частью конвейера развертывания модели:

Объектно-ориентированное программирование позволяет вам настроить этот стиль структурированного кода и упаковать его в приложение, готовое к развертыванию с помощью Docker через ваш cmd (командную строку) или платформу, такую ​​​​как fastAPI.

Вот ресурсы, которые помогут вам начать работу с объектно-ориентированным программированием:

Теперь о докеринге — что такое докер?

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

Изображений

Изображение — это шаблон только для чтения с инструкциями по созданию контейнера Docker.

Чтобы создать собственный образ, вы создаете Dockerfile с простым синтаксисом, определяющим шаги, необходимые для создания образа и его запуска. Каждая инструкция в Dockerfile создает слой в образе.

Контейнеры

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

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

Установка Докера

Вы можете найти руководство по установке Docker здесь. Я использую версию Docker Desktop, а также использую Docker из моей локальной подсистемы Ubuntu с помощью командной строки. Мы будем использовать его из командной строки для этого блога.

Пошаговый пример докера

Недавно я решил пройти курс ML Engineering (ML Ops), на нем мы построили модель, предсказывающую типы напитков с помощью простого классификатора, состоящего из StandardScaler и Random Forest с лесом из 10 деревьев.

Модель была предварительно обучена и сохранена в репозитории ниже как wine.pkl, конвейер, который мы используем, загружает эту модель и использует ее для прогнозирования.

Шаг 1: Клонируйте репозиторий

Сначала я клонировал репозиторий локально на своем ноутбуке.

git clone https://github.com/https-deeplearning-ai/machine-learning-engineering-for-production-public.git

Найдите свой путь в каталог проекта:

cd machine-learning-engineering-for-production-public/course4/week2-ungraded-labs/C4_W2_Labwine.pklFastAPI_Docker/no-batch

Структура проекта:

..
└── no-batch
    ├── app/
    │   ├── main.py (server code)
    │   └── wine.pkl (saved classifier model)
    ├── requirements.txt (Python dependencies)
    ├── wine-examples/ (wine examples to test the server)
    ├── README.md (this file)
    └── Dockerfile

Изучите файлы в проекте, особенно main.py, чтобы получить представление об ООП и конвейерах, о которых мы говорили ранее.

Шаг 2: Создайте Dockerfile

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

Создание Dockerfile требует использования простых команд. Подробнее о командах Docker здесь

i) Базовое изображение:

FROM frolvlad/alpine-miniconda3:python3.7

Инструкция FROM позволяет выбрать уже существующее изображение в качестве основы для нового изображения. Это означает, что все программное обеспечение, доступное в базовом образе, также будет доступно вам самостоятельно.

В этом случае ваше базовое изображение frolvlad/alpine-miniconda3:python3.7, давайте разберем его:

  • frolvlad — логин автора изображения.
  • alpine-miniconda3 это его имя.
  • python3.7 — тег изображения.

Этот образ содержит альпийскую версию Linux. Он также включает miniconda с Python 3. Обратите внимание, что тег сообщает вам, что используется конкретная версия Python 3.7. Пометка хороша тем, что позволяет создавать разные версии похожих изображений.

ii) Установка пакетов

Теперь, когда у нас есть среда с установленным Python, мы установим все пакеты, связанные с Python, необходимые для построения рабочего процесса, запуска и развертывания модели.

В файле requirements.txt есть список всех необходимых нам пакетов, включая их версии. Нам нужно скопировать существующий requirements.txt, который в настоящее время находится в репо, который мы клонировали, в образ, чтобы к нему могли получить доступ другие процессы, это можно сделать с помощью инструкции COPY:

COPY requirements.txt .

Теперь вы можете использовать pip для установки этих библиотек Python. Чтобы запускать команды, как на bash, используйте инструкцию RUN:

RUN pip install -r requirements.txt && \
	rm requirements.txt

После того, как мы установим пакеты, указанные в requirements.txt, мы больше не будем использовать этот файл, поэтому мы удаляем его, чтобы образ включал только необходимые файлы для запуска нашего сервера. *Обратите внимание, что две команды были объединены в цепочку с помощью оператора &&.

iii) Открытие порта

Поскольку мы программируем веб-сервер для развертывания нашей модели, мы должны указать Docker прослушивать любые прогнозные запросы, которые мы будем делать на порту 80, доступном для нас. Мы можем сделать это с помощью инструкции EXPOSE.

EXPOSE 80

iv) Копирование вашего приложения в изображение

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

COPY ./app /app

Наконец: запуск сервера

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

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

Объединив все команды, мы получим окончательный Dockerfile, готовый к запуску:

Шаг 3: Создайте образ

Вы можете использовать флаг -t, чтобы указать имя изображения и его тег. Как мы видели ранее, тег идет после двоеточия :, поэтому в данном случае имя our-ml-appl, а тег no-batch.

docker build -t our-ml-appl:no-batch .

После запуска сборки добавьте в список все образы Docker, чтобы проверить, есть ли образ, с помощью этой команды:

docker images

Результат:

Шаг 6: Запустите контейнер

Поскольку образ теперь собран, мы создаем из него контейнер для нашего приложения.

docker run --rm -p 80:80 our-ml-appl:no-batch

Давайте рассмотрим, какие флаги здесь используются:

  • --rm: Удалить контейнер после того, как мы перестанем его запускать. Это сделано для того, чтобы избежать необходимости вручную удалять контейнер и помочь нашей системе оставаться в чистоте.
  • -p 80:80: Этот флаг выполняет операцию, известную как сопоставление портов. Контейнер, как и ваша локальная машина, имеют собственный набор портов. Чтобы мы могли получить доступ к порту 80 в контейнере, нам нужно сопоставить его с портом на вашем компьютере. В этом случае он сопоставляется с портом 80 на нашей машине.
  • В конце команды находится имя и тег образа, который вы хотите запустить.

Результат:

Теперь мы запустили все приложение целиком, теперь мы видим, что оно размещено на localhost:80 :) Все из одного Dockerfile (и код от создателей приложения)

Остановка серверов

Чтобы остановить серверы и контейнеры, в которых они работают, просто используйте комбинацию клавиш ctrl + c в окне терминала, где вы начали процесс.

Вы можете использовать команду docker ps, чтобы проверить имена запущенных контейнеров, а затем использовать команду docker stop name_of_container, чтобы остановить их.

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

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

Использованная литература:

  1. https://github.com/https-deeplearning-ai/machine-learning-engineering-for-production-public/tree/main/course4/week2-ungraded-labs/C4_W2_Labwine.pklFastAPI_Docker/no-batch
  2. https://docs.docker.com/
  3. https://www.pythontutorial.net/python-oop/python-объектно-ориентированное программирование/