Как бороться с управлением версиями больших объемов (двоичных) данных


46

Я аспирант геофизики и работаю с большими объемами графических данных (сотни ГБ, десятки тысяч файлов). Я хорошо знаю svnи gitприхожу оценивать историю проекта в сочетании с возможностью легко работать вместе и иметь защиту от повреждения диска. Я нахожу gitтакже чрезвычайно полезным для создания последовательных резервных копий, но я знаю, что git не может эффективно обрабатывать большие объемы двоичных данных.

Во время обучения в магистратуре я работал над наборами данных одинакового размера (также изображениями), и у меня было много проблем с отслеживанием разных версий на разных серверах / устройствах. Распределение 100 ГБ по сети действительно не весело, и стоило мне много времени и усилий.

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

Я хочу использовать хранилища моего института, поэтому мне нужно что-то, что может использовать «тупой» сервер. Я также хотел бы иметь дополнительную резервную копию на переносном жестком диске, потому что я хотел бы избежать передачи сотен ГБ по сети, где это возможно. Итак, мне нужен инструмент, который может обрабатывать более одного удаленного местоположения.

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

Я оценил множество различных решений, но ни одно из них не отвечает требованиям:

  • SVN несколько неэффективен и нуждается в умном сервере
  • hg bigfile / largefile может использовать только один пульт
  • git bigfile / media также может использовать только один пульт, но также не очень эффективен
  • на чердаке , похоже, нет лога или различий
  • bup выглядит действительно хорошо, но для работы нужен «умный» сервер

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

Как исследователи работают с большими наборами данных, и что используют другие исследовательские группы?

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


