MLOps в действии: структурирование проекта

Если вы хотите вывести свои проекты машинного обучения на новый уровень, MLOps — неотъемлемая часть процесса. В этой статье мы предоставим вам практическое руководство о том, как структурировать ваши проекты для MLOps, используя в качестве примера классическую задачу классификации рукописных цифр. Мы шаг за шагом проведем вас через процесс создания базового шаблона проекта, который вы сможете использовать для организации своих собственных проектов. К концу этого руководства вы будете иметь четкое представление о принципах MLOps и о том, как применять их в своих собственных проектах. Однако, если вы новичок в MLOps, мы рекомендуем начать с моего учебника для начинающих, чтобы освоиться. Итак, давайте погрузимся и поднимем ваши проекты машинного обучения на новый уровень!

Оглавление:

· 1. Введение
· 2. MLOps
2.1. Бизнес-задача
2.2. Инжиниринг данных
2.3. Разработка моделей машинного обучения
2.4. Разработка кода
· 3. Структура проекта
3.1. Cookiecutter Data Science
· 4. Структура проекта MLOps
4.1. Запускаем новый проект MLOps
4.2. Использование шаблона проекта MLOps для классификации рукописных цифр
4.3. Как запустить свой проект?
· «5. Заключение"

Мои руководства по MLOps:

[Я буду обновлять этот список по мере публикации статей на эту тему]

1. Введение

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

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

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

MNIST_classification
├── dataset_scripts
│   ├── construct_dataset_csv.py
│   ├── construct_dataset_folders.py
│   ├── describe_dataset_csv.py
│   ├── explore_dataset_idx.py
│   └── README.md
├── main_classification_convnet.py
├── main_classification_onehot.py
├── main_classification_single_output.py
├── .gitignore
└── README.md

Папка проекта включает папку dataset_scripts, которая содержит скрипты для манипулирования набором данных в его исходном формате IDX (дополнительную информацию вы можете найти в моем предыдущем руководстве Как легко изучить ваш набор данных IDX), скрипты Python для обучения три разных типа моделей, файл .gitignore и файл README. Структура проекта проста, так как предназначена для учебных целей. В этом уроке я представлю свою структуру проекта для проектов MLOps. Обратите внимание: если вам нужны подробности программирования моделей и обучения, вы всегда можете обратиться к моему руководству Краткое введение в нейронные сети: проблема классификации.

2. Млопс

Различные этапы процесса машинного обучения описаны в рабочем процессе MLOps, который включает бизнес-задачу, разработку данных, разработку модели машинного обучения и разработку кода. В этом разделе мы рассмотрим, как реализовать каждый шаг. Однако некоторые этапы не будут подробно обсуждаться, поскольку решаемая нами задача (классификация рукописных цифр) их не требует. Мы сосредоточимся на шагах, которые выделены зеленым цветом (см. рисунок ниже). Остальные шаги будут рассмотрены в будущих руководствах. Если вы хотите узнать больше о рабочем процессе MLOps, вы можете ознакомиться с моим учебником для начинающих.

2.1. Бизнес-проблема

Проблема, рассматриваемая в этом учебном пособии, — это классификация рукописных цифр, которая представляет собой задачу классификации нескольких классов. В частности, учитывая входное изображение рукописной цифры от 0 до 9, модель должна идентифицировать цифру и выводить соответствующую ей метку.

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

2.2. Инжиниринг данных

Инженерия данных включает в себя различные задачи, такие как прием данных, исследование и проверка, очистка, маркировка и разделение. В этом проекте мы выполнили следующие задачи инженерии данных:

  • Прием данных: мы загрузили набор данных MNIST в исходном формате с его официального веб-сайта и преобразовали его в файл CSV.
  • Исследование и проверка данных. Мы визуализировали некоторые изображения из набора данных и представили некоторые идеи.
  • Очистка данных. Набор данных уже был очищен и не требовал дополнительной очистки.
  • Маркировка данных. Набор данных уже был помечен, поэтому в дополнительной маркировке не было необходимости.
  • Разделение данных. Набор данных уже разделен на наборы для обучения и тестирования. Мы извлечем проверочный набор из обучающего набора позже.

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

2.3. Разработка модели машинного обучения

