"Видеоурок"

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

Изучите принципы построения обслуживаемых конвейеров машинного обучения с использованием DVC.

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

DVC - это система контроля версий с открытым исходным кодом для проектов машинного обучения. Сначала я подумал, что это просто Git для больших файлов, но на самом деле система удовлетворяет все мои потребности в экспериментах и ​​управлении конвейером. Недавно они выпустили DVC 1.0 вместе с новым Руководством по началу работы », Который я использовал в качестве отправной точки для этого урока.

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

Что мы будем строить

Давайте построим модель для классификации набора данных 20newsgroups. Чтобы упростить этап оценки, мы будем использовать только две категории. Это основной скрипт для этого:

Хороший рабочий процесс для написания чистого и поддерживаемого кода - это постоянно улучшать качество кода. Можно поэкспериментировать и посмотреть, работает ли это (как мы делали это в main.py выше). Теперь, когда мы знаем, что будем создавать, мы можем сделать следующий шаг и сделать код более удобным для сопровождения.

💡 Принцип построения трубопроводов с использованием DVC

Если мы внимательно рассмотрим main.py, мы можем разбить сценарий на эти известные шаги машинного обучения:

1 - Сбор данных

2 - Сгенерируйте особенности

3 - Обучите модель

4 - Оцените модель

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

  • Напишите сценарий Python для каждого из этих шагов.
  • Сохраните параметры, которые использует каждый скрипт, в yaml файле.
  • Укажите файлы, от которых зависит
  • Укажите файлы, которые создает каждый скрипт.

Давайте установим DVC и посмотрим, как выполнить эти шаги.

🔨 Установка DVC

Я использую Linux, и мы собираемся установить DVC как библиотеку Python. Чтобы продолжить, в вашей среде должны быть установлены Python 3, pip и Git. Мы собираемся создать виртуальную среду для проекта (совет: если вы заботитесь об управлении своими проектами, вы всегда должны это делать). DVC лучше всего работает в репозитории Git, поэтому мы инициализируем его перед запуском проекта DVC:

$ mkdir dvc_tutorial
$ cd dvc_tutorial
$ python3 -m venv .env
$ source .env/bin/activate
(.env)$ pip3 install dvc
(.env)$ git init
(.env)$ dvc init

И мы готовы к работе. Теперь давайте реализуем каждый шаг.

📍 1 —Этап «сбор данных»

Мы используем fetch_20newsgroups() метод Scikit для загрузки данных в память, но я хочу сохранить его в файл, чтобы использовать его в качестве зависимости для следующего шага конвейера. Итак, в этом скрипте я соберу данные и сохраню их в файл csv.

Назовем этот этап подготовить.

Сначала я использовал три категории (['comp.graphics', 'sci.space', 'rec.sport.basecball']), но затем, когда я перешел к этапу оценки, я подумал, что учебное пособие было бы проще, если бы я использовал только две категории. Затем мне пришлось снова создать набор данных, указав новый список с этими категориями. Это показало мне, что было бы неплохо использовать категории в качестве параметра для этого скрипта. DVC использует файл params.yam в качестве файла параметров по умолчанию, поэтому давайте создадим его и определим в нем категории:

# file params.yaml
prepare:
    categories:
        - comp.graphics
        - sci.space

prepare - это имя этапа, categories - имя параметра, и для создания списка с использованием yaml мы добавляем - перед каждым элементом.

Я хочу сохранить данные в папке data/prepared, поэтому мы воспользуемся сценарием для этого. Вот последний prepare.py файл:

Для выполнения этого этапа конвейера мы зависим только от файла кода сценария, и мы будем сохранять файлы, созданные сценарием, в папке data/prepared. Теперь у нас есть все компоненты для создания этого шага:

  • Напишите сценарий Python: prepare.py
  • Сохраните параметры: categories внутри params.yaml
  • Укажите файлы, от которых зависит сценарий: prepare.py
  • Укажите файлы , которые сценарий создает: папку data/prepared

