Базовая серия MLOps

Когда я начинал свою карьеру специалиста по данным в 2018–2019 годах, я не внедрял модели в производство. Я работал над проектами, связанными с моделями машинного обучения; однако были и другие ограничения, препятствовавшие развертыванию. Сегодня все по-другому, и я рад сообщить, что мне удалось преодолеть некоторые трудности и развернуть модели в рабочей среде.

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

Обратите внимание, что существует несколько способов развертывания вашей модели, таких как бессерверное машинное обучение, контейнеризация, API-интерфейсы модели и размещенные облачные платформы, такие как Heroku, AWS, GCP и другие.

Почему вы должны развернуть свою модель?

Важно отметить, что ни одна модель не приобретает ценности для бизнеса, сидя на вашем ПК; с ним необходимо взаимодействовать заинтересованным сторонам бизнеса или членам команды.

В этой части я научу вас, как вы можете развернуть свою первую модель в рабочей среде. Для этой статьи я предполагаю, что у вас уже есть следующие файлы: сценарий API Flask Restful — application.py или app.py, модель, хранящаяся в pickle или joblib, учетная запись AWS и Docker, установленные на вашем локальном ПК.

В этой статье основное внимание уделяется развертыванию уже созданной модели машинного обучения с помощью Flask, Docker и AWS Elastic Beanstalk.

Настройка среды

Для начала нам нужна Python IDE, где мы можем писать наши скрипты. Я рекомендую PyCharm, удобную среду разработки Python, которая поможет вам настроить виртуальную среду.

Предположим, вы загрузили свою модель машинного обучения из блокнота Jupyter или Colab, назовем ее «model.joblib» (сохраненная с помощью joblib). Создайте папку для вашего проекта на вашем ПК; давайте назовем нашу «flaskmodelfolder». Эта папка отличается от папки, созданной вашей IDE для проекта Flask.

Создайте Flask Restful API (application.py или app.py) для своей модели (эта статья не распространяется на это), используя PyCharm. Приложение Flask требуется для развертывания нашей модели; это поможет взаимодействовать с веб-интерфейсом при окончательном развертывании.

Теперь скопируйте и вставьте свою модель (model.joblib) и приложение Flask (application.py) в созданную нами папку (flaskmodelfolder). Кроме того, поместите набор данных проекта, который вы использовали для обучения машинному обучению (например, «ml_dataset.csv»), в папку flaskmodel.

NB: в этом проекте есть две папки: первую мы создали под названием «flaskmodelfolder» (для нашего образа Docker), а вторая была автоматически создана нашей IDE для приложения Flask. Убедитесь, что файлы обновлены в папке «flaskmodelfolder».

Сервер приложений

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

Мы реализуем сервер WSGI в нашем приложении Flask, я собираюсь использовать Gunicorn, который является широко используемым HTTP-сервером Python WSGI.

Установите gunicorn с помощью pip (pip install gunicorn или pip3 )

или любой другой метод, который работает для вас в исходном проекте фляги, который содержит файл app.py или application.py u. В Pycharm просто поместите gunicorn в файл requirments.txt, и Pycharm предложит вам установить его.

Вернитесь к проекту фляжного приложения в вашей среде IDE, создайте файл с именем wsgi.py. Поместите это в пустой файл wsgi.py;

from app import app

if __name__ == '__main__':
    app.run()

Примечание.Замените приложение на приложение везде в файле wsgi.py, если ваше приложение flask называется application.py.

Эта настройка позволит приложению фляги работать на сервере WSGI.

Подождите! Вернитесь к своему фляжному приложению (файл app.py или application.py) в Pycharm и отредактируйте его внизу; вы можете использовать любой другой удобный порт.

if __name__ == '__main__':
    # To make the app accessible
    #host to accept request online
    application.run(host='0.0.0.0', port=5000, debug=False)

Запустите приложение Flask с помощью Gunicorn

Давайте протестируем и запустим наше приложение с помощью Gunicorn, откроем окно терминала/cmd и перейдем в каталог, содержащий ваш файл wsgi.py или app.py. Или просто используйте терминал для этого проекта в вашей среде IDE, затем используйте следующую команду:

#please note to use either app or application depending on your flask app name

gunicorn wsgi:app #run on command prompt to start flask app on WSGI HTTP server
#gunicorn wsgi:application

#more conditions you could try
gunicorn wsgi:app --workers 4 --bind 0.0.0.0:5000 --log-level=debug
#gunicorn wsgi:application --workers 4 --bind 0.0.0.0:5000 --log-level=debug
#gunicorn app:app --bind 0.0.0.0:5000

Вы должны получить аналогичный результат;

[2023-03-09 12:00:00 +0000] [12345] [INFO] Starting gunicorn 20.1.0
[2023-03-09 12:00:00 +0000] [12345] [INFO] Listening at: http://0.0.0.0:5000 (12345)
[2023-03-09 12:00:00 +0000] [12345] [INFO] Using worker: sync
[2023-03-09 12:00:00 +0000] [12346] [INFO] Booting worker with pid: 12346

#This output indicates that the Gunicorn server is running
# and listening for incoming connections on port 5000.

Вы можете остановить приложение.

Настройка Docker и образа Docker

