MLOps Data science knowledge

Добро пожаловать

Приветствуем на странице с материалами курса “MLOps и production в DS исследованиях 3.0”.

Как мне..

Скачать презентацию в формате PDF с заметками докладчика?

Для того, чтобы скачать pdf версию презентации с заметками докладчика:

  • На титульном слайде нажмите на название презентации (надо списком авторов). Таким образом к url презентации (без тега слайда) добавится ?showNotes=separate-page&print-pdf.
  • После этого воспользоваться функцией печати вашего браузера, например, через CTRL/CMD+P.
  • Настройте “Destination” на “Save as PDF”.
  • Измените, если необходимо, “Layout” на “Landscape”.
  • Установите “Margins” на None.
  • Включите опцию Background graphics.
  • Сохраните полученную pdf.

Посмотреть практические примеры из презентации?

Для того, чтобы скачать tar.gz архив с примерами - нажмите на ссылку нужного модуля ниже:

Домашние задания

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

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

Задание по репозиторию

Цель этого домашнего задания – подготовить репозиторий для работы в нем: настроить необходимые линтеры и форматеры, описать конфиг pre-commit и сформировать contributing.md где описано, что и как нужно делать в репозитории для внесения изменений.

Для этого нужно выполнить следующие шаги:

  1. Опубликовать репозиторий на gitlab (или аналоге, но курс ориентирован на gitlab).
  2. Выбрать линтеры и форматеры. Можно выбрать те, которые озвучивались в материалах курса, или какие-то свои, которые вам привычны.
  3. Зафиксировать необходимые зависимости для линтеров.
  4. Настроить pre-commit в репозитории.
  5. Провести настройки линтеров и форматеров в pyproject.toml, прописать основные параметры инструментов.
  6. Зафиксировать в contributing.md, как пользоваться линтерами в вашем проекте.
  7. (*) Добавить в readme.md методологию ведения вашего репозитория.

Задание по docker

Цель этого домашнего задания – подготовить себе docker образ для работы с ним. В дальнейшем вы можете использовать его как рабочее место для экспериментов, использовать для CI-CD и поставки зависимостей. Нужно зафиксировать зависимости с помощью одного из пакетных менеджеров (попробуйте что-то новое, не используйте pip), разделите зависимости по группам/окружениям (например dev и prod, в dev можно поместить pre-commit и ruff) выбрать нужный базовый образ и прописать в docker file нужные штаги по настройки окружения и зависимостей.

Для этого нужно выполнить следующие шаги:

  1. Зафиксировать зависимости с помощью одного из пакетных менеджеров
  2. Составить Dockerfile с построением вашего окружения
  3. Прописать команды для его сборки и запуска в readme проекта.

Задание CI-CD и документации

Цель этого домашнего задания – настроить CI-CD пайплайн и опубликовать на gitlab pages документацию проекта и исследований. Пайплайн должен включать в себя:

  • DinD – сборку вашего докер образа из предыдущего дз, стоит также опубликовать образ в вашем gitlab docker registry.
  • Линтеринг кода с использованием выбранных линтеров и форматеров
  • Сборка и публикация вашего проекта в виде пакета в gitlab pypi registry.
  • Сборка исследования из quarto/jupyter, документации в html (возможно надо будет скачать данные с помощью kaggle-cli)
  • Публикация на gitlab pages

Помните, что в ci-cd различные credentials надо задавать как секреты – masked variables.

Проведите разведочный анализ на датасет ny-2015-street-tree-census-tree-data. В исследование стоит отобразить следующее:

  • Показать при помощи таблиц превью данных.
  • Продемонстрировать при помощи таблиц или графиков объем пропущенных значений в данных. Например, можно для столбцов, где есть пропуски, построить pie chart с указанием процента пропусков (есть в plotly).
  • Построить диаграммы попарного распределения признаков.
  • Рассчитать и показать матрицу попарных корреляций между вещественными признаками.
  • Отобразить географическое представление деревьев из датасета. В датасете есть поля: latitude и longitude, и, используя библиотеки, которые позволяют отображать положение объектов на карте при помощи широты и долготы, необходимо предоставить в отчете карту расположения деревьев из данных.

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

