Работая над продуктивным проектом машинного обучения, вы, вероятно, имеете дело с большим количеством данных и несколькими моделями. Чтобы отслеживать, какие модели были обучены с какими данными, вы должны использовать систему для версии данных, аналогичную управлению версиями и отслеживанию вашего кода. Одним из способов решения этой проблемы является dvc (Data Version Control, https://dvc.org/), который подходит к управлению версиями данных аналогично Git.

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

├── train
│    ├── image1.jpg
│    ├── image2.jpg
│    └── image3.jpg
├── val
│    └── image4.jpg
└──test
     └── image5.jpg

Обычно минимальная система управления версиями должна обладать двумя следующими возможностями:

  • Отметьте новый набор данных новой версией, например vx.y.z
  • Возврат к старым версиям данных или переключение между разными версиями данных очень легко

Среди прочего, dvc может выполнять эти задачи. Для этого он тесно сотрудничает с Git. Сначала вам нужно установить dvc, что можно сделать с помощью pip

pip install dvc 

Чтобы запустить процесс управления версиями, вы должны создать репозиторий git в базовой папке ваших данных и затем инициализировать dvc через

git init
dvc init

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

В случае, если вам интересно, как git вписывается в эту концепцию: задача git в этом случае заключается не в версии самих данных, а в версии файлов dvc, которые сохраняют метаинформацию версии, такую ​​как расположение файлов, соответствующих специальному версия или информация о том, какой файл ваших данных принадлежит текущей версии данных.

Чтобы git игнорировал данные, dvc также автоматически записывает в файл .gitignore. Чтобы зафиксировать файл конфигурации dvc и файл .gitignore, нам нужно выполнить начальную фиксацию

git commit -m “Initial commit”

Каждая версия данных связана со своими собственными файлами .dvc, которые снова связаны с одним коммитом или одним заголовком Git. Файлы dvc определяют и отслеживают данные для данной версии, при этом сами файлы dvc отслеживаются Git. Для меня хороший способ связать новую версию данных с заголовком Git - это создать новую ветку для новой версии данных. Для этого, прежде чем мы определим нашу первую версию, мы создаем новую ветку с именем версии и проверяем эту ветку:

git checkout -b v0.0.1

Теперь мы можем определить нашу первую версию, указав dvc, какие данные следует отслеживать, в нашем случае это папки train, val и test. Это можно сделать с помощью команды dvc add:

dvc add train test val

После этого мы теперь видим новые файлы .dvc для каждой папки, например train.dvc, внутри нашей базовой папки. Сами папки были добавлены в .gitignore, чтобы git не отслеживал сами данные, что в нашем случае является задачей dvc. Чтобы отслеживать новые файлы .dvc с помощью Git, мы выполняем стандартную процедуру Git для фиксации с помощью

git add .
git commit -m "Data versioning files added to Git"

Теперь мы создали нашу первую версию наших данных, сохранив данные, принадлежащие этой версии, в наших файлах .dvc и ссылаясь на самих .dvc в текущей фиксации. Обратите внимание, что вы также можете подключить git к удаленному git для удаленного сохранения и версии файлов .dvc. Данные в этом случае остаются в текущей папке и не сохраняются удаленно (это также можно изменить с помощью dvc push and pull).

Теперь мы связали одно состояние наших данных с версией, но, конечно, вам не нужно управлять версиями данных для одного набора данных исправления. Поэтому теперь мы предполагаем, что два новых изображения (image6.jpg и image7.jpg) добавлены в папки train и test, так что теперь структура выглядит следующим образом:

├── train
│    ├── image1.jpg
│    ├── image2.jpg
│    ├── image3.jpg
│    └── image6.jpg
├── val
│    └── image5.jpg
└── test
     ├── image4.jpg  
     └── image7.jpg

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

git checkout -b v0.0.2

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

dvc add train test

Файлы train.dvc и test.dvc были изменены, и теперь dvc отслеживает, какие файлы принадлежат текущей версии. Чтобы отслеживать новые файлы .dvc внутри ветки git, мы должны сделать коммит:

git add .
git commit -m "Data versioning files added to Git"

Теперь самое интересное. При проверке веток git вы видите две разные ветки (за исключением главной), где каждая ветка соответствует одной версии данных:

master
v0.0.1
* v0.0.2

Теперь вы можете вернуться к более старой версии данных и обновить каталог данных напрямую, чтобы воссоздать старую версию данных. Чтобы вернуться к предыдущей версии, нам нужно сделать две вещи. Сначала нам нужно проверить соответствующий заголовок версии данных, которая в данном случае является веткой v0.0.1:

git checkout v0.0.1

В этой главе файлы .dvc отличаются от v0.0.2, но текущий каталог данных по-прежнему выглядит так же, а данные внутри каталога по-прежнему соответствуют v0.0.2. Это связано с тем, что dvc еще не выровнял каталог данных со своими файлами .dvc. Чтобы выровнять каталог данных с правильной версией данных, которая снова сохраняется в файлах .dvc, необходимо выполнить команду dvc checkout:

dvc checkout

Эта команда восстанавливает старую версию данных (в данном случае v0.0.1), используя ее кеш. Теперь, когда вы заглянете в свое хранилище данных, вы снова увидите следующую структуру:

├── train
│    ├── image1.jpg
│    ├── image2.jpg
│    └── image3.jpg
├── val
│    └── image4.jpg
└──test
     └── image5.jpg

Файлы image6.jpg и image7.jpg были удалены из каталогов данных и сохранены в кэш-памяти dvc. Теперь вы можете работать со старой версией данных, как обычно, с тремя папками.

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

Помимо команды init, add и checkout, dvc имеет гораздо больше функций, чтобы упростить рабочий процесс машинного обучения / больших данных. Например, можно совместно использовать версии данных между несколькими машинами, используя удаленную корзину, такую ​​как Amazon S3 Bucket, и взаимодействовать с корзиной с помощью dvc push и pull (подробности см. Https://dvc.org/).

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

Дополнительные сообщения в блоге о машинном обучении, науке о данных и статистике см. На сайте www.matthias-bitzer.de