Начните свое практическое путешествие с MLOps здесь

Введение

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

В официальной документации это описано как…

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

В этой статье мы рассмотрим, как Kedro помогает нам создавать повторяемый, автоматизированный код, известный как конвейер.

Оглавление

Получить блокнот

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

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

Чтобы узнать, как реорганизовать код, ознакомьтесь со статьей здесь:



Если вам нужен только блокнот, ничего больше не говорите:



Окончательный репозиторий, содержащий полный проект Kedro, находится здесь:



Создать проект Кедро

Теперь мы готовы перейти к MLOps.

Создайте новую папку где-нибудь на вашем компьютере. Перейдите в эту папку и откройте терминал или окно bash.

Начните с создания новой среды. Я рекомендую использовать Conda для управления средами. Kedro рекомендует использовать 1 среду для каждого проекта.

conda create -n house_prices_mlops python=3.8 anaconda

Убедитесь, что вы активировали среду

conda activate house_prices_mlops

Затем установите Kedro, используя

conda install -c conda-forge kedro

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

kedro new

Наконец, при необходимости вы можете инициализировать репозиторий git. Я не сделал этого в этот раз.

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

├── conf
   ├── base
      ├── catalog.yml
      ├── logging.yml
      ├── parameters.yml
   ├── local 
      ├── credentials.yml
├── data
   ├── 01_raw
   ├── 02_intermediate
   ├── 03_primary
   ├── 04_feature
   ├── 05_model_input
   ├── 06_models
   ├── 07_model_output
   ├── 08_reporting
├── docs
   ├── source
      ├── conf.py
      ├── index.rst
├── logs
   ├── journals
├── notebooks
├── src
   ├── project_name
      ├── __pycache__
      ├── pipelines
         ├── __init__.py 
      ├── __init__.py
      ├── __main__.py
      ├── cli.py
      ├── hooks.py
      ├── pipeline_registry.py
   ├── tests
      ├── pipelines
         ├── __init__.py
      ├── __init__.py
      ├── test_run.py 
   ├── requirements.in
   ├── requirements.txt
   ├── setup.py
├── pyproject.toml
├── README.md
├── setup.cfg

Если вы скачали мой блокнот, вы можете добавить его в папку блокнотов ./house_prices_mlops/notebooks.

Добавьте пакеты Python в файл Requirements.txt.

Для каждого пакета, импортированного в ваши записные книжки, вам нужна запись в файле requirements.txt. Это файл, содержащий все пакеты Python, используемые в проекте. Они устанавливаются как часть шагов инициализации Kedro.

Если вам нужен простой способ извлечения требований из Jupyter Notebook, посмотрите здесь:



После того, как вы создали свой файл, скопируйте содержимое в эквивалент Kedro, который находится здесь:

├── conf
├── data
├── docs
├── logs
├── notebooks
├── src
   ├── requirements.txt

Обратите внимание, что мы используем файл .txt, а не .in.

Мой готовый файл requirements.txt находится в основном репо, здесь.

Настройка каталога данных

Каталог данных представляет собой файл .yml, используемый Kedro для загрузки и сохранения данных. Это означает, что мы можем получить доступ к данным, используя имя набора данных вместо пути к файлу.

Каждый набор данных, который вы читаете или сохраняете, должен быть зарегистрирован в каталоге данных.

Каталог находится здесь:

├── conf
   ├── base
      ├── catalog.yml
      ├── logging.yml
      ├── parameters.yml
├── data
├── docs
├── logs
├── notebooks
├── src

Сначала скопируйте файл необработанных данных в каталог ниже.

├── conf
├── data
   ├── 01_raw
├── docs
├── logs
├── notebooks
├── src

Затем зарегистрируйте необработанные данные в файле catalog.yml. Мой набор данных называется house_prices, поэтому в файле catalog.yml нужны следующие строки:

house_prices:
 type: pandas.CSVDataSet
 filepath: data/01_raw/train.csv