Задание по блоку Snakemake

  1. Реализовать пайплайн обработки данных при помощи snakemake, минимум 3 правила - чтение данных, препроцессинг данных, обучение модели.
  2. Добавить как минимум ещё 1 вариант препроцессинга и ещё 1 вариант обучения модели, настроив правила таким образом, чтобы в результате работы пайплана получились минимум 4 артефакта - комбинация двух моделей с двумя разными препроцессингами.
  3. Обобщить хотя бы одно правило, используя named wildcards.
  4. Воспользоваться хотя бы в одном правиле вспомогательной функцией expand.
  5. Добавить readme или отчёт в формате md/qmd, с описанием шагов вашего пайплайна и отображением dag, полученного при помощи внутренних функций snakemake.
  6. Использовать ограничение правил по ресурсам, например, параметр threads до половины числа ядер машины.

Задание по блоку Hydra

  1. Создать как минимум две группы конфигов (для параметров препроцессинга и самой модели), добавить в них структурированные ИЛИ yaml-конфиги.
  2. Интегрировать чтение конфигураций через Compose-API в код разведочного анализа или пайплайнов (например, в скрипт Snakemake), использовать несколько произвольных параметров из прочитанных конфигураций в этом коде.
  3. Использовать instantiate для инициализации модели внутри вспомогательных python-модулей (или скрипта Snakemake).
  4. Добавить (любым удобным способом) в переменные окружения число ядер процессора на своей машине. В одном из конфигов воспользоваться reslover’ом “oc.env” для чтения числа ядер. Использовать это значение в коде обучения или инициализации моделей, ограниив потребление cpu половиной доступных ядер (как вариант - использовать в ограничениях правил Snakemake).

Задание по блоку Lakefs

  1. Написать докер образ для развертки lakefs.
  2. Использовать lakectl вместе с workflow manager system и написать пайплайн загрузки хотя бы двух версий одного файла в развёрнутый lakefs, с последующим чтением и обработкой этих файлов в отдельных шагах пайплайна.
    • (*) Альтернативно можно воспользоваться одной из библиотек интеграции lakefs с python вместо lakectl.

Задание по блоку DVC

Цель домашнего задания – познакомиться с базовыми функционалом dvc.

Предлагается использовать данные из датасета Amazon reviews, но так же можно использовать свои данные для выполнения задания. Задание состоит из следующих шагов:

  • Добавить исходные данные в DVC.
  • Настроить любое удаленное хранилище для DVC (gdrive/s3/… etc.).
  • Прописать пайплайн подготовки данных и обучения модели с помощью dvc pipelines. В пайплайне нужно сделать следующие шаги:
    • Необходимо сохранить предобработанные данные в dvc.
    • Разделить их на Train и Test и поместить в dvc результат.
    • Обучить енкодеры, векторайзеры, скаллеры и тд и сохранить полученные настройки в dvc.
    • Закодировать данные для обучения и тестирования модели.
    • Обучить простую модель(типа регрессии) и сохранить ее основные метрики (метрики модели на ваш выбор, но чем больше тем лучше).
  • (*) Решить проблему с сериализацией моделей, что бы при полном перезапуске пайплайна (dvc repro –force) на каждом этапе получались одни и те же файлы с точностью до бита.
  • Добавить в CI запуск вашего пайплайна.
    • (*) Сделать проверку совпадения результатов пайплайна в CI с зафиксированной версией в удаленном хранилище.
  • Затем заменить модель на более сложную(например random forest/ catboost) и перезапустить пайплайн и зафиксировать его результаты.
  • (*) Описать исследование сравнения двух моделей используя dvc.api для получения результатов каждой модели и опубликовать на gitlab pages.

Задание по блоку MLflow

Цель домашнего задания – познакомиться с базовыми функционалом MLflow.

Предлагается использовать данные из датасета Amazon reviews, но так же можно использовать свои данные для выполнения задания. Задание состоит из следующих шагов:

  • Настроить MLflow - развернуть на своих локальных мощностях(локально или через свой инстанс)
  • Провести обучение нескольких (минимум двух) моделей на предложенных данных и зафиксировать результаты в MLflow
  • Составить MLflow report по сравнению моделей по метрикам, используя результаты экспериментов и инструмента сравнения в MLflow. Выбрать наилучший эксперимент исходя из метрик в интерфейсе MLflow.

Задание по блоку ClearML

Цель домашнего задания – познакомиться с базовыми функционалом ClearML.

