Я только что по ошибке удалил файл отслеживания DVC с помощью команды dvc remove training_data.dvc -p
, что привело к полной потере всего моего набора обучающих данных. Я знаю, что в Git мы можем легко восстановить удаленную ветку на основе ее хэша. Кто-нибудь знает, как вернуть все мои потерянные данные в DVC?
Отменить команду dvc remove -p
Ответы (1)
Вы должны быть в безопасности (по крайней мере, данные не пропали), скорее всего. Из dvc remove
документов:
Обратите внимание, что он не удаляет файлы из кэша DVC или удаленного хранилища (см. dvc gc). Однако не забудьте запустить
dvc push
, чтобы сохранить файлы, которые вы действительно хотите использовать или поделиться ими в будущем.
Итак, если вы создали training_data.dvc
как с dvc add
и/или dvc run
и dvc remove -p
ни о чем вас не спрашивали/предупреждали, значит данные кешируются аналогично Git в .dvc/cache
.
Есть способы получить его, но мне нужно знать немного больше деталей - как именно вы добавили свой набор данных? Вы сделали коммит training_data.dvc
или он полностью исчез? Это были единственные данные, которые вы добавили до сих пор? (рад помочь вам в комментариях).
Восстановление каталога
Прежде всего, здесь — это документ, кратко описывающий, как DVC хранит каталоги в кэше.
Что мы можем сделать, так это найти все файлы .dir
в каталоге .dvc/cache
:
find .dvc/cache -type f -name "*.dir"
выводит что-то вроде:
.dvc/cache/20/b786b6e6f80e2b3fcf17827ad18597.dir
.dvc/cache/00/db872eebe1c914dd13617616bb8586.dir
.dvc/cache/2d/1764cb0fc973f68f31f5ff90ee0883.dir
(если локальный кеш потерян и мы восстанавливаем данные из удаленного хранилища, применяется та же логика, команды (например, для поиска файлов на S3 с расширением .dir) выглядят иначе)
Каждый файл .dir
представляет собой JSON с содержимым одной версии каталога (имена файлов, хэши и т. д.). Там есть вся необходимая информация для восстановления. Следующее, что нам нужно сделать, это понять, какой из них нам нужен. Для этого нет единого правила, которое я бы рекомендовал проверить (и выбрать в зависимости от вашего варианта использования):
- Проверьте дату изменения (если вы помните, когда эти данные были добавлены).
- Проверьте содержимое этих файлов — если вы помните конкретное имя файла, которое присутствовало только в том каталоге, который вы ищете, — просто загрузите его.
- Попробуйте восстановить их один за другим и проверьте содержимое каталога.
Хорошо, теперь давайте представим, что мы решили восстановить .dvc/cache/20/b786b6e6f80e2b3fcf17827ad18597.dir
(например, потому что его содержание выглядит так:
[
{"md5": "6f597d341ceb7d8fbbe88859a892ef81", "relpath": "test.tsv"}, {"md5": "32b715ef0d71ff4c9e61f55b09c15e75", "relpath": "train.tsv"}
]
и мы хотим получить каталог с train.tsv
).
Единственное, что нам нужно сделать, это создать файл .dvc
, который ссылается на этот каталог:
outs:
- md5: 20b786b6e6f80e2b3fcf17827ad18597.dir
path: my-directory
(обратите внимание, что путь /20/b786b6e6f80e2b3fcf17827ad18597.dir стал хеш-значением: 20b786b6e6f80e2b3fcf17827ad18597.dir)
И запустите dvc pull
на этом файле.
Это должно быть так.
dvc run
. Я использовал следующий процесс: данные для обучения (вручную с использованием скрипта Python) -> обучение -> dvc add
обучающие данные и модели h5 -> dvc push
в удаленное хранилище. Если что-то изменится в процессе передачи данных (например, уменьшится размер изображений), мне придется повторить эти шаги снова! Я думаю, что это неэффективный подход. Я забыл о dvc commit
!
- person nguyendhn; 18.06.2020
dvc add
), затем dvc push
. После этого я заменяю эту папку другой (совершенно другие подпапки и изображения, но все та же родительская папка и перезапускаю dvc add
). Столкнулся с ошибкой (точно не помню) потом воспользовался dvc remove -p
и подумал что просто удалил файл отслеживания dvc...
- person nguyendhn; 18.06.2020
.dir
, который мне нужен (может быть, я сделал еще одно глупое действие, которое я не могу вспомнить), я воспроизвел сценарий с несколькими примерами, затем применил ваш подход, и это сработало! Я ценю вашу поддержку. :) Я очень рад, если у нас появится другой эффективный способ решить эту проблему в будущем. А пока я продолжу изучать другие функции DVC. ;)
- person nguyendhn; 19.06.2020