Версионирование данных (DVC)
| Инструмент | DVC (Data Version Control) |
|---|---|
| Разработчик | Iterative.ai (с 2024 — lakeFS) |
| Первый выпуск | 2017 |
| Язык | Python |
| Лицензия | Apache 2.0 |
| Хранилища | S3, GCS, Azure, SSH, HDFS, локальный диск |
| Файлы | *.dvc, dvc.yaml, dvc.lock, .dvc/config |
| Альтернативы | Git LFS, lakeFS, Delta Lake, Hugging Face Datasets |
Версионирование данных — практика хранения истории изменений датасетов и моделей так же, как Git хранит историю кода. Оно позволяет ответить на вопросы «на каких данных обучена эта модель?», «что изменилось в выборке между версиями?» и «как воспроизвести результат полугодовой давности?». Самый известный инструмент — DVC (Data Version Control): он работает поверх Git, но большие файлы кладёт во внешнее хранилище, оставляя в репозитории только маленькие файлы-указатели с хешами.
Зачем
Git плохо подходит для гигабайтных файлов: каждая версия навсегда остаётся в истории, клонирование становится медленным, а хостинги ограничивают размер репозитория. При этом результат машинного обучения определяется тройкой код + данные + параметры, и без версии данных эксперимент невоспроизводим. Версионирование данных — одна из базовых практик MLOps.
Как работает DVC
Команда dvc add вычисляет хеш файла или каталога, перемещает содержимое в локальный кэш (.dvc/cache) и создаёт текстовый файл-указатель:[1]
# data/train.csv.dvc
outs:
- md5: 3863d0e317dee0a55c4e59d2ec0eef33
size: 145276800
path: train.csv
Указатель коммитится в Git, а сам файл добавляется в .gitignore. Команда dvc push отправляет данные в удалённое хранилище (remote) — S3, Google Cloud Storage, Azure, сервер по SSH или сетевой диск.[3] На другой машине git clone и dvc pull восстанавливают ровно те данные, что соответствуют коммиту.
pip install "dvc[s3]"
dvc init
dvc remote add -d storage s3://ml-data/project
dvc add data/train.csv
git add data/train.csv.dvc data/.gitignore
git commit -m "train: выгрузка за октябрь"
dvc push
# вернуться к данным прошлой версии
git checkout v1.0 -- data/train.csv.dvc
dvc checkout
Так как хранилище адресуется по хешам, одинаковые файлы не дублируются, а переключение версий сводится к замене ссылок в рабочем каталоге.
Конвейеры
DVC умеет описывать этапы обработки и обучения в dvc.yaml — с зависимостями, параметрами и результатами:[2]
stages:
prepare:
cmd: python src/prepare.py
deps: [src/prepare.py, data/raw]
outs: [data/prepared]
train:
cmd: python src/train.py
deps: [src/train.py, data/prepared]
params: [train.lr, train.epochs]
outs: [models/model.pkl]
metrics: [metrics.json]
dvc repro перезапускает только те этапы, у которых изменились входы, — как make, но с учётом хешей данных. Файл dvc.lock фиксирует хеши всех входов и выходов, поэтому коммит в Git полностью описывает, как получена модель.
Эксперименты
dvc exp run -S train.lr=0.01 запускает эксперимент с изменёнными параметрами, не создавая коммитов; dvc exp show выводит таблицу экспериментов с параметрами и метриками, а лучший можно превратить в ветку.[4] Для визуального сравнения есть расширение для VS Code. Многие команды совмещают DVC (данные и конвейер) с MLflow (трекинг метрик и реестр моделей).
Альтернативы
| Инструмент | Подход | Когда подходит |
|---|---|---|
| Git LFS | большие файлы на сервере LFS, указатели в Git | бинарники и модели среднего размера; нет конвейеров[5] |
| lakeFS | Git-подобные ветки и коммиты над объектным хранилищем | озёра данных на терабайты, много пользователей[6] |
| Delta Lake, Apache Iceberg | версии таблиц, time travel | табличные данные в Spark и хранилищах |
| Hugging Face Datasets / Hub | репозитории датасетов с версиями | открытые датасеты и модели (см. Hugging Face) |
| Снимки в хранилище | версионирование бакета S3, даты в путях | простые случаи |
DVC хорош для проектов, где данные — файлы (выгрузки, изображения, аудио) размером до сотен гигабайт и где важна связь данных с коммитом кода. Для таблиц в корпоративном хранилище естественнее time travel самих таблиц.
Практика
- Храните в DVC сырые выгрузки и итоговые обучающие наборы; промежуточные результаты конвейера восстановятся через
dvc repro. - Указывайте версию данных в метаданных модели (хеш из
dvc.lock), чтобы связать модель в продакшене с выборкой. - В CI/CD используйте
dvc pullс ограниченными правами только на чтение. - Персональные и чувствительные данные в удалённом хранилище должны подчиняться тем же правилам доступа и удаления, что и исходные системы.