Предлагается использовать данные из датасета Amazon reviews, но так же можно использовать свои данные для выполнения задания. Задание состоит из следующих шагов:

  1. Настроить ClearML (развернуть на своих локальных мощностях или воспользоваться облачной версией)
  2. Провести обучение нескольких (минимум двух) моделей на предложенных данных и зафиксировать результаты в ClearML
  3. Составить ClearML report по сравнению моделей по метрикам, используя результаты экспериментов и инструмента сравнения в ClearML.

(*) доп задание: использовать пайплайны ClearML для проведения исследований на предложенном датасете. Цель задания познакомится с пайплайнами, их переиспользованием и ClearML agent.

  1. Составить пайплайн по обработке и кодированию данных, результатом пайплайна являются подготовленные выборки для обучения и тестирования модели.
  2. Составить несколько пайплайнов по обучению моделей, в которых используются первый пайплайн (точнее задача пайплайна в ClearML, а не python функция).
  3. Реализовать запуск всех пайплайнов с помощью ClearML agent.

Результаты пайплайнов могут использоваться в основной части задания по сравнению моделей и составлению отчёта.

Задание по блоку Hypothesis

Цель домашнего задания – познакомиться с базовыми функционалом hypothesis.

Предлагается выбрать уже реализованную в вашем проекте функцию/метод подготовки данных.

Необходимо подготовить отчёт, в котором:

  1. Включить текущую реализацию функции подготовки данных.
  2. Описать на каких значениях функция работает и какими свойствами должен обладать результат.
  3. Реализовать тестовую функцию с использованием hypothesis.
  4. Отобразить в отчёте пример того, на каких значениях свойства не выполняются (если таких нет, то поздравляю, вы молодец, но стоит выбрать другую функцию тогда, а тест можете оставить в проекте, раз уже написан).
  5. Зафиксировать в отчёте какие изменения вносились в реализацию функции, для устранения несоответствия свойствам.
  6. Написать тестовую функцию проверяющую соответствие результатов между начальной и итоговой реализацией (техника test oracle).

Задание по блоку “Развертывание модели машинного обучения”

Создание приложения для анализа тональности текста с использованием FastAPI, Celery, RabbitMQ и Redis.

Цель: Разработать веб-приложение, которое принимает текстовые данные от пользователей, а затем анализирует их на предмет эмоциональной окраски с использованием предварительно обученной модели машинного обучения.

Шаги, которые необходимо выполнить:

  1. Настройка окружения:
    • Установка Python и необходимых библиотек: FastAPI, Celery, RabbitMQ, Redis.
    • Создание нового проекта и структуры каталогов согласно предложенной структуре.
  2. Реализация API:
    • Создание эндпоинта для приема текстовых данных от пользователей.
    • Разработка логики для отправки данных в очередь RabbitMQ для асинхронной обработки.
  3. Настройка Celery:
    • Создание Celery воркера для обработки задач.
    • Настройка связи с RabbitMQ и Redis для передачи задач и хранения промежуточных результатов.
  4. Имплементация модели машинного обучения:
    • Разработка или использование предварительно обученной модели для анализа тональности текста.
    • Интеграция модели в Celery воркер для выполнения предсказаний.
  5. Логирование результатов:
    • Логирование информации о запросах и их обработке.
  6. Документация:
    • Написание документации по API посредством заполнения примерами данных для модели, атрибута json_schema_extra класса ConfigDict при определении модели запроса.
    • Документирование кода для последующего обслуживания и развития приложения.
  7. Запуск и развертывание:
    • Создание Docker-контейнеров для приложения и его компонентов.
    • Настройка docker-compose для локального развертывания и тестирования.

Это задание поможет вам овладеть необходимыми навыками для создания приложений с использованием современных технологий разработки и асинхронной обработки задач. Успехов!

Задание по блоку “Streamlit and Gradio”

Цель домашнего задания – познакомиться на практике с инструментами прототипирования веб-приложений.

