Полное руководство по управлению версиями данных с помощью DVC в Python

Большая проблема в науке о данных

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

Традиционно инженеры-программисты сотрудничают, создавая копии центральной кодовой базы и предлагая изменения с помощью запросов на вытягивание. Затем запросы проверяются, тестируются и в случае утверждения объединяются в основную кодовую базу. Этот процесс может происходить несколько раз в течение одного дня.

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

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

По этой причине в настоящее время существует множество инструментов для решения этих проблем. Одним из них является DVC (Контроль версий данных).

Что такое контроль версий данных и DVC?

Управление версиями данных отслеживает и управляет версиями набора данных и изменений модели. Хорошая система контроля версий данных должна иметь следующие функции:

  1. Отслеживайте изменения данных/модели так же, как Git обрабатывает скрипты.
  2. Простота установки и использования: вы сможете установить его с помощью одной команды.
  3. Совместимость с существующими системами, такими как Git, поэтому не нужно изобретать велосипед.
  4. Поддержка ветвления и фиксации: должна быть поддержка изолированного создания ветвей, коммитов и экспериментов.
  5. Воспроизводимость: позволяет другим членам команды быстро и легко воспроизводить эксперименты машинного обучения.
  6. Возможности обмена: беспрепятственно обменивайтесь данными и моделями с другими пользователями для совместной работы.

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

В то время как Git хранит кодовую базу на хостингах, таких как GitHub или GitLab, DVC использует удаленное хранилище для загрузки данных и моделей. Удаленным хранилищем может быть любой облачный провайдер, такой как AWS, GCP, Azure, или даже обычный каталог на вашем локальном компьютере. Удаленный будет единственным источником правды для всего проекта, используемым всеми членами команды, точно так же, как репозиторий GitHub.

Когда DVC отслеживает файл, он добавляет его в удаленное хранилище. Затем создается облегченный файл .dvc (dot-DVC), который служит заполнителем для исходного большого файла. Он будет содержать инструкции о том, как DVC может загрузить файл с удаленного устройства.

Чему вы научитесь на уроке?

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

Статья научит вас всему, что нужно для запуска команды dvc pull и понимания почти всего, что происходит под капотом. Давайте прыгать прямо в!

Настройка проекта и окружения

Начнем с создания среды conda:

Затем перейдите в свою учетную запись GitHub и разветвите этот репозиторий. Это создаст точную версию репо под вашей учетной записью. Затем клонируйте его на терминал и перейдите в рабочий каталог.

$ git clone https://github.com/YourUsername/dvc-tutorial.git
$ cd dvc-tutorial

Теперь давайте создадим файл requirements.txt с несколькими зависимостями и установим их.

Если у вас не установлен TensorFlow с поддержкой GPU, у меня есть руководство для вас прямо здесь.

Выполнение команды echo с тегом -e позволяет обнаруживать специальные символы, такие как разрывы строк (\n).

Мы установили несколько стандартных библиотек данных: scikit-image для работы с изображениями и tensorflow для построения моделей. Последний — dvc, которому посвящена статья.

Теперь давайте построим древовидную структуру нашего проекта:

$ mkdir data notebooks src data/raw data/prepared data/prepared/train

Мы будем хранить скрипты внутри src, а data и notebooks будем хранить изображения и аналитические записные книжки, которые мы можем создать позже.

Загрузите и настройте данные

Теперь мы загрузим набор данных для проекта. Набор данных GTSRB — German Traffic Sign Recognition Benchmark содержит более 50 000 изображений, разделенных на 40 категорий дорожных знаков. Наша задача — построить свёрточную нейронную сеть, способную точно классифицировать каждую категорию.

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

$ curl "the_link_inside_quotes" -o data/traffic_signs.zip

После завершения загрузки распакуйте изображения в каталог data/raw. Затем мы можем удалить ненужные файлы и каталоги, такие как дубликаты изображений и метаданных. Это оставит нам только папки train и test внутри data/raw.