Образы Docker являются основой контейнеров. Нам нужен докер для нашего API модели фляги для связи с AWS. Существуют альтернативы использованию докера, однако этот проект посвящен его использованию.

Сначала загрузите Docker desktop на свой компьютер после установки (четко следуйте инструкциям). Кроме того, зарегистрируйтесь на Docker Hub, онлайн-платформе для реестра образов. Обратите внимание на имя пользователя Docker Hub.

Запустите рабочий стол docker на вашем компьютере, это необходимо

Создайте пустой файл с именем Dockerfile без расширений (используйте Pycharm или другой редактор).

Поместите Dockerfile в папку вашего проекта, которую мы создали ранее (отличную от папки, созданной вашей IDE для проекта), используя вставку редактора;

FROM python:3.8

# set a directory for the app
WORKDIR /flaskmodelfolder

# copy all the files to the container
COPY . .

# install dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

# define the port number the container should expose
EXPOSE 5000

# run the command app or application
CMD ["gunicorn", "application:application", "--bind", "0.0.0.0:5000"]

Этот Dockerfile содержит руководство по установке файла requirements.txt, используемого в проекте. Он необходим для образа докера и содержит спецификации развернутого приложения.

Файл требований

Этот файл содержит все пакеты/библиотеки, которые вы использовали во время разработки приложения flask. Чтобы получить этот файл, просто перейдите в настройки Pycharm, в папке проекта вы должны увидеть Python Interpreter и список пакетов. Скопируйте только пакеты и версию (не последнюю версию);

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

pip freeze | grep -v "pkg-resources" > requirements.txt

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

Flask==2.2.3
Flask-Cors==3.0.10
Flask-RESTful==0.3.9
Jinja2==3.1.2
MarkupSafe==2.1.2
Werkzeug==2.2.3    2.2.3
aniso8601==    9.0.1
certifi==2022.12.7
charset-normalizer==3.0.1
click==8.1.3
colorama==0.4.6
gunicorn==20.1.0
idna==3.4
itsdangerous==2.1.2
joblib==1.2.0
numpy==1.24.2
pandas==1.5.3
pip==21.1.2

etc

Пока у нас есть следующая настройка;

Фляжное приложение

Сервер приложений (wsgi.py)

Рабочий стол и центр Docker

Файл требований.txt

Dockerfile (без расширения, например txt)

Собрать образ Docker

Чтобы создать образ Docker, нам нужны два файла;

  1. Dockerfile — содержит инструкции по созданию среды, установке зависимостей и запуску приложения.
  2. Файл требований — содержит все пакеты Python, необходимые для нашего приложения.

Папка flaskmodelfolderсодержит(файл приложения, файл wsgi.py, файл модели, используемый набор данных, файл requirements.txt, файл Dockerfile и файл Dockerrun.aws.json (мы создадим его ниже).

В терминале/cmd перейдите к папке на вашем компьютере, содержащей папку flaskmodelfolder, затем выполните следующие команды одну за другой.

#to build our docker image
#<your-dockerhub-username> can be buchi or david (docker hub username)
#model_api; name given for my image, you can use a new name here
#. the dot is for docker to connect with the Dockerfile
docker build -t <your-dockerhub-username>/model_api .

#after building, run this code 
#lookman is the docker hub user name
#model_api is the image name 
docker run -p 5000:5000 lookman/model_api

Отправка образа рабочего стола в Docker Hub

Вам нужно будет отправить образ, созданный в докере вашего рабочего стола, в онлайн-концентратор докеров, чтобы мы могли использовать его с aws.

#run this command to push
docker push lookman/model_api

Развертывание в облаке AWS

До сих пор мы могли создать образ Docker и отправить его в Docker Hub онлайн. Теперь мы можем интегрироваться с AWS Elastic Beanstalk.

Нашему приложению требуется веб-сервер, к счастью, Elastic Beanstalk автоматически создает его для нас с помощью Nginx.

Чтобы подключить наш образ Docker из концентратора Docker к AWS Elastic beanstalk, нам нужно создать файл с именем Dockerrun.aws.json. Используйте редактор, чтобы создать это, поместите в папкуflaskmodel. Измените значение Name на имя пользователя и образ docker;lookman/model_api:latest

{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "lookman/model_api:latest",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "5000"
    }
  ],
  "Logging": "/var/log/nginx"
}

Запустите AWS и перейдите к Elastic Beanstalk;

  1. Нажмите создать приложение
  2. Заполните имя приложения
  3. Вы можете оставить тег приложения пустым
  4. Платформа — выберите докер
  5. Ветвь платформы — докер, работающий на 64-битной версии amazon linux 2.
  6. Версия платформы - рекомендуется использовать
  7. Под кодом приложения выберите загрузить свой код
  8. Загрузите файл Dockerrun.aws.json и создайте приложение.
  9. После сборки убедитесь, что все в порядке. Ваше приложение будет иметь специальный URL-адрес API-интерфейса модели, который будет использоваться в веб-приложении или других службах, которые вы намереваетесь использовать.

Поздравляем!

Свяжитесь со мной на Github, Twitter и Linkedin.

Я рад, что вы зашли так далеко, всего наилучшего!