Теперь мы можем ссылаться на этот набор данных в других областях Кедро.

На этом этапе вы можете сохранить и закрыть файл catalog.yml.

Создайте новый конвейер

Конвейер — это серия преобразований, известных как узлы. Для его создания нам нужны 2 файла Python:

  • Файл nodes, представляющий собой функции Python для отдельных преобразований.
  • Файл конвейера, который определяет порядок и параметры функций Python.

Нам нужно создать несколько файлов и папок здесь, чтобы начать. Каждый конвейер должен иметь свой собственный конвейер и файл узлов в своей папке. Обычно создаются отдельные конвейеры для отдельных этапов, например. EDA, обработка данных, обучение моделей. Давайте создадим конвейер обработки данных.

Создайте папки и пустые файлы Python, соответствующие приведенной ниже структуре. Элементы, выделенные курсивом, — это те элементы, которые необходимо создать.

├── conf
├── data
├── docs
├── logs
├── notebooks
├── src
   ├── project_name
      ├── pipelines
         ├── __init__.py
         ├── data_processing
            ├── __init.py__
            ├── nodes.py
            ├── pipeline.py

Начните с открытия только что созданного файла __init__.py и добавления приведенной ниже строки кода. Затем сохраните и закройте его.

from .pipeline import create_pipeline

Создание узлов

Узел — это термин Kedro для трех элементов: функции Python, местоположения и параметров ввода и местоположения выхода. Если вы используете мою записную книжку выше, шаги уже превращены в простые функции, которые мы можем легко превратить в узлы.

Чтобы создать файл nodes.py,

  • Откройте файл, созданный на предыдущем шаге.
  • Скопируйте все импортированные пакеты Python в верхнюю часть файла.
  • Скопируйте каждую функцию из своей записной книжки в файл nodes.py.

Вот пример одной из функций блокнота.

import pandas as pd
def remove_outliers(train):
   train = train.copy()
   train = train.drop(
   train[(train[‘GrLivArea’]>4000) & 
   (train[‘SalePrice’]<30000)].index)
   return train

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

Мы добавим эту функцию в конвейер перед обновлением словаря параметров.

Строительство трубопровода

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

node(
 func=remove_outliers,
 inputs=[“house_prices”, “parameters”],
 outputs=”house_prices_no_outliers”,
 name=”outliers_node”,)
  • func: имя используемой функции из файла nodes.py.
  • входные данные. В этом примере список содержит источник данных (с использованием имени Kedro, определенного в каталоге данных) и файл Kedro parameter.yaml, который Kedro называет параметрами.
  • выходные данные:другой источник данных Kedro, определенный в каталоге данных.
  • имя:имя узла.

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

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

def create_pipeline(**kwargs):
   return Pipeline(
        [
           node(),
           node(),
           node(),])

Словарь параметров

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

Словарь представляет собой файл .yml, расположенный здесь:

├── conf
   ├── base
      ├── catalog.yml
      ├── logging.yml
      ├── parameters.yml
├── data
├── docs
├── logs
├── notebooks
├── src

Чтобы использовать это, нам нужны 3 вещи

  • Пара ключ-значение в словаре, содержащем нужную нам информацию.
  • Словарь параметров, указанный в наших узлах и файле конвейера.
  • Словарь необходимо вызывать в каждой используемой функции.

Допустим, мы хотим поэкспериментировать с удалением выбросов на разных уровнях.

В словаре параметров нам нужно дать значениям имя. Я вложил это, поместив переменные GrLivArea и SalePrice внутрь выбросов.

outliers: 
  GrLivArea: 4000
  SalePrice: 300000

В Python вы можете получить доступ к этому словарю стандартным способом, например.

parameters['outliers']['GrLivArea']
>>> 4000

Теперь мы можем обновить нашу функцию, включив словарь параметров.

  • Включите словарь параметров в качестве аргумента ключевого слова.
  • Вызовите его в соответствующей части функции.