1
@scaaahu Я не думаю, что это обязательно программный вопрос; приемлемый ответ может также описать рабочий процесс или комбинацию инструментов и систем. (В любом случае, обсуждение какой-либо темы не должно

2
Просто для защиты от повреждения данных изображениями я периодически запускаю скрипт, который пересчитывает файл контрольной суммы со всеми файлами и их контрольными суммами md5. Файл контрольной суммы затем сохраняется в git. Теперь я могу сразу увидеть с помощью git diff, изменились ли какие-либо контрольные суммы. И я также могу видеть, какие файлы были удалены и добавлены. И если есть, например, какие-либо признаки повреждения данных, то я могу использовать обычные резервные копии для восстановления старых версий. Не идеально, но лучше, чем ничего.

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

1
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он имеет дело с данными / базами данных, а не чем-то конкретным для академических кругов. Вопросы замечательные, и (ИМХО) их следует перенести в DataScience.SE или (возможно) Databases.SE.
Петр Мигдаль

1
@Johann Данные ученый имеют различное происхождение. Мой, например, в квантовой механике. Весь смысл в том, что: 1. StackExchange не одобряет так называемые вопросы с лодки и 2. Лучше получать лучшие практики, а не то, как они решаются людьми, которые должны были решать их, но не знали.
Петр Мигдаль,

Ответы:


12

В конечном итоге я использую гибридное решение:

  • резервное копирование необработанных данных
  • мерзавец рабочего процесса
  • ручные снимки рабочего процесса + обработанные данные, которые актуальны, например:
    • стандартная предварительная обработка
    • действительно много времени
    • для публикации

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


Ну, я использую find . -type f -print0 | xargs -0 md5sum > checksums.md5для вычисления контрольных сумм и md5sum -c checksums.md5контрольных сумм и контрольных сумм контроля версий. Это помогает проверять данные в разных местах / на разных машинах. Кажется, лучшее, что мы можем сделать на данный момент,
Иоганн

Если, изменяя ваши данные, вы всегда меняете имя файла, тогда это может быть хорошим решением. В противном случае я бы настоятельно рекомендовал проверить сами данные, например, с помощью rsync(копии) исходных данных. Еще одна возможность, которая часто встречается в нейробиологии (хотя мне это не очень нравится, потому что иногда она не так хорошо документирована, как следовало бы), заключается в использовании пакета Python nipype, который можно рассматривать как (своего рода) рабочий процесс. менеджер и он автоматически управляет кэшем двоичных данных промежуточных этапов анализа.
norok2

@norok вы описали отличную общую структуру. Я реализовал нечто подобное в инструменте DVC - пожалуйста, посмотрите на мой ответ ниже. Буду признателен за ваш отзыв.
Дмитрий Петров

9

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

Типичный контроль версий, такой как svn и git, не подходит для этого случая, потому что он просто не предназначен для этого типа набора данных. Вместо этого мы перешли на использование решений «облачного хранилища», в частности DropBox и Bittorrent Sync, Преимущество DropBox состоит в том, что он, по крайней мере, выполняет примитивное ведение журнала и контроль версий, а также управляет серверами для вас, но недостатком является то, что это коммерческий сервис, вы должны платить за большое хранилище, и вы помещаете свои неопубликованные данные в коммерческое хранение; вам не нужно много платить, так что это приемлемый вариант. Bittorrent Sync имеет очень похожий интерфейс, но вы запускаете его самостоятельно на своих собственных серверах хранения и не имеете никакого контроля версий. Оба из них ранили мою душу программиста, но они - лучшие решения, которые мои коллеги и я нашли до сих пор.


Существует популярная версия Dropbox с открытым исходным кодом, OwnCloud. Я не пробовал, хотя.

9

Я использовал управление версиями в корзинах Amazon S3 для управления 10-100 ГБ в 10-100 файлах. Передача может быть медленной, поэтому она помогает сжимать и передавать параллельно или просто выполнять вычисления в EC2. Библиотека boto предоставляет приятный интерфейс Python.


8

Попробуйте посмотреть на Git Large File Storage (LFS) . Это новое, но, возможно, стоит обратить на это внимание.

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


6

Мы не контролируем версию реальных файлов данных. Мы бы не хотели, даже если бы мы хранили его как CSV, а не в двоичном виде. Как сказал Риккардо М. , мы не собираемся тратить время на анализ построчных изменений в наборе данных 10M.

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

  • Дата модификации
  • Размер файла
  • Количество строк
  • Имена столбцов

Это дает мне достаточно информации, чтобы знать, изменился ли файл данных, и представление о том, что изменилось (например, добавленные / удаленные строки, новые / переименованные столбцы), не подчеркивая VCS.


5

Это довольно распространенная проблема. У меня была эта боль, когда я занимался исследовательскими проектами для университета, а теперь - проектами в области промышленных данных.

Я создал и недавно выпустил инструмент с открытым исходным кодом для решения этой проблемы - DVC .

Он в основном объединяет ваш код в Git и данные на локальном диске или в облаках (хранилище S3 и GCP). DVC отслеживает зависимость между данными и кодом и строит график зависимости (DAG). Это поможет вам сделать ваш проект воспроизводимым.

Проект DVC может быть легко распространен - ​​синхронизируйте свои данные в облаке (команда dvc sync), предоставьте общий доступ к своему хранилищу Git и предоставьте доступ к своей корзине данных в облаке.

«Обучаем за несколько часов» - это хороший момент. У вас не должно быть проблем с DVC, если вы знакомы с Git. Вам действительно нужно выучить только три команды:

  1. dvc init- нравится git init. Должно быть сделано в существующем Git-хранилище.
  2. dvc import- импортировать ваши файлы данных (источники). Локальный файл или URL.
  3. dvc run- шаги вашего рабочего процесса, как dvc run python mycode.py data/input.jpg data/output.csv. DVC автоматически определяет зависимость между вашими шагами, создает DAG и сохраняет ее в Git.
  4. dvc repro- воспроизведите ваш файл данных. Пример: vi mycode.py- изменить код, а затем dvc repro data/output.csvвоспроизведет файл (и все зависимости.

Вам нужно выучить еще пару команд DVC для обмена данными через облако и базовые навыки S3 или GCP.

Учебник DVC - лучшая отправная точка - «Контроль версий данных: итеративное машинное обучение»


1
Может ли это использоваться только для хранения больших двоичных файлов (в основном, видео). ОД не цель. Цель состоит в том, чтобы иметь репо для хранения больших двоичных файлов. Репо должно иметь кеширование, выборочную проверку / извлечение (например, выполнение) и механизм блокировки файлов / каталогов. Подходит ли для этой цели?
Hemu

1
@ да да. DVC прекрасно работает для сценария с большими файлами данных без функций ML (таких как конвейеры ML и воспроизводимость). Семантика Perforce-Lock не поддерживается из-за семантики Git. Пожалуйста, используйте вместо проверки для каждого файла.
Дмитрий Петров


0

Вы можете взглянуть на мой проект под названием DOT: Менеджер хранилища Distrubuted Object Tracker.
Это очень простая VCS для двоичных файлов для личного использования (без совместной работы).
Он использует SHA1 для проверки контрольных сумм и дедупликации. Полная синхронизация P2P.
Одна уникальная особенность: adhoc одноразовый TCP-сервер для pull / push.
Он также может использовать SSH для транспорта.

Это еще не выпущено, но могло бы быть хорошей отправной точкой.
http://borg.uu3.net/cgit/cgit.cgi/dot/about/


0

Вы можете попробовать использовать ангар . Это относительно новый игрок в мире контроля версий данных, но он делает действительно хорошую работу, выполняя версионирование тензоров, а не версионирование BLOB-объектов. Документация должна быть лучшим местом для начала. Поскольку данные хранятся в виде тензоров, вы должны иметь возможность использовать их непосредственно внутри своего кода ML (плюс в ангаре теперь есть загрузчики данных для PyTorch и Tensorflow). С помощью ангара вы можете получить все преимущества git, такие как разветвление с нулевой стоимостью, слияние, путешествие во времени по истории. Хорошая особенность клонирования в ангаре - это возможность частичного клонирования . Это означает, что если у вас есть 10 ТБ данных на вашем удаленном компьютере и вам нужно только 100 МБ для создания прототипа вашей модели, вы можете получить только 100 МБ с помощью частичного клонирования вместо полного клонирования.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.