Чтобы все было организовано, мы сохраним сценарии в папке src, поэтому давайте создадим ее:

(.env)$ mkdir src
(.env)$ cd src # now save the prepare.py file here

Содержимое вашей папки dvc_tutorial должно выглядеть так:

├── params.yaml
└── src
    └── prepare.py

Готово, теперь давайте узнаем, как построить этот этап с помощью DVC.

⏺ dvc run - этапы строительства с использованием DVC

DVC сохраняет этапы конвейера в файл dvc.yaml (читаемый человеком) и dvc.lock (только для использования DVC). Чтобы создать этап конвейера, мы используем команду dvc run. Это основные варианты:

-n <stage>: specify a name for the stage generated by this command
-p [<path>:]<params_list>: specify a set of parameter dependencies the stage depends on
-d <path>: specify a file or a directory the stage depends on
-o <path>: specify a file or directory that is the result of running the command

После установки этих параметров мы добавляем аргумент команды, в котором указываем как на самом деле запустить этот шаг конвейера. На этом шаге команда будет python3 src/prepare.py. Давайте сначала установим зависимости, которые prepare.py нужны:

(.env)$ pip install pyyaml scikit-learn pandas

А теперь давайте запустим команду dvc run, чтобы сгенерировать сцену:

(.env)$ dvc run -n prepare -p prepare.categories -d src/prepare.py -o data/prepared python3 src/prepare.py
Running stage 'prepare' with command:                                           
        python3 src/prepare.py
Creating 'dvc.yaml'                                                                                                                                
Adding stage 'prepare' in 'dvc.yaml'
Generating lock file 'dvc.lock'
To track the changes with git, run:
git add dvc.yaml data/.gitignore dvc.lock

Теперь ваша папка выглядит так:

├── data
│   └── prepared
│       ├── test.csv
│       └── train.csv
├── dvc.lock
├── dvc.yaml
├── params.yaml
└── src
    └── prepare.py

И это содержимое файла dvc.yaml, автоматически созданного DVC:

stages:
  prepare:
    cmd: python3 src/prepare.py
    deps:
    - src/prepare.py
    params:
    - prepare.categories
    outs:
    - data/prepared

Довольно просто, правда?

🔬 dvc dag - Визуализируйте конвейер с помощью DVC

Команда dvc dag отображает этапы конвейера. Пока у нас только один этап, но давайте посмотрим:

(.env)$ dvc dag
+---------+  
| prepare |  
+---------+  
~
~
/tmp/tmpixsrsfo0 (END)

Вы можете нажать q, чтобы скрыть визуализацию.

⏯ dvc repro - Воспроизведение трубопроводов с помощью DVC

Команда dvc repro воспроизводит полные или частичные конвейеры, выполняя команды, определенные на их этапах. Как говорится в документах:

DVC попутно кэширует релевантные артефакты данных и рекурсивно выполняет поиск на этапах конвейера, чтобы определить, какие из них были изменены. Затем он выполняет соответствующие команды. Выходные данные удаляются из рабочей области перед выполнением команды этапов, которая их создает. - репродукции

Круто, тогда давайте протестируем (пока не вносил никаких изменений):

(.env)$ dvc repro
Stage 'prepare' didn't change, skipping                                         
Data and pipelines are up to date.

Что, если я изменю название категории?

# file params.yaml
prepare:
    categories:
        - comp.graphics
        - rec.sport.baseball # it was 'sci.space'

А потом снова запустить команду?

(.env)$ dvc repro
Running stage 'prepare' with command:                                           
        python3 src/prepare.py
Updating lock file 'dvc.lock'
To track the changes with git, run:
git add dvc.lock