В конце концов, мы также удалили исходный zip-файл.

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

Инициализация DVC

В этом разделе будут показаны основы совместной работы Git и DVC.

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

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

$ git status -s
A  .dvc/.gitignore
A  .dvc/config
A  .dvcignore

Команда создает файл .dvcignore, который можно использовать для списка каталогов, которые DVC должен игнорировать. В репозитории Git уже есть .gitignore предварительно заполненных файлов.

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

Для простоты мы установим удаленное хранилище для этого проекта в новый каталог с именем dvc_remote в домашнем каталоге.

$ mkdir ~/dvc_remote
$ dvc remote add -d remote ~/dvc_remote

Команда remote используется для управления удаленными хранилищами. Здесь мы называем наше удаленное хранилище просто remote. Теги -d сообщают DVC, что dvc_remote — это ваш путь к удаленному хранилищу по умолчанию.

После запуска этих команд вы можете просмотреть файл config внутри папки .dvc:

Как видите, удаленное имя указано как remote, а url соответствует пути в моем домашнем каталоге. Если бы наш пульт был облачным, это был бы веб-URL.

Добавление файлов для отслеживания с помощью DVC

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

$ dvc add data

Когда запускается команда add, вот что происходит под капотом:

  1. Каталог data находится под управлением DVC.
  2. Каталог data добавляется в файл .gitignore, поэтому он никогда не будет отслеживаться git.
  3. Создается облегченный файл data.dvc, который служит заполнителем исходного каталога data.

Эти облегченные файлы .dvc (dot-DVC) постоянно отслеживаются с помощью Git. Когда пользователь клонирует наш репозиторий Git, файлы .dvc будут содержать инструкции о том, где хранятся исходные большие файлы.

Помните, что добавление файлов или папок в новую строку внутри файла .gitignore сделает их невидимыми для команд git.

Теперь, когда каталог data добавлен в каталог .gitignore, мы можем безопасно подготовить все остальные файлы с помощью git и зафиксировать их:

$ git add --all
$ git commit -m "Initialize DVC and add the raw images to DVC"

Итак, вот краткое изложение того, как использовать Git и DVC в комбинации:

  1. Всякий раз, когда вы вносите изменения в код или другие легкие файлы, отслеживайте изменения с помощью git add filename или git add --all.
  2. Всякий раз, когда в больших файлах, отслеживаемых с помощью dvc, происходят изменения, отслеживайте их, запуская dvc add file/or/dir, который обновляет соответствующий файл .dvc. Итак, вы добавляете изменение в файле .dvc на git с git add filename.dvc.

Например, запуск python src/preprocess.py изменит размер и масштаб всех изображений внутри raw/train и сохранит их в data/prepared/train:

Вы можете скопировать/вставить полную версию вышеуказанного скрипта отсюда.

Функция resize берет путь к изображению и считывает его с помощью функции imread в виде массива NumPy. Он изменяется на target_size и сохраняется по новому пути внутри каталога prepared.

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

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

Итак, мы отслеживаем новые изменения с помощью dvc add и инсценируем изменения, внесенные в data.dvc с помощью git add --all, и фиксируем изменения.

$ dvc add data
$ git add --all
$ git commit -m "Save resized images"

Загрузка файлов

Теперь давайте отправим все коммиты, сделанные с помощью git и изменений, отслеживаемых DVC. Мы запускаем git push, а затем dvc push.

git push загрузит код и файлы .dvc на GitHub, а dvc push отправит исходные изображения и изображения с измененным размером в каталог remote, который является каталогом ~/dvc_remote на вашем компьютере.

$ git push
$ dvc push

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

$ rm -rf data/raw/train

Если вы хотите повторно загрузить эти файлы, вы можете позвонить dvc pull:

$ dvc pull

dvc pull обнаружит любые различия между рабочим каталогом и удаленным хранилищем и загрузит их.

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

