Цель этой статьи — познакомить вас с DVC и дать краткое руководство по началу его использования.
Что такое DVC?
Разработанный для работы с большими файлами, наборами данных, моделями машинного обучения, метриками и вашим кодом, DVC — это проект с открытым исходным кодом, который делает модели машинного обучения воспроизводимыми и общедоступными.
Философия инструментов DVC заключается в том, чтобы привнести лучшие практики разработки программного обеспечения в машинное обучение.
Код и данные связаны, поэтому нам не нужно беспокоиться об их отслеживании по отдельности каждый раз, когда мы запускаем эксперимент.
Как работает управление версиями данных?
Версии исходного кода можно изменить с помощью Git. Для совместной работы мы обычно используем GitHub, GitLab или собственный Git-сервер в дополнение к локальной копии. Локальные и удаленные файлы можно синхронизировать с помощью команд git push и git pull.
Хотя Git хорошо работает с небольшими файлами, с большими файлами (такими как наборы данных или модели) возникают проблемы. Система DVC построена поверх Git и аналогичным образом управляет данными.
В DVC метаданные о разных версиях файлов хранятся в истории Git. Таким образом, коммиты Git связаны с нашими данными и моделями.
Когда мы указываем DVC отслеживать большие файлы или каталоги с помощью dvc add, данные перемещаются в кэш DVC (наша локальная копия). Git гораздо более дружелюбен к маленьким файлам, чем к большим, поэтому DVC создает крошечный файл метаданных, который можно зафиксировать вместо реальных файлов данных.
Файлы метаданных содержат информацию о том, где хранятся данные. Как правило, это будет удаленное хранилище, например AWS S3, Google Cloud, Azure или SFTP-сервер.
Что происходит внутри?
Мы можем запустить dvc add в подробном режиме, чтобы получить немного больше информации о том, как DVC выполняет управление версиями данных:
dvc add -v Computed stage: 'file.txt.dvc' md5: 'None' Preparing to transfer data from 'memory://dvc-staging/85207a32b6773e0046773419df47e57753028701c9ec0b10d8ca782f0c8032a3' to '/home/coding/dvc_repo/.dvc/cache' Preparing to collect status from '/home/coding/dvc_repo/.dvc/cache' Collecting status from '/home/coding/dvc_repo/.dvc/cache' Preparing to collect status from 'memory://dvc-staging/85207a32b6773e0046773419df47e57753028701c9ec0b10d8ca782f0c8032a3' Removing '/home/coding/dvc_repo/.m7XMCEPHPZ8siiCP9atGzJ.tmp' Removing '/home/coding/dvc_repo/.dvc/cache/.Bih4nnvvbQa6RfSnrTFJnC.tmp' Removing '/home/coding/dvc_repo/file.txt' Saving information to 'file.txt.dvc'.
Первоначально DVC проверяет, не был ли уже создан метафайл для добавленного нами файла. Как показывает md5: «Нет», это не так.
После этого DVC сохраняет данные в кэш DVC, а затем удаляет оригинал. На последнем этапе вся необходимая информация сохраняется в метафайл DVC.
outs: - md5: daff69620dbb16d76b1117013254f7aa size: 27 path: file.txt
Метафайлы содержат хэши MD5 файлов и их расположения.
DVC будет извлекать файл Daff69620dbb16d76b1117013254f7aa каждый раз, когда ему будет дано указание извлечь файл file.txt в текущем каталоге.
Поскольку версия метафайла контролируется Git, DVC связывает данные с конкретными версиями кода.
Изменение нашего набора данных будет представлять собой обновленный метафайл DVC и, следовательно, новую фиксацию в нашей истории Git.
В этом случае кэш DVC, который мы до сих пор использовали, расположен на нашей локальной машине. Однако, как правило, мы также хотели бы иметь версии наших данных в удаленном хранилище.
Удаленный — это место, куда DVC отправляет наши данные для постоянного хранения. Это аналог удаленного репозитория Git (например, GitHub или GitLab).
DVC поддерживает множество удаленных хранилищ, включая Amazon S3, Google Cloud Storage, Azure Blob Storage и другие.
Пример управления версиями
Теперь мы собираемся реализовать руководство по управлению версиями данных с помощью DVC и Git.
После создания нашей среды
$ conda create --name dvc python=3.8.2 -y $ conda activate dvc
Первое, что нужно сделать после создания папки, это инициализировать git и dvc.
$ mkdir dvc_dir && cd dvc_dir $ git init $ dvc init
Мы используем функцию dvc get для загрузки набора данных в папку, созданную ранее.
$ mkdir data $ dvc get https://github.com/iterative/dataset-registry/get-started/data.xml -o data/data.xml
Внутри нашего каталога данных у нас есть новый файл с именем data.xml.
$ ls -lh data/ >> -rw-rw-r-- 1 coding coding 14M nov 11 18:47 data.xml
Теперь, когда у нас есть данные, мы собираемся добавить их в отслеживание DVC.
$ dvc add data/data.xml >> To track the changes with git, run: >> git add data/.gitignore data/data.xml.dvc >> To enable auto staging, run: >> dvc config core.autostage true
Давайте добавим два новых файла, которые были сгенерированы, когда мы запустили dvc add, как предлагает DVC выше, и зафиксируем их.
$ git add data/.gitignore data/data.xml.dvc $ git commit -m "Add raw data" $ ls data/ >> data.xml data.xml.dvc
Давайте проверим файл data.xml.dvc внутри:
$ cat data/data.xml.dvc >> outs: >> - md5: 22a1a2931c8370d3aeedd7183606fd7f >> size: 14445097 >> path: data.xml
Это стандартный файл .dvc только с одним выходом (полем outs). Хэш-значение (поле md5) соответствует пути к файлу в кеше.
На данный момент у нас есть набор данных, который отслеживается dvc, но этот набор данных живет на нашей машине. Мы хотим отправить его в наше удаленное хранилище, поэтому для этого мы добавим удаленное хранилище DVC. Мы собираемся сделать это с помощью Google Диска, одного из самых простых в настройке.
$ dvc remote add -d storage gdrive://gdrive_id_folder
Информация о хранилище находится в конфигурационном файле DVC.
$ cat .dvc/config >>[core] >> remote = storage >>['remote "storage"'] >> url = gdrive://gdrive_id_folder
Теперь мы собираемся зафиксировать наш файл конфигурации dvc, чтобы сохранить его и отправить в удаленное хранилище DVC.
$ git commit .dvc/config -m "Configure remote storage" $ dvc push
Как мы видим, файл был загружен в удаленное хранилище dvc.