Он снова запускает этап, потому что мы добавили -p prepare.categories в качестве параметра для этого этапа. Затем DVC увидел, что мы изменили этот параметр, и снова запустил этап. Файл dvc.yaml остался прежним, но если вы посмотрите файл dvc.lock, вы увидите, что параметры там изменились. Удивительно, правда?

Итак, это основы создания, запуска и визуализации этапов конвейера:

  • dvc run
  • dvc dag
  • dvc repro

Теперь перейдем к следующему этапу конвейера.

📍 2 - Шаг «Создание функций»

Назовем этот этап featurize.

На этом этапе мы будем использовать TfidfVectorizer Scikit и сохраним преобразованную матрицу в файлы pickle внутри папки data/features. Мы будем полагаться на файл сценария и папку data/prepared, так что вот наш рецепт:

  • Напишите сценарий Python: featurize.py
  • Сохраните параметры: (нам не нужны)
  • Укажите файлы, от которых зависит сценарий: featurize.py и data/prepared
  • Укажите файлы , которые сценарий создает: папку data/features

Это последний featurize.py файл:

Вы должны сохранить его в папке /src, а затем создать сцену с помощью DVC следующим образом:

(.env)$ dvc run -n featurize -d src/featurize.py -d data/prepared -o data/features python3 src/featurize.py data/prepared data/features

Идите вперед и запустите команду dvc dag, чтобы проверить новый шаг конвейера.

📍 3 - Шаг "обучение модели"

На этом этапе мы, наконец, обучим модель и сохраним ее в файл pickle. Мы воспользуемся наивным байесовским классификатором и установим только параметр альфа. Это рецепт:

  • Напишите сценарий Python: train.py
  • Сохраните параметры: alpha внутри params.yaml
  • Укажите файлы, от которых зависит сценарий: train.py и data/features
  • Укажите файлы , которые создает сценарий: файл model.pkl

Сначала добавим новый параметр alpha:

# file params.yaml
prepare:
    categories:
        - comp.graphics
        - sci.space
train:
    alpha: 0.1

Затем сохраните сценарий train.py внутри /src:

И, наконец, создайте сцену с помощью DVC:

(.env)$ dvc run -n train -p train.alpha -d src/train.py -d data/features -o model.pkl python3 src/train.py data/features model.pkl

📍 4 - Этап «оценка модели»

На этом этапе мы познакомимся с двумя новыми параметрами dvc run: --metrics и --plots:

-m <path>: specify a metrics file produced by this stage. This option behaves like -o but registers the file in a metrics field inside the dvc.yaml stage
--plots <path>: specify a plot metrics file produces by this stage. This option behaves like -o but registers the file in a plots field inside the dvc.yaml stage

Мы воспользуемся метрикой Площадь под кривой (AUC) и вычислим пары точность-отзыв для различных пороговых значений вероятности для построения графики. Для этого мы создадим скрипт для сохранения scores.json файла с показателем AUC и plots.json файла с парами точность / отзыв / порог:

Продолжайте и сохраните этот evaluate.py сценарий в папке /src.

Что касается файлов показателей и графиков, у нас есть два варианта:

  • Позвольте DVC отслеживать файлы показателей / графиков или
  • Отслеживайте файлы показателей / графиков с помощью Git

Поскольку в этом руководстве мы не видели, как использовать DVC для отслеживания файлов, мы выберем второй вариант и сами отслеживаем файлы с помощью Git. Для этого мы воспользуемся командами --metrics-no-cache и --plots-no-cache. Рецепт этого этапа:

  • Напишите сценарий Python: evaluate.py
  • Сохраните параметры: (нам не нужны)
  • Укажите файлы, от которых зависит сценарий: evaluate.py, model.pkl и data/features
  • Укажите файлы, которые создает сценарий: (нет)
  • (НОВИНКА) Укажите файлы показателей и графиков: scores.json и plots.json

Хорошо, теперь давайте создадим этот последний шаг:

