Что касается контроля версий
, Git является распространенным инструментом для управления версиями кода. Он помогает разработчикам легко поддерживать историю кода.
Однако для проектов машинного обучения этого недостаточно. Управление воспроизводимыми экспериментами — важнейший вопрос для специалистов по изучению данных, включающий код, гиперпараметры и данные.
Код и гиперпараметры легко поддерживать с помощью Git. Но контроль версий данных затруднен из-за ограничений на размер файлов в популярных системах контроля версий: О больших файлах на GitHub.
DVC — один из популярных инструментов с открытым исходным кодом для решения проблемы версионирования данных. С помощью DVC мы храним все версии данных в определенном удаленном месте, а Git фиксирует хэш-значение этих данных.
Пример
Установите DVC
Рекомендуется устанавливать DVC с помощью системных пакетов, например, apt и brew. Это обеспечивает функцию автозавершения, которая минимизирует ошибки при вводе.
Установите DVC на Debian/Ubuntu:
sudo wget https://dvc.org/deb/dvc.list -O /etc/apt/sources.list.d/dvc.list
wget -qO - https://dvc.org/deb/iterative.asc | gpg --dearmor > packages.iterative.gpg
sudo install -o root -g root -m 644 packages.iterative.gpg /etc/apt/trusted.gpg.d/
rm -f packages.iterative.gpg
sudo apt-get update
sudo apt-get install dvc
Установите DVC на MacOS:
brew install dvc
Верификация.
$ dvc version
DVC version: 2.11.0 (brew)
---------------------------------
Platform: Python 3.10.5 on macOS-12.4-arm64-arm-64bit
Supports:
azure (adlfs = 2022.4.0, knack = 0.9.0, azure-identity = 1.10.0),
gdrive (pydrive2 = 1.10.1),
gs (gcsfs = 2022.5.0),
webhdfs (fsspec = 2022.5.0),
http (aiohttp = 3.8.1, aiohttp-retry = 2.4.6),
https (aiohttp = 3.8.1, aiohttp-retry = 2.4.6),
s3 (s3fs = 2022.5.0, boto3 = 1.21.21),
ssh (sshfs = 2022.6.0),
oss (ossfs = 2021.8.0),
webdav (webdav4 = 0.9.7),
webdavs (webdav4 = 0.9.7)
Более подробное руководство по установке см. на сайте https://dvc.org/doc/install.
Инициализация пустого Git-репозитория
mkdir dvc-demo && cd dvc-demo
git init
Инициализация DVC в Git-репо
dvc init
$ git status
...
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .dvc/.gitignore
new file: .dvc/config
new file: .dvcignore
git commit -m 'feat: init dvc'
Генерировать данные
Создайте каталог data
, данные будут помещены в этот каталог.
mkdir data
Создать файл изображения со случайными числами.
dd if=/dev/random of=data/data.img bs=1 count=0 seek=1024000
dvc add data/data.img
В каталоге данных появились два новых файла.
$ ls -a data/
. .. data.img data.img.dvc .gitignore
data/data.img.dvc: Файл, заканчивающийся .dvc
, описывает метаданные данных.
$ cat data/data.img.dvc
outs:
- md5: 80ec129d645c70cf0de45b1a5a682235
size: 1024000
path: data.img
data/.gitignore: Git не будет отслеживать изменения data.img
; вместо этого он будет отслеживать изменения data.img.dvc
.
$ cat data/.gitignore
/data.img
Затем зафиксируйте изменения с помощью Git.
Зафиксировать метаданные данных
git add data/
$ git commit -m 'feat: add data/data.img'
[main badc237] feat: add data metadata
2 files changed, 5 insertions(+)
create mode 100644 data/.gitignore
create mode 100644 data/data.img.dvc
Передача данных в удаленное хранилище
Настройте место удаленного хранения данных.
mkdir /tmp/dvc-remote/
$ dvc remote add --default myremote /tmp/dvc-remote/
Setting 'myremote' as a default remote.
git add .dvc/config
git commit -m "feat: update dvc remote"
Переместите данные в удаленное хранилище.
$ dvc push
1 file pushed
Какова структура удаленного хранилища
$ tree /tmp/dvc-remote/
/tmp/dvc-remote/
└── 80
└── ec129d645c70cf0de45b1a5a682235
1 directory, 1 file
Внести изменения в данные
dd if=/dev/random of=data/data.img bs=1 count=0 seek=1024
Проверьте состояние данных с помощью dvc status
.
$ dvc status
data/data.img.dvc:
changed outs:
modified: data/data.img
dvc add data/data.img
Git управляет изменениями метаданных данных.
$ git diff -- data/data.img.dvc
diff --git a/data/data.img.dvc b/data/data.img.dvc
index e218f0c..556b929 100644
--- a/data/data.img.dvc
+++ b/data/data.img.dvc
@@ -1,4 +1,4 @@
outs:
-- md5: 80ec129d645c70cf0de45b1a5a682235
- size: 1024000
+- md5: 0f343b0931126a20f133d67c2b018a3b
+ size: 1024
path: data.img
git add data/data.img.dvc
git commit -m 'feat: update data/data.img'
Передача новых данных в удаленное хранилище.
dvc push
Снова посмотрите структуру удаленного хранилища.
В нем хранятся все версии данных, что позволяет разработчикам переключаться между версиями.
$ tree /tmp/dvc-remote/
/tmp/dvc-remote/
├── 0f
│ └── 343b0931126a20f133d67c2b018a3b
└── 80
└── ec129d645c70cf0de45b1a5a682235
2 directories, 2 files
Получение данных из удаленного хранилища
git checkout [<branch>]
dvc fetch -aT # download data from remote storage to the cache.
dvc checkout