Попробуем извлечь данные из архива DVC, перед этим удалим уже находящиеся там файлы, чтобы не было дубликатов.
$ rm -f data/data.xml && rm -rf .dvc/cache/ $ dvc pull
Может случиться так, что у вас есть следующая ошибка
<HttpError 403 when requesting *www.googleapis.com link* returned "This file has been identified as malware or spam and cannot be downloaded". Details: "[{'domain': 'global', 'reason': 'abuse', 'message': 'This file has been identified as malware or spam and cannot be downloaded'}]">
В этом случае запустите это
$ dvc remote modify myremote gdrive_acknowledge_abuse true
Теперь мы попытаемся изменить наш набор данных, а затем воспользуемся DVC и git, чтобы посмотреть, как мы можем двигаться вперед и назад во времени с различными версиями набора данных.
Мы внесем искусственное изменение в наши данные, добавив копию данных к оригиналам.
$ cp data/data.xml /tmp/data.xml $ cat /tmp/data.xml >> data/data.xml
Как мы видим, размер файла увеличен в два раза по сравнению с оригиналом.
$ ls -lh data/ >> totale 28M -rw-rw-r-- 1 coding coding 28M nov 11 19:55 data.xml -rw-rw-r-- 1 coding coding 80 nov 11 18:49 data.xml.dvc
Когда мы внесли это изменение, наш файл dvc также изменился.
Чтобы отследить изменение, мы собираемся выполнить фиксацию и отправить нашу последнюю версию набора данных в облачное хранилище.
$ dvc add data/data.xml $ git add data/data.xml.dvc $ git commit -m "Dataset updates" $ dvc push
Мы можем подтвердить это, когда заглянем в наш репозиторий, где появилась новая папка. Теперь у нас есть две разные версии нашего набора данных в облачном хранилище.
Если мы посмотрим в наш журнал коммитов git, мы увидим, что есть несколько версий набора данных.
$ git log --oneline >> cd66481 (HEAD -> master) Dataset updates >> 904541f Configure remote storage >> 1e580dc Add raw data
Теперь мы собираемся сделать переключение.
Чтобы получить это, мы можем выполнить git checkout предыдущей версии.
$ git checkout HEAD^1 data/data.xml.dvc >> Aggiornato 1 percorso da b46792c
После этого мы можем запустить dvc checkout.
$ dvc checkout
Давай проверим. Мы вернулись к 14М версии!!!
$ ls -lh data/
>> totale 14M
>> -rw-rw-r-- 1 coding coding 14M nov 11 20:04 data.xml
>> -rw-rw-r-- 1 coding coding 80 nov 11 20:03 data.xml.dvc
В этом случае после git commit мы не будем повторно запускать команду dvc add, так как мы уже сохранили эту версию набора данных в dvc.
$ git commit data/data.xml.dvc -m "Revert dataset updates" >> [master 63b1ea1] Revert dataset updates >> 1 file changed, 2 insertions(+), 2 deletions(-)
Мы собираемся создать репозиторий на github, чтобы посмотреть, как он будет выглядеть для этого проекта.
$ git remote add -origin repo_url $ git branch -M master $ git push
Папка данных содержит наш файл .dvc, внутри которого мы находим адрес, указывающий на набор данных, расположенный в облачном хранилище.
Наш конфигурационный файл DVC сообщает нам, где находится наше хранилище, но не содержит самого набора данных.
Заключение
Хотя технически DVC не является системой контроля версий — Git управляет версиями, а DVC расширяет контроль версий Git на файлы, которые хотят оставаться за пределами Git, — она может помочь специалистам по данным решать проблемы, с которыми им приходилось сталкиваться годами!
Это позволяет вам версионировать данные и модели для каждого прогона. Сотрудничайте с членами команды, не беспокоясь о потере данных или нехватке места на диске.
Все это стало возможным благодаря использованию нескольких команд, которые, если вы уже использовали Git, вы уже знаете.