/sf_webinar_ds_prod_template

Code for Skillfactory Webinar "DS Prod"

Primary LanguagePython

Проект для практического вебинара DS Prod

Вебинар состоит из одного проекта (задачи) разбитого на несколько заданий, которые покрывают следующие темы из курса DS Prod: pickle, flask, uwsgi, docker, nginx, docker-compose.

Введение

Для нашей задачи мы будем использовать датасет California Housing, включающий в себя данные о стоимости жилья в Калифорнии по округам / районам (“census”). Данные можно загрузить через sklearn (код загрузки в есть в файле model_train.py). Целевая переменная в наборе данных - медианная стоимость жилья для округа, а признаки - характеристики этих округов. Мы разобьем набор данных на обучение и тест и будем предсказывать значение целевой переменной на тесте.

Верхнеуровневые бизнес требования в нашей задаче такие - ваш коллега хочет получать оценку стоимости округа из тестового набора данных через АПИ, при этом ему у него нет самого датасета, а имеется только id округа. Коллеге все равно какие признаки вы будете использовать в своей модели, ему для решения проблемы важно получать оценку стоимости для конкретного округа.

Разрабатывать АПИ мы будем локально, но ваш коллега не находится с вами в одной сети, поэтому чтобы любой человек мог использовать АПИ - стоит развернуть проект на сервере AWS.

Пререквезиты для вебинара

Для работы с проектом локально нужно иметь на своем компьютере:

  • Git
  • Pycharm / VSCode для работы с кодом
  • docker (установка)
  • docker-compose (установка)
  • python библиотеки (для локальной работы, не в docker контейнере)
    • numpy==1.19.4
    • pandas==1.1.4
    • scikit-learn==0.23.2
    • flask==1.1.2
    • requests==2.25.0

План решения задачи

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

  • Какие шаги мы будем проходить?
  • Какие технологии / библиотеки будем использовать?

Задания

В каждом задании необходимо заполнить недостающие фрагменты кода и запустить этот код с помощью команд приведенных ниже. Команды запуска можно выполнять как из терминала, так и из IDE.

1. Обучение и сериалзизация модели, сериализация данных

Вначале мы загружаем датасет, добавляем айди объекта для использования в дальнейшем. Разбиваем датасет на трейн и тест - на трейне обучаем модель LinearRegression из sklearn. Для сравнения друг с другом измеряем метрику MSE на тесте. Также мы сериализуем саму модель и тест данные для использования во время инференса модели в дальнейшем.

Заполните пропуски в файле /app/src/model_train.py. Команды ниже выполняют обучение модели и сериализацию данных

cd <project_directory>/app/src/

python model_train.py 

В результате выполнения команд у вас в папке src должны появиться 3 файла:

  • _webinar_model.pkl
  • _test_data.pkl
  • _feature_order.pkl

ПЕРЕХОДИМ В ФАЙЛ /app/src/model_train.py

2. Flask приложение:

В файле server.py будем писать наше фласк приложение с двумя flask методами:

  • /hello (для проверки работы сервера) - принимает get запрос с параметром “param”, возвращает строку ОК со значением param переданным в запросе
  • /predict (для инференса обученной моделью) - принимает get запрос с айди объекта, возвращает предсказание модели на этом объекте

Заполните пропуски в файле /app/src/server.py. Команды ниже запускают flask сервер

cd <project_directory>/app/src/

python server.py 

Протестировать работу API в этом задании можно вручную (запросами в браузере, приведены в коде server.py) или автоматически - запуском скриптов:

cd <project_directory>/app/src/

python test_hello.py

python test_predict.py

ПЕРЕХОДИМ В ФАЙЛ /app/src/server.py

3. Flask приложение в docker контейнере:

Для обеспечении изолированности окружения нашего приложения будем разворачивать проект в docker контейнере, для этого используем соответствующий Dockerfile.

Заполните пропуски в файле /app/flask.Dockerfile. Команды ниже выполняют сборку и запуск контейнера с приложением

cd <project_directory>/app/

docker build -t webinar_app -f flask.Dockerfile .

docker run -p 8000:8000 -it --rm --name webinar_app webinar_app

Тестируем работу API в этом задании можно вручную (запросами в браузере, приведены в коде server.py) или автоматически - запуском скриптов:

cd <project_directory>/app/src/

python test_hello.py

python test_predict.py

ПЕРЕХОДИМ В ФАЙЛ /app/flask.Dockerfile

4. Flask + uwsgi приложение в docker контейнере:

Для использования нашего python приложения в prod окружении необходимо добавить к нему WSGI сервер. Для этого соберем в одном контейнере flask + uwsgi приложение.

Заполните пропуски в файле /app/uwsgi.Dockerfile. Команды ниже выполняют сборку и запуск контейнера с приложением

cd <project_directory>/app/

docker build -t webinar_app_uwsgi -f uwsgi.Dockerfile .

docker run -p 8000:8000 -it --rm --name webinar_app_uwsgi webinar_app_uwsgi

Тестируем работу API в этом задании можно вручную (запросами в браузере, приведены в коде server.py) или автоматически - запуском скриптов:

cd <project_directory>/app/src/

python test_hello.py

python test_predict.py

ПЕРЕХОДИМ В ФАЙЛ /app/uwsgi.Dockerfile

5. Flask + uwsgi приложение и nginx в двух разных контейнерах:

Для дальнейшей подготовки нашего приложения к prod окружению нам стоит добавить сервер Nginx в нашу систему. Развернем Nginx в отдельном контейнере рядом с контейнером приложения flask + uwsgi. Всю систему целиком мы будем собирать и поднимать через docker-compose.

Заполните пропуски в файле docker-compose.yml. Команда ниже выполняет сборку и запуск контейнеров с приложением

docker-compose up --build

Тестируем работу API в этом задании можно вручную (запросами в браузере, приведены в коде server.py) или автоматически - запуском скриптов:

cd <project_directory>/app/src/

python test_hello.py

python test_predict.py

ПЕРЕХОДИМ В ФАЙЛ docker-compose.yml

Заключение

Вы великолепны!