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 管理工作流串联
- 建议一个模型迭代一个分支,该分支囊括代码,数据,模型,配置, 模型评估;可以完美迭代模型优化。