(.env)$ dvc run -n evaluate -d src/evaluate.py -d model.pkl -d data/features --metrics-no-cache scores.json --plots-no-cache plots.json python3 src/evaluate.py model.pkl data/features scores.json plots.json

🏋🏿 dvc metrics - сравнение показателей с помощью DVC.

Команда dvc metrics позволяет отображать и сравнивать метрики. dvc metrics show выводит значения показателей, а dvc metrics diff показывает разницу между значениями показателей при изменении файла показателей (перед их фиксацией с помощью Git). Давайте посмотрим на это в действии.

dvc metrics show позволяет нам видеть текущие результаты:

(.env)$ dvc metrics show
scores.json:                                                            
        auc: 0.9993366236676577

(☕️ хм, запах переобучения ... но сегодня это не исключение, так что давайте продолжим 😜)

Давайте проверим параметры, которые мы сейчас используем:

# file params.yaml
prepare:
    categories:
        - comp.graphics
        - rec.sport.baseball
train:
    alpha: 0.1

Команда dvc metrics diff вычисляется между предыдущей фиксацией и текущим состоянием, поэтому давайте сначала зафиксируем этот эксперимент:

(.env)$ git add src/ params.yaml dvc.yaml dvc.lock scores.json plots.json
(.env)$ git commit -m "exp: alpha=0.1"

Теперь давайте сначала изменим параметр alpha:

# file params.yaml
prepare:
    categories:
        - comp.graphics
        - rec.sport.baseball
train:
    alpha: 0.9

А потом снова все запускаем:

(.env)$ dvc repro
Stage 'prepare' didn't change, skipping                                         
Stage 'featurize' didn't change, skipping
Restored stage 'train' from run-cache
Skipping run, checking out outputs
Updating lock file 'dvc.lock'
Restored stage 'evaluate' from run-cache
Skipping run, checking out outputs
Updating lock file 'dvc.lock'
To track the changes with git, run:
git add dvc.lock

Мы можем увидеть разницу параметров с dvc params diff:

(.env)$ dvc params diff
Path         Param        Old    New                                            
params.yaml  train.alpha  0.1    0.9

И, наконец, посмотрите, как меняются оценки с dvc metrics diff:

(.env)$ dvc metrics diff
Path         Metric    Value    Change                                          
scores.json  auc       0.99869  -0.00064

📊 графики dvc - визуализируйте и сравнивайте метрики с помощью DVC

Команда dvc plots создает графики в виде файлов HTML, которые можно открывать в веб-браузере. Эти HTML-файлы используют Vega-Lite. Построим кривую точного отзыва. Файл plots.json выглядит так:

# file plots.json
{
  "proc": [
    {
      "precision": 0.927570093457944,
      "recall": 1.0,
      "threshold": 0.4513363759032511
    },
    {
      "precision": 0.927400468384075,
      "recall": 0.9974811083123426,
      "threshold": 0.45201756623495926
    },
    # [...]
  ]
}

И нам нужен график с точностью по оси Y и запоминанием по оси Y, поэтому давайте построим его:

(.env)$ dvc plots show -y precision -x recall plots.json

Мы даже можем построить график разницы между оценками точности для альфа = 0,1 и альфа = 0,9.

(.env)$ dvc plots diff --targets plots.json -y precision

И это конец нашего тура. Вы можете проверить дополнительные параметры и конфигурации графиков здесь: https://dvc.org/doc/command-reference/plots.

Последний код этого руководства находится здесь.

Заключительные замечания

Использование DVC для отслеживания экспериментов и управления конвейерами машинного обучения действительно может вывести наши проекты на новый уровень. Чтобы сделать ваши проекты машинного обучения воспроизводимыми, необходимо создать отдельные сценарии Python для каждого шага и указать параметры, входы и выходы. используется каждым скриптом. Вы можете сделать это с помощью простой команды dvc run и использовать dvc repro для запуска конвейера по своему усмотрению.

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

На сегодня все, спасибо за чтение! 😁