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

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

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

Это большое улучшение в отслеживании того, что было сделано, но… Обнаружение эксперимента, который дал наилучшие показатели на панели инструментов, не означает автоматически, что эта модель готова к развертыванию. Скорее всего, вам нужно сначала воспроизвести лучший эксперимент. Однако панели мониторинга и таблицы, за которыми вы непосредственно наблюдаете, слабо связаны с самими экспериментами. Таким образом, вам по-прежнему может потребоваться полуавтоматическое отслеживание ваших шагов, чтобы сшить воедино точный код, данные и шаги конвейера для воспроизведения эксперимента. Можно ли это автоматизировать?

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

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

Версии эксперимента

Чтобы начать управление версиями экспериментов с DVC, вам необходимо инициализировать его из любого репозитория Git, как показано ниже. Обратите внимание, что DVC ожидает, что ваш проект будет структурирован определенным логическим образом, и вам может понадобиться немного реорганизовать ваши папки.

$ dvc exp init -i
This command will guide you to set up a default stage in dvc.yaml.
See https://dvc.org/doc/user-guide/project-structure/pipelines-files.
DVC assumes the following workspace structure:
├── data
├── metrics.json
├── models
├── params.yaml
├── plots
└── src
Command to execute: python src/train.py
Path to a code file/directory [src, n to omit]: src/train.py
Path to a data file/directory [data, n to omit]: data/images/
Path to a model file/directory [models, n to omit]:
Path to a parameters file [params.yaml, n to omit]:
Path to a metrics file [metrics.json, n to omit]:
Path to a plots file/directory [plots, n to omit]: logs.csv
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
default:
  cmd: python src/train.py
  deps:
  - data/images/
  - src/train.py
  params:
  - model
  - train
  outs:
  - models
  metrics:
  - metrics.json:
      cache: false
  plots:
  - logs.csv:
      cache: false
Do you want to add the above contents to dvc.yaml? [y/n]: y
Created default stage in dvc.yaml. To run, use "dvc exp run".
See https://dvc.org/doc/user-guide/experiment-management/running-experiments.

Вы также можете заметить, что DVC предполагает, что вы сохраняете параметры и метрики в файлах, а не регистрируете их с помощью API. Это означает, что вам нужно будет изменить свой код, чтобы считывать параметры из файла YAML и записывать показатели в файл JSON.

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

Преимущества подхода «эксперимент как код»

Чистый код

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

$ git diff HEAD~1 -- params.yaml
diff --git a/params.yaml b/params.yaml
index baad571a2..57d098495 100644
--- a/params.yaml
+++ b/params.yaml
@@ -1,5 +1,5 @@
 train:
   epochs: 10
-model:
-  conv_units: 16
+model:
+  conv_units: 128

Воспроизводимость

Базы данных отслеживания экспериментов не содержат всего необходимого для воспроизведения эксперимента. Одна важная часть, которая часто отсутствует, — это конвейер для запуска эксперимента от начала до конца. Давайте взглянем на файл dvc.yaml, созданный файл конвейера.

$ cat dvc.yaml
stages:
  default:
    cmd: python src/train.py
    deps:
    - data/images
    - src/train.py
    params:
    - model
    - train
    outs:
    - models
    metrics:
    - metrics.json:
        cache: false
    plots:
    - logs.csv:
        cache: false

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

Снизить уровень шума

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

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

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

Зачем использовать ДВК?

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

Управление версиями больших данных

Большие данные и модели нелегко отслеживать в Git, но с помощью DVC вы можете отслеживать их, используя собственное хранилище, но при этом они совместимы с Git. Когда инициализированный DVC начинает отслеживать папку `models`, заставляя Git игнорировать ее, но сохраняя и управляя версиями, чтобы вы могли создавать резервные копии версий где угодно и проверять их вместе с кодом вашего эксперимента.

Воспроизводимость одной командой

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

$ dvc exp run
'data/images.dvc' didn't change, skipping
Stage 'default' didn't change, skipping
Reproduced experiment(s): exp-44136
Experiment results have been applied to your workspace.
To promote an experiment to a Git branch run:
dvc exp branch <exp> <branch>

Лучшая организация филиала

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

$ dvc exp show ┏━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┓ ┃ExperimentCreatedlossacc ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━┩ │workspace-0.251830.9137 │ │mybranchOct 23, 2021-- │ │├──9a4ff1c [exp-333c9]   │ 10:40 AM     │ 0.25183 │ 0.9137 │ │├──138e6ea [exp-55e90]   │ 10:28 AM     │ 0.25784 │ 0.9084 │ │├──51b0324 [exp-2b728]   │ 10:17 AM     │ 0.25829 │ 0.9058 │ └─────────────────────────┴──────────────┴─────────┴────────┘

Как только вы решите, какими из этих экспериментов стоит поделиться с командой, их можно преобразовать в ветки Git:

$ dvc exp branch exp-333c9 conv-units-64
Git branch 'conv-units-64' has been created from experiment 'exp-333c9'.
To switch to the new branch run:
git checkout conv-units-64

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

Заключение

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

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

Спасибо, что остались со мной до конца поста! Чтобы узнать больше об управлении экспериментами с DVC, ознакомьтесь с документами