Dvc
数据版本控制或DVC是数据科学和机器学习项目的开源工具。主要特点:
- 简单的命令行git样经验。不需要安装和维护任何数据库。不依赖于任何专有的在线服务。
- 数据集和机器学习模型的管理和版本控制。数据可以保存在S3,Google Cloud,Azure,Alibaba Cloud,SSH服务器,HDFS或甚至本地HDD RAID中。 3.使项目可重复和可共享;有助于回答有关模型建立的问题。
- 有助于使用Git标签/分支机构和指标跟踪管理实验。
DVC旨在替换电子表格和文档共享工具(例如Excel或Google文档)经常用作知识库库和团队 分类员。DVC还替换ad-hoc脚本,以跟踪,移动和部署不同的型号版本和ad-hoc数据文件后缀和前缀。
一个瞄准机器学习的开源工具,主要用来管理数据、模型以及算法准确度啥的,目前 自己主要用来管理深度学习的数据。
数据目前自己感觉在使用过程中,最大的一个痛点就是无法管理。无论是网上各种的 公开数据集,还是自己的或者别人的数据集,基本都是各种百度网盘、谷歌网盘啥的, 用起来极其的不方便。 而且各种数据的标注文件格式和目录结构也一人一套,用一个大json的、每个图片 单独一个json的、用xml的、用yaml的,就导致数据处理和数据维护的成本太高了。 公开数据集其实还好,我也就用用不会改,这次用完了删了大不了下次再下载,数据处理 和转换脚本大不了这次用完了下次再写一遍也还好。但是自己的数据就根本没法维护, 尤其是那种一个数据集几十个G,我需要改几张图片,或者随时更改,别说团队协作 了,就是自己一个人搞都没法版本维护。
要说版本控制和迭代开发,那git肯定是最好的工具,如果能用git管理我的所有文件 体验就非常舒服了。不过git最大的问题就是存储空间不够,开了会员一个仓库应该也就 2个G,别说放数据啥的,就是放俩训练好的模型也不敢放,而且github这个速度,要是 在部署的时候想要pull一个模型下来怕是要等两天,所以dvc就出现了。
dvc,data version control,顾名思义就是可以对数据进行版本控制。那么他是 怎么控制的呢,其实也是借助了git。比如我有一个特别大的文件a.mp4,这个文件我想 版本控制,但是这个文件我是没法传到github的,那么我就可以写一个a.mp4.txt, 里面写好了我有一个a.mp4文件,这个文件实际存在了我的百度网盘里(或者其他任何地方), 百度网盘的链接是www.xxxx.com/xxx ,然后我把a.mp4给放到.gitignore里,这样 我以后就可以只对这个a.mp4.txt来版本控制了,如果我需要下载这个文件,我只需要 看一下txt文件看一下这个文件究竟在哪然后去对应的位置下载就可以了。dvc就是帮助 我们做上面这些事情,事实上dvc的功能还有很多,不过我目前还没用到,等用到了再学习。
dvc安装¶
直接pip install dvc
就行,但是当前版本(2.7.4)从windows往linux上推有bug,
虽然bugfix已经merge了但是还没release 所以可以
直接从github安装当前master的代码pip install git+https://github.com/iterative/dvc.git
dvc初始化¶
首先,新建一个空文件夹
dvc需要依赖git来进行版本控制,所以在这个文件夹里分别对git和dvc初始化
可以看见,执行了dvc init
之后,dvc创建了以下文件
.dvc # dvc工作空间,类似.git
.gitignore # 对于a.mp4文件,dvc会生成a.mp4.dvc用于管理,然后把a.mp4放到.gitignore里防止这个文件被git追踪
config # dvc配置文件,顾名思义,里面各种配置
.dvcignore # dvc的ignore
# 其他的还没用到,我也不知道是干嘛的
远端配置¶
现在我去github搞个仓库作为这个文件夹的远端仓库,然后把代码推上去
此时,相当于开始使用git来进行版本控制,然后git的代码都放到github上。那么dvc也 需要一个远端,也就是一个真正存放数据的地方。dcv目前支持多种远端配置,阿里OSS、 谷歌云盘、亚马逊啥的,我用的是ssh,也就是通过ssh把数据存在远端的一个机器里。
-d
表示把这个远端作为默认的,默认存在/root/data这个路径下,这个路径下现在是个空文件夹。
现在git和dvc的远端路径就都有了,可以放文件来管理了。
dvc数据版本管理¶
准备一个稍微大一点的文件当作数据
这个时候,这文件实际上是被git管理起来的,这个时候需要使用dvc来把文件给dvc管理
可以看到,dvc生成了一个data.txt.dvc
,同时修改了.gitignore
,看一下data.txt.dvc
就是记录了一下md5、文件大小和文件路径,然后在gitignore里配置让git忽略这个data.txt文件。 然后分别提交git和dvc到远端
分别看一下github和远端的ssh机器
可以看到git实际管理的是.dvc文件,实际的数据文件被dvc管理,保存在远端的ssh机器上。至于 远端机器上的文件,不是原始的图片或者txt之类的,我估计是给保存成二进制的方便控制吧, 我也不太确定。
dvc协作¶
此时,数据和数据的管理文件就都在远端了,可以分享和协作了。现在再新建一个文件夹, 模拟另外一个人来用这些数据。当然另外一个人得有权限,比如用ssh存储的,那就得有密码或者 公钥,用网盘存的,得有密码或者验证码。
然后可以拉数据
比如我要协作,那么流程是一样的,操作数据,dvc管理,dvc push还有git push。
dvc可以直接管理一整个文件夹,比如文件夹交aaa,里面有好多数据,可以直接dvc add aaa
,
dvc会生成一个aaa.dvc
,使用体验和一个文件是一样的,push和pull的时候也是只提交更改的
部分而不是一整个文件夹,试过了。
其他配置¶
ssh保持连接¶
如果使用ssh作为远端的话,长时间传输文件ssh可能会断开,可以通过设置ssh来保持连接
vim /etc/ssh/sshd_config
修改以下配置
ClientAliveInterval 600 # 表示每600秒发送一次请求, 从而保持连接。
ClientAliveCountMax 10 # 表示服务器发出请求后客户端没有响应的次数达到10次,就自动断开连接。
# 则无响应的SSH客户端将在大约600x10=6000秒后断开连接。
然后重启ssh
service ssh restart