Построение модели классификации изображений

Пришло время построить базовую модель и отслеживать ее с помощью DVC. В src/train.py у нас есть следующий скрипт, который обучает базовую CNN, используя класс ImageDataGenerator. Поскольку в центре внимания статьи не TensorFlow, вы можете узнать, как работает ImageDataGenerator из документации.

Полный скрипт вы можете найти в репозитории здесь.

Важнейшей частью скрипта является функция main. Внутри мы подгоняем и сохраняем модель и ее метрики во вновь созданных каталогах models и metrics, используя joblib.dump.

Запускаем скрипт:

$ python src/train.py

После завершения мы добавляем каталог models в DVC:

$ dvc add models
$ git add --all
$ git commit -m "Baseline model with 0.2192 accuracy"

Затем мы запускаем git add --all еще раз, чтобы подготовить файл models.dvc и файлы metrics.dvc. Также рекомендуется помечать каждый эксперимент тегом git:

$ git tag -a baseline -m "Baseline model with 0.2192 accuracy"

Наконец, мы отправляем коммиты, изменения DVC и теги со следующим:

$ dvc push
$ git push
$ git push origin --tags

Теперь, если мы хотим повысить показатель точности, попробовав различные архитектуры CNN, мы модифицируем сценарий train.py, запустим его и отследим новые файлы model.joblib и history.joblib. Мы также создаем коммит и тег, которые обобщают производительность модели. В конце мы отправляем изменения и теги как с помощью Git, так и с помощью DVC.

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

Внутреннее устройство ЦВК

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

Мы обсудили удаленный доступ к DVC, который похож на GitHub, где вы храните последнюю официальную версию ваших данных и моделей, загруженных с помощью dvc push.

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

При вызове dvc init каталог cache добавляется в папку .dvc. Каждый раз, когда вы вызываете dvc add, файлы будут копироваться в кеш.

А теперь вы спрашиваете — разве это не дублирует файлы и не занимает место? Да! Но так же, как вы можете настроить расположение удаленного хранилища, вы можете настроить кеш.

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

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

$ dvc cache dir path/to/shared_cache
$ mv .dvc/cache/* path/to/shared_cache

Команда mv перемещает файлы из старого кеша в новое расположение кеша.

Убедитесь, что все члены команды имеют права на чтение/запись path/to/shared_cache при совместном использовании одного компьютера для разработки.

Если вы работаете самостоятельно, нет необходимости выполнять этот шаг.

Заключение

Вот краткое изложение работы с DVC:

  • Проект DVC инициализируется поверх репозитория Git с помощью dvc init.
  • Вы должны настроить пульт для проекта с dvc remote add -d remote_name path/to/remote
  • Чтобы начать отслеживать файлы, используйте dvc add
  • dvc add копирует указанный каталог или файлы в .dvc/cache или shared_cache/you/specified, создает .dvc файлов для каждой отслеживаемой папки или файла и добавляет их в .gitignore
  • .dvc и другие файлы отслеживаются с помощью git add --all
  • Для отправки коммитов и изменений файлов с отслеживанием DVC используйте как git push, так и dvc push.
  • dvc push загружает файлы из кеша в удаленное хранилище
  • Пометьте каждый запуск эксперимента машинного обучения тегом и повторите dvc add/dvc push и git add/git push для каждого измененного файла.

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

Спасибо за чтение!

Вторая часть статьи:



Третья часть:







Цитата для набора данных:

Дж. Сталкамп, М. Шлипсинг, Дж. Салмен и К. Игель. Немецкий эталон распознавания дорожных знаков: многоклассовое классификационное соревнование. В Материалы совместной международной конференции IEEE по нейронным сетям, стр. 1453–1460. 2011.

Вот еще несколько историй от меня:







Полное руководство по SHAP: как объяснить любую модель машинного обучения «черный ящик на Python
Объясните любую модель черного ящика нетехническим специалистамtowardsdatascience.com»