Вам необходимо построить прототип приложения (front-end часть), воспользовавшись одним из инструментов Streamlit / Gradio на выбор.

  1. Реализуйте веб-интерфейс для вашего сервиса, с помощью которого пользователи смогут взаимодействовать с вашим приложением. В зависимости от реализованного сейчас функционала, вы можете сделать фронтенд для всего приложения целиком, или выбрать какую-то его часть.
  2. Постройте взаимодействие с реализованным ранее Backend-API сервисом, с помощью вызова хотя бы одного эндпоинта API.
  3. Отобразите хотя бы один элемент данных, полученный с помощью вашего сервиса: график / таблицу / число / текстовую метку и т.п.
  4. Используйте хотя бы два виджета: текстовое поле ввода, числовое поле ввода, чекбокс, тоггл, слайдер и т.п.
  5. Хотя бы один раз воспользуйтесь кешированием данным или используйте глобальное/локальное состояние сессии.

Задание по блоку “Хранилища артефактов”

Использовать Gitlab Registry и сохранить свои ML модели как артефакты.

  • При сборке приложения подтягивать их из хранилища.
  • Настроить сценарий – чтобы по обновлению файла с моделью запускалась сборка и обновлялась модель в сервисе.
  • Каждая новая модель должна получать новый номер версии в хранилище.
  • Добавить возможность заменить версию модели в сервисе на указанную вручную

Задание по блоку Kubernetes

Цель домашнего задания – ознакомиться с основами использования Kubernetes.

Вам необходимо развернуть на Kubernetes простейшее веб-приложение — веб-сервер с одной страницей.

  1. Получить доступ к любому кластеру Kubernetes. Рекомендуется Minikube.
  2. Установить kubectl и настроить его для работы с вашим кластером.
  3. Развернуть веб-сервер nginx.
  4. Настроить репликацию: у вас должно быть 2 реплики nginx.
  5. Добавить к веб-серверу HTML-страницу (любую) без сборки образа. Она должна открываться при запросе корневого пути.
  6. Настроить доступ к веб-серверу снаружи кластера по HTTP, порт 80, на любом доменном имени. Подсказка: чтобы не покупать домен, можно воспользоваться файлом hosts (Windows/Linux). Необходимый IP-адрес при использовании Minikube можно узнать командой minikube ip.

Задание по блоку “Feature Store”

Цель домашнего задания – познакомиться с функционалом Feature Store и применить эти концепции на практике.

Задание можно выполнить только если у вас в проекте используются какие-то табличные данные.

Для выполнения задания необходимо:

  1. Развернуть любой Feature Store (Feast, FeatureForm или другой), или воспользоваться облачными сторами (напр. AWS Sagemaker)
  2. Создать любой пайплайн трансформации ваших данных и зарегистрировать его в Feature Store.
  3. Интегрировать этот пайплайн в ваш проект, т.е. взять сырые данные, которые использует ваш проект, применить с помощью Feature Store трансформацию и как-то использовать эти данные дальше или просто положить эти данные в хранилище.

Опционально: создайте с помощью Feature Store training dataset на исторических данных, который потенциально можно будет использовать для обучения модели.

Примечание: Feature Store можно развернуть с помощью отдельного репозитория, если вы не хотите класть файлы, используемые Feature Store, в основной репозиторий. Можно дальше обернуть его в простой API и использовать FeatureStore-as-a-Service :) Или в случае с FeatureForm достаточно просто использовать тот же клиент, передав ему порт на котором развернут FeatureForm.

Задание по блоку Monitoring

На практической части блока мы реализовали пакетную систему мониторинга дрейфа данных и настроили для нее оповещения в Телеграм. Вам потребуется улучшить наше решение и реализовать продвинутую систему отправки оповещений.

В текущем варианте системы мониторинга мы использовали подход к генерации оповещений на базе статистик. В рамках этого подхода руками задается максимально допустимое отклонение метрики, и если метрика пересекает эту границу - отправляется оповещение. Хотелось бы вообще избежать ручного подбора коэффициентов и максимально все автоматизировать. Для этого вам потребуется реализовать с помощью стат тестов (в пакете scipy / evidently / иное) механизм обнаружения дрейфа данных.

Ваша задача заключается в том чтобы изменить код метода apply_detection в ДАГе Airflow, реализовав там проверку наличия дрейфа на базе статистического теста, который возвращает p-value. Со стороны Grafana - вам потребуется сделать генерацию алерта при условии что p-value < 0.05. Критерием успеха домашнего задания будет написанный рабочий код и уведомление об алерте от вашего телеграм бота в специальном чате (потребуется скриншот с временной меткой).

Задание по блоку ETL

Реализовать ETL препроцессинг с использованием любого из инструментов Luigi/Airflow для инференса моделей ML.