Вебинар состоит из одного проекта (задачи) разбитого на несколько заданий, которые покрывают следующие темы из курса 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.
Вначале мы загружаем датасет, добавляем айди объекта для использования в дальнейшем. Разбиваем датасет на трейн и тест - на трейне обучаем модель 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
В файле 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
Для обеспечении изолированности окружения нашего приложения будем разворачивать проект в 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
Для использования нашего 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
Для дальнейшей подготовки нашего приложения к 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
Вы великолепны!