def remove_outliers(train, parameters):
   train = train.copy()
   train = train.drop(
   train[(train[‘GrLivArea’]>parameters[‘outliers’][‘GrLivArea’]) & 
   (train[‘SalePrice’]<parameters[‘outliers’][‘SalePrice’])].index)
   return train

На данный момент «параметры» — это просто аргумент ключевого слова. Мы предоставляем это вместе с самим словарем в файле pipe.py. Файл параметра.yaml имеет собственное имя в Kedro, поэтому мы просто включаем строку «параметры» в наш конвейер.

node(
  func=remove_outliers,
  inputs=[“house_prices”, “parameters”],
  outputs=”house_prices_no_outliers”,
  name=”outliers_node”,

Заполнение Nodes.py и Pipeline.py и словаря параметров

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

Nodes.py

Добавьте каждую функцию в файл узлов и убедитесь, что вы включили все соответствующие импорты.

Мы регистрируем все, что хотим изменить, в словаре параметров и гарантируем, что параметры являются аргументом ключевого слова в функции.

Файл готовых узлов находится здесь.

Pipeline.py

Теперь мы можем зарегистрировать каждый узел в конвейере. Это довольно просто — нам просто нужно добавить имя каждого узла и входы/выходы, как мы делали раньше.

Готовый файл пайплайнов здесь.

Словарь параметров

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

Заполнение каталога данных

Вы заметите, что в узлах мы используем строки для определения входных и выходных данных каждой функции. Это могут быть файлы .csv (или файлы другого совместимого типа). Мы должны сообщить Kedro, что представляет собой каждый файл, и дать ему имя. Все это указано в одном месте — Каталоге данных. Мы уже добавили один файл, но давайте рассмотрим его подробнее.

Каталог данных представляет собой файл .yml, расположенный здесь:

├── conf
   ├── base
      ├── catalog.yml
      ├── logging.yml
      ├── parameters.yml
├── data
├── docs
├── logs
├── notebooks
├── src

Минимум для определения источника данных — это 3 вещи: имя, тип данных и путь к файлу данных. Ранее мы добавили набор данных house_prices, который должен выглядеть примерно так.

house_prices:
   type: pandas.CSVDataSet
   filepath: data/01_raw/train.csv

Однако в нашем первом узле мы также определили выходной набор данных, «house_prices_no_outliers». Кедро тоже нужно знать, куда это сохранять, определяется точно так же.

house_prices_no_outliers:
   type: pandas.CSVDataSet
   filepath: data/02_intermediate/house_prices_no_outliers.csv

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

y_train:
  type: pandas.CSVDataSet
  filepath: data/05_model_input/y_train.csv
house_prices_drop:
  type: pandas.CSVDataSet
  filepath: data/02_intermediate/house_prices_drop.csv
house_prices_no_na:
  type: pandas.CSVDataSet
  filepath: data/02_intermediate/house_prices_no_na.csv
house_prices_clean:
  type: pandas.CSVDataSet
  filepath: data/02_intermediate/house_prices_clean.csv

Регистрация конвейеров

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

Теперь мы можем собрать это вместе в реестре конвейера.

Это файл .py, хранящийся в:

├── conf
├── data
├── docs
├── logs
├── notebooks
├── src
   ├── project_name
      ├── pipeline_registry.py

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

Запустить проект

Теперь у нас есть все необходимое для запуска нашего проекта и обработки данных!

Чтобы запустить конвейеры, просто перейдите в корневой каталог (тот, который содержит папки conf, data, docs и т. д.) и введите в командной строке следующее:

kedro run

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

INFO — Completed 5 out of 5 tasks
INFO — Pipeline execution completed successfully

Удобный способ понять свои шаги — создать визуализацию. Для этого вам понадобится pip install kedro-viz. "Вы можете прочитать больше об этом здесь."

pip install kedro-viz

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

Выводы

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

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

Узнать больше