Разработка модели машинного обучения — это третий шаг в рабочем процессе MLOps. Он включает в себя различные задачи, такие как обучение модели, оценка, тестирование и упаковка. В этом проекте мы выполнили следующие инженерные задачи модели машинного обучения:

  • Обучение модели. Для разработки признаков мы использовали масштабирование данных (для масштабирования пикселей до диапазона [0,1]), изменение формы данных (для представления изображения в виде одномерного вектора или двумерной матрицы), и кодирование данных (горячее кодирование). Для разработки моделей мы реализовали два разных типа моделей и применили настройку гиперпараметров.
  • Оценка модели. Помимо точности, мы использовали другие показатели оценки, такие как отзыв, точность и показатель F1, чтобы убедиться, что модель соответствует бизнес-целям (результатам), описанным в канве ИИ.
  • Тестирование модели. После оценки модели мы протестировали ее на двух разных типах данных: первый тип – это тестовый набор набора данных MNIST, а второй – несколько рукописных цифровых изображений, сгенерированных приложением. .
  • Упаковка модели и управление версиями будут обсуждаться в следующем руководстве, где мы более подробно рассмотрим конвейер машинного обучения.

Если вам нужны дополнительные сведения о программировании, вы всегда можете ознакомиться с моим предыдущим руководством.

2.4. Разработка кода

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

3. Структура проекта

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

Но почему важно правильно структурировать проекты машинного обучения? Ну, есть несколько преимуществ:

  • Хорошая прозрачность. Организованный проект легче понять не только вам, но и другим.
  • Простое обслуживание. Хорошо структурированный проект легче поддерживать и обновлять, что экономит ваше время и силы.
  • Повышение эффективности. Четкий план сокращает потери времени и сводит к минимуму риск того, что вы отвлечетесь или потеряете важную информацию.
  • Хорошая воспроизводимость и возможность повторного использования. Хорошая структура проекта гарантирует, что результаты проекта можно будет легко воспроизвести, а его компоненты можно использовать повторно.
  • Легкое сотрудничество. Когда проект организован четким и логичным образом, другим становится легче его понять и внести свой вклад.

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

3.1. Наука о данных

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

Одной из самых известных структур проекта в этой области является Cookiecutter Data Science, которая:

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

Вы можете найти структуру проекта этого шаблона ниже, а также описание каждого файла:

4. Структура проекта MLOps

Теперь, когда мы объяснили, как выполняются различные этапы рабочего процесса MLOps, давайте определим шаблон структуры проекта, соответствующий рабочему процессу MLOps. Шаблон Cookiecutter MLOps основан на представленном ранее шаблоне Cookiecutter Data Science. Как и Cookiecutter Data Science, мой шаблон Cookiecutter MLOps включает в себя LICENSE, README, Makefile и файлы требований; и документы, модели, записные книжки, ссылки, отчеты, визуализации и исходные папки. Однако была добавлена ​​дополнительная папка (configs), а исходные папки и папки визуализации были расширены.

Шаблон структуры проекта MLOps имеет следующую структуру:

{{ cookiecutter.repo_name }}/
├── LICENSE
├── README.md
├── Makefile        # Makefile with commands like `make data` or `make train`
├── configs         # Config files (models and training hyperparameters)
│   └── model1.yaml
│
├── data
│   ├── external    # Data from third party sources.
│   ├── interim     # Intermediate data that has been transformed.
│   ├── processed   # The final, canonical data sets for modeling.
│   └── raw         # The original, immutable data dump.
│
├── docs            # Project documentation.
│
├── models          # Trained and serialized models.
│
├── notebooks       # Jupyter notebooks.
│
├── references      # Data dictionaries, manuals, and all other explanatory
│                   # materials.
│
├── reports         # Generated analysis as HTML, PDF, LaTeX, etc.
│   └── figures     # Generated graphics and figures to be used in reporting.
│
├── requirements.txt # The requirements file for reproducing the environment.
└── src              # Source code for use in this project.
    ├── __init__.py  # Makes src a Python module.
    │
    ├── data         # Data engineering scripts.
    │   ├── build_features.py
    │   ├── cleaning.py
    │   ├── ingestion.py
    │   ├── labeling.py
    │   ├── splitting.py
    │   └── validation.py
    │
    ├── models       # ML model engineering (a folder for each model).
    │   └── model1
    │       ├── dataloader.py
    │       ├── hyperparameters_tuning.py
    │       ├── model.py
    │       ├── predict.py
    │       ├── preprocessing.py
    │       └── train.py
    │
    └── visualization # Scripts to create exploratory and results
        │             # oriented visualizations.
        ├── evaluation.py
        └── exploration.py

