數據版本管理的目的
每個模型的在訓練的時候,所使用的訓練數據/測試數據都有可能是變化的,在進行復現實驗結果的時候,除了使用同樣的代碼,config,使用同樣的數據也是非常重要的。
如下圖,如果要人工記錄數據版本以及模型版本,使之匹配是比較麻煩的,因此,數據版本管理是十分必要的。
一、簡介
DVC 可以輕鬆地將數據存儲在許多存儲系統上,像本地磁盤、SSH 服務器或雲系統(S3、GCP 等)。DVC 管理的數據可以很容易地與其他使用此存儲系統的用戶共享。
The easiest (but not perfect!) analogy to describe it: DVC is Git (or Git-LFS to be precise) & Makefiles made right and tailored specifically for ML and Data Science scenarios.
- DVC和git結合,對數據、模型、代碼進行版本管理。
- 安裝簡單,pip install dvc
- 使用方便,dvc push; dev pull等
- 速度快,在dvc add之後,會生成一個新的文件,如,dvc add data.sql,會生成data.sql.dvc(kb級別),git會上傳data.sql.dvc這個文件,dvc根據。dvc的文件可以pull到對應的文件。如果需要指定版本的data、model、code,只需要git checkout 版本號 ,然後dvc pull就好。
二、Install
- mac、linux、window的安裝方式類似,都可以使用pip/conda 的方式安裝。
- python3.6+
pip install dvc
- Python versions 2.7, 3.6, and 3.7 conda install -c conda-forge dvc
三、Tutorials
主要有這些功能,官網在這裏, 可以在這裏模擬整個流程。
四、dvc 對數據和模型進行版本管理
假設,訓練需要使用的代碼、數據,訓練得到的模型都在 ./test_dvc 的文件夾中,第一版訓練結束之後,上傳代碼、數據、模型。第二版訓練結束之後,又上傳了代碼、數據、模型,git用於push代碼和數據模型對應的.dvc文件,dvc用於push數據和模型:
test.py,爲模型訓練需要使用的代碼
data_v1.txt,爲模型訓練需要使用的第一版數據
model_v1.txt,爲訓練結束之後得到的第一版模型
data_v2.txt,爲模型訓練需要使用的第二版數據
model_v2.txt,爲訓練結束之後得到的第二版模型
需要進行版本管理的時候,和dvc的操作和git類似,主要使用dvc push和dvc pull的功能:
dvc push具體如下:
- cd ./test_dvc
- git init
- dvc init ,會提示初始化完成:
- dvc add data_v1.txt,會生成一個對應的data_v1.txt.dvc文件
- dvc add model_v1.txt,會生成一個對應的model_v1.txt.dvc文件
- 配置dvc的config,對data.txt和model.txt進行share,可以配置share的位置,可以使用s3,ssh.local,http等。
- 以local爲例,dvc remote add -d myremote data_path(相對路徑!!)
- 以s3爲例,dvc remote add myremote s3://bucket/path
- 這時候,使用git提交代碼和dvc自動生成的一些文件,使用dvc push需要管理的文件
- git add 需要提交的文件(注意提交gitignore,這樣纔可以只push .dvc文件,否則原始文件也會push)
- git commit -m “version description”
- git push
- dvc push
version 2 和version1操作步驟一樣
dvc pull具體如下:
假設已經push過version1和version2的data、model。
- git clone之前的代碼
- dvc pull ,便可得到當前版本的data、model
- 如果需要指定版本的代碼和對應的data/model,git checkout 版本號 ,然後dvc pull就好啦
五、各種坑
1、dvc add 的時候,只能add自己的目錄下的自己的文件!!
否則會出現如下問題:
- 假設用a的賬號 dvc add a的目錄,但是a的目錄下還有b的文件,這時候b的文件就會被刪除(且無提示是否刪除!!!)。
- 假設用a的賬號 dvc add b的目錄,b的目錄下有a的文件和b的文件,會add失敗,需要將b的文件刪除,纔可以成功。
2、dvc add 了哪個路徑的文件,dvc pull的時候就會pull到哪個路徑,
如果需要pull到當前路徑,需要在dvc add的時候使用相對路徑,並把需要add的文件放在git 倉庫的位置