DVC通過生成
.dvc
文件來追蹤數據集,可以把這個.dvc
文件理解成鑰匙
,找到了鑰匙
也就可以打開寶藏(目標數據集)
,而過多的.dvc
文件又容易造成混亂,因此引入git來管理.dvc文件,也就是說git并不是在管理寶藏,而是在管理鑰匙,真正的寶藏
放在了“remote”所指向的位置,也就是我們的“寶藏”倉庫,這個倉庫就是DVC所支持的各種存儲方式,如本地存儲、s3存儲、ssh存儲等。DVC工作邏輯圖上圖:
1. DVC原理
DVC即data version control, 是一種針對人工智能項目(機器學習或者深度學習)的數據版本管理工具。DVC的操作和GIT類似,可以認為為GIT的二次開發封裝。結合GIT,DVC可以有效的管理人工智能項目的整個流程,包括代碼,數據,訓練配置,模型。
GIT和DVC分工如下:
- DVC:負責數據和模型等大文件的存儲、下載等管理,同時生成元數據(.dvc文件)描述這些數據和模型, 并且串聯整個人工智能項目工作流
- git:負責代碼和DVC生成的元數據文件的版本管理
2. DVC操作
實驗環境:Ubuntu 20.04.3 LTS
2.1 DVC安裝
pip install dvc==3.42.0
2.2 數據版本管理
# 到git目錄下
git config --global user.name "xxxx"
git config --global user.email "xxxx@wedo.com"
git clone ssh://git@101.81.238.21/test/test.git
cd test/
# dvc 初始化
dvc init
# 將dvc 初始化的文件提交 git
git commit -m "Initialize DVC"
# 初始化后會在項目目錄下生成.dvc文件夾,存儲dvc相關的信息
.dvc
├── config
├── plots
│ ├── confusion.json
│ ├── default.json
│ ├── scatter.json
│ └── smooth.json
└── tmp
└── index
2.3 添加數據
可以通過dvc add/git add
將數據和模型添加到版本管理中
# 假設數據在arch_train/model_zoo/nsfw_online_err.zip
dvc add arch_train/model_zoo/nsfw_online_err.zip
git add arch_train/model_zoo/.gitignore arch_train/model_zoo/nsfw_online_err.zip.dvc
# .dvc 后綴為數據的元數據文件,默認為存儲路徑為.dvc/cache下
cat arch_train/model_zoo/nsfw_online_err.zip.dvc
outs:
- md5: 26eb560df48bf11ddf303135749b0c60
path: nsfw_online_err.zip
.
├── cache
│ └── 26
│ └── eb560df48bf11ddf303135749b0c60
2.4 版本切換管理
可以配合git的分支管理,來獲取分支下不同的數據和模型
# 切換分支
git checkout 分支名
# dvc通過git中的.dvc 文件,切換這個分支下數據
dvc checkout
2.5 共享代碼 push or pull
當多人開發時,dvc push
會根據config
中的遠程主機配置,將數據push到遠程主機。遠程主機可以是ssh,http還有云盤存儲等
# 建立 遠程服務 ssh或者http
# 這里以本地的其他目錄為例子
mkdir -p /tmp/dvc-storage
dvc remote add -d myremote /tmp/dvc-storage
git commit .dvc/config -m "Configure local remote"
# 新建后 就會在`.dvc/config`存儲遠程主機訪問的方式
vim config
[core]
remote = myremote
['remote "myremote"']
url = /tmp/dvc-storage
# dvc push 上傳數據
dvc push
# 遠程主機中數據是上傳的一個備份
tree /tmp/dvc-storage/
/tmp/dvc-storage/
└── 26
└── eb560df48bf11ddf303135749b0c60
1 directory, 1 file
ls -l /tmp/dvc-storage/26
total 93400
-r--r--r-- 1 root root 95640298 Sep 4 13:44 eb560df48bf11ddf303135749b0c60
ls -lh /tmp/dvc-storage/26
total 92M
-r--r--r-- 1 root root 92M Sep 4 13:44 eb560df48bf11ddf303135749b0c60
如果數據變更,同樣dvc+git
進行版本管理
# 數據變化
dvc add arch_train/model_zoo/nsfw_online_err.zip
git commit arch_train/model_zoo/.gitignore arch_train/model_zoo/nsfw_online_err.zip.dvc -m "Dataset updates"
dvc push
當其他人想使用共享代碼和數據時 git clone
+ dvc pull
# 下載代碼和數據.dvc
git clone ssh://git@101.81.238.21/test/test.git
cd test/
# 根據.dvc和config遠程主機配置,下載對應的數據和模型
dvc pull
2.6 串聯工作流
git的操作基本上吻合的,原理上可以和git對等。可以通過dvc run
來建立訓練和評估過程的依賴關系,即將輸入的數據,預訓練的模型,配置和輸出的模型和訓練腳本關聯起來,可以很方面追溯執行過程, 每次關聯dvc都會生成一個yaml配置來描述這個關聯性。dvc run
的主要參數如下:
-
-n
:操作的名稱 -
-p
:配置,可以是多個,文件或者文件夾 -
-d
:操作依賴的數據,腳本和模型等,可以是多個,文件或者文件夾 -
-o
:操作的輸出,可以是多個,文件或者文件夾 -
command
:執行操作的命令如python -u train.py
# example
dvc run -n prepare \
-p prepare.seed,prepare.split \
-d src/prepare.py -d data/data.xml \
-o data/prepared \
python src/prepare.py data/data.xml
3. 總結
dvc把數據、模型、算法腳本和Metrics當成一次代碼checkout,配合git就可以很方面的管理每一次訓練的所有環節,還可以通過dvc metrics show -T
來比較不同版本的模型性能。更多詳細的dvc功能參見https://dvc.org/doc/start
;歡迎交流討論。總結如下
- dvc add/push/pull 管理數據
- dvc run 管理工作流串聯
- 建議一個模型迭代一個分支,該分支囊括代碼,數據,模型,配置, 模型評估;可以完美迭代模型優化。