Папка configs содержит все файлы конфигурации, такие как гиперпараметры модели.

Папка data (подпапка src) содержит следующие файлы:

  • ingestion.py: используется для сбора данных. Если вам нужно создать резервные копии, защитить личную информацию или создать каталог метаданных, лучше всего сделать это здесь.
  • cleaning.py: используется для очистки данных за счет уменьшения выбросов/шума, обработки пропущенных значений и т. д.
  • labeling.py: используется для маркировки данных при необходимости.
  • splitting.py: используется для разделения данных на тестовые и обучающие наборы.
  • validation.py: используется для проверки данных (чтобы убедиться, что они готовы к обучению).
  • build_features.py: этот файл был перемещен в эту папку, потому что создание функций означает организацию вашего набора данных в определенную структуру.

В папке models (подпапка src) сценарии каждой модели организованы в папке модели и включают:

  • model.py: используется для определения архитектуры модели.
  • dataloader.py: используется для загрузки данных, которые будут переданы в модель.
  • preprocessing.py: используется для предварительной обработки данных перед их подачей в модель.
  • train.py: используется для обучения модели.
  • hyperparameters_tuning.py: используется для настройки модели и/или гиперпараметров обучения.
  • Predict.py: используется для прогнозирования случайныхизображений (не из набора данных).

Папка visualization включает следующее:

  • explore.py: этот файл включает функции, используемые для визуализации данных в процессе разработки данных.
  • оценка.py: этот файл включает функции, используемые для визуализации результатов обучения.

Это был шаблон MLOps, и есть несколько важных замечаний, которые следует учитывать:

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

4.1. Запуск нового проекта MLOps

Если вы хотите использовать этот шаблон для запуска своего проекта машинного обучения, вы можете использовать шаблон GitHub или шаблон Cookiecutter следующим образом:

  • Чтобы использовать шаблон GitHub, сначала вам нужно посетить страницу шаблона здесь. Затем нажмите зеленую кнопку «Использовать этот шаблон», и вам нужно будет выбрать «Создать новый репозиторий» или «Открыть в кодовом пространстве»:

  • Чтобы использовать шаблон Cookiecutter, сначала необходимо установить Cookiecutter, используя:
pip install cookiecutter

or:

conda config --add channels conda-forge
conda install cookiecutter

Затем запустите эту команду в командной строке:

cookiecutter https://github.com/Chim-SO/cookiecutter-mlops

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

project_name [project_name]: MLOps_MLflow_mnist_classification

repo_name [mlops_mlflow_mnist_classification]: 

author_name [Your name (or your organization/company/team)]: Chim SO

description [A short description of the project.]: MNIST classification

Select open_source_license:
1 - MIT
2 - BSD-3-Clause
3 - No license file
Choose from 1, 2, 3 [1]: 1

s3_bucket [[OPTIONAL] your-bucket-for-syncing-data (do not include 's3://')]: 

aws_profile [default]:
 
Select python_interpreter:
1 - python3
2 - python
Choose from 1, 2 [1]:

4.2. Использование шаблона проекта MLOps для классификации рукописных цифр

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

MLOps_MLflow_mnist_classification
├── configs
│   ├── cnnbased.yaml
│   └── singleoutput.yaml
├── data
│   ├── external
│   │   └── test
│   │       ├── 0_0.png
│   │       ├── 1_0.png
│   │       ├── 1_1.png
│   │       ├── 3_1.png
│   │       ├── 5_1.png
│   │       ├── 7_0.png
│   │       └── 8_0.png
│   ├── interim
│   ├── processed
│   │   ├── test.csv
│   │   └── train.csv
│   └── raw
│       ├── test_images.gz
│       ├── test_labels.gz
│       ├── train_images.gz
│       └── train_labels.gz
├── LICENSE
├── Makefile
├── MLproject
├── mlruns
├── models
├── README.md
├── requirements.txt
└── src
    ├── data
    │   ├── build_features.py
    │   ├── dataloader.py
    │   └── ingestion.py
    ├── models
    │   ├── cnnbased
    │   │   ├── hyperparameters_tuning.py
    │   │   ├── model.py
    │   │   ├── predict.py
    │   │   ├── preprocessing.py
    │   │   └── train.py
    │   └── singleoutput
    │       ├── hyperparameters_tuning.py
    │       ├── model.py
    │       ├── predict.py
    │       ├── preprocessing.py
    │       └── train.py
    └── visualization
        ├── evaluation.py
        └── exploration.py

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

  • Папка configs содержит два файла конфигурации, по одному для каждой модели. Например, файл singleoutput.yaml включает в себя конфигурации модели, параметры обучения, параметры регистрации (которые будут обсуждаться в следующих руководствах) и параметры для настройки модели.
# Data parameters
data:
  dataset_path : 'data/processed/'

# Model parameters
model:
  name: 'singleoutput'
  num_units: 224
  num_layers: 5
  activation_function : 'sigmoid'

# Training parameters
training:
  batch_size: 128
  num_epochs: 200
  loss_function: 'mae'
  metric: 'mse'

# Logging and output parameters
mlflow:
  mlruns_path: 'file:models/mlruns'
  experiment_name: 'singleOutput'

# Tuning
hyperparameter_tuning:
  num_layers: [3, 5]
  num_units: [16, 64, 224]
  activation_function: ['relu', 'sigmoid']
  batch_size: [128, 256]
  loss_function: ['mae']
  metric: ['mse']
  num_epochs: [200]
  • При использовании src/data/ingestion.py данные сначала загружаются и сохраняются в data/raw/. Затем он преобразуется в структуру записи с помощью src/data/build_features.py и сохраняется непосредственно в data/processed.
  • В папку data/external я добавил подпапку test, содержащую несколько случайных изображений рукописных цифр. Эти изображения будут использоваться сценарием predict.py для проверки прогнозов обученной модели на новых, невидимых данных.

  • В этом примере папка data/interim пуста, так как в конвейере обработки данных нет промежуточного шага.
  • Поскольку данные представляют собой классический набор данных, вместо дублирования загрузчика данных для каждой модели он перемещается из папки моделей в src/data/.
  • Сценарий src/models/<model>/predict.py описывает конвейер для предсказания класса случайного изображения. В отличие от конвейера предварительной обработки, используемого для обучения модели, который включает изменение размера и масштабирования, конвейер прогнозирования начинается с обрезки изображения, инвертирования пикселей, а затем изменения его размера и масштабирования.

  • Файл MLproject и папка mlruns используются библиотекой MLflow, которая представляет собой платформу, используемую для управления конвейером машинного обучения. В следующей статье эта тема будет подробно рассмотрена, так что если она для вас в новинку, не волнуйтесь.

4.3. Как запустить свой проект?

Существует несколько способов выполнения проекта Python: интерактивный запуск (выполнение его построчно), пакетный запуск (планирование задания cron или использование планировщика заданий), запуск в контейнере (с использованием Docker или Kubernetes), автоматический запуск (например, с использованием MLflow). ) или распределенные запуски (с использованием среды распределенных вычислений, такой как Apache Spark). Поскольку это не является основной темой данной статьи, давайте воспользуемся самым простым способом, выполнив эти команды из каталога проекта:

python src/data/ingestion.py -r data/raw/ # Download data
python src/data/build_features.py -r data/raw/ -p data/processed/ # Create csv files
python -m src.models.cnnbased.train -c configs/cnnbased.yaml # Train CNN model

5. Вывод

В этой статье мы предоставили шаблон структуры проекта MLOps и применили его для задачи классификации рукописных цифр. Мы продемонстрировали, как рабочий процесс MLOps применяется для решения этой проблемы, и составили шаблон структуры проекта, который вы можете использовать как проект Cookiecutter или шаблон Github. Если вы считаете шаблон полезным, поставьте ему звездочку на GitHub, чтобы другие могли его найти. Если вы новичок в MLOps, вы можете прочитать мой учебник для начинающих.

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

Спасибо, что прочитали эту статью. Вы можете найти пример проекта в моем GitHub profile. Если у вас есть какие-либо вопросы или предложения, не стесняйтесь оставлять комментарии.

Авторы изображений

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