快速入門DVC(三):資料與模型版本管理

語言: CN / TW / HK

這是我參與2022首次更文挑戰的第8天,活動詳情檢視:2022首次更文挑戰

資料和模型版本控制是 DVC 的基礎層用於管理大型檔案、資料集和機器學習模型。使用常規的 Git 工作流程,但不要在 Git 庫中儲存大檔案。 大資料檔案單獨儲存,來實現高效共享。想象一下,讓 Git 以與處理小程式碼檔案相同的效能來處理任意大的檔案和目錄,該有多酷?例如,使用git clone並在工作區檢視資料檔案和機器學習模型。或者使用 git checkout 在不到一秒的時間內切換到 100Gb 檔案的不同版本。

DVC 的基礎由一些命令組成,通過與 Git 一起執行以跟蹤大檔案、目錄或 ML 模型檔案。 簡而言之,DVC 就是“用於管理資料的Git”。

在我的上一篇文章快速入門DVC(二):安裝及初始化中建立了一個Git專案,並進行了初始化。現在,我們使用dvc add來跟蹤檔案或目錄。

下載檔案(dvc get

跟蹤檔案之前,我們使用dvc get預先下載資料檔案。

```bash

進入到之前初始化好的專案目錄下

$ cd example-get-started

$ dvc get http://github.com/iterative/dataset-registry \ get-started/data.xml -o data/data.xml

```

跟蹤檔案(dvc add

接下來,跟蹤檔案。

dvc add data/data.xml

通過以上命令,DVC 將關於新增的檔案(或目錄)的資訊儲存在名為 data/data.xml.dvc 的特殊 .dvc 檔案中(這是一個人類可讀格式的小文字檔案)。這個元資料檔案是原始資料檔案的佔位符,這樣就可以像使用 Git 的原始碼一樣輕鬆地進行版本控制。同時,原始資料檔案會被放在 .gitignore檔案中。

``` $ cat data/.gitignore

/data.xml ```

將元資料檔案新增到Git中進行跟蹤。 $ git add data/data.xml.dvc data/.gitignore $ git commit -m "Add raw data"

dvc add 會將資料移動到專案的快取中,並將其連結回工作區。

```bash $ tree .dvc/cache

../.dvc/cache └── a3 └── 04afb96060aad90176268345e10355 ```

我們剛剛新增的data.xml檔案的hash值(a304afb...)決定了上面的快取路徑。

如果你檢查 data/data.xml.dvc,你也會在這裡發現它: ``` $ cat data/data.xml.dvc

outs: - md5: a304afb96060aad90176268345e10355 path: data.xml
```

儲存資料檔案到遠端儲存庫(dvc push

您可以使用 dvc push 上傳 DVC 跟蹤的資料或模型檔案,以便安全地遠端儲存它們。 這也意味著後面您可以使用 dvc pull 在其他環境中恢復它們。

image.png

首先,我們需要設定一個遠端儲存庫的地址,DVC 支援許多遠端儲存型別,包括 Amazon S3SSHGoogle DriveAzure Blob StorageHDFS,從上圖我們也可以看到,程式碼與模型和資料檔案是分開儲存的。

```bash

配置遠端Git倉庫

$ git remote add origin http://gitee.com/xxxx/dvc-samples.git

配置遠端資料儲存庫(注:簡單起見,這裡我用的是本地的其他資料夾作為遠端儲存庫,不推薦)

$ mkdir -p /home/lgd/dvc/local_remote_data_register $ dvc remote add -d local_remote /home/lgd/dvc/local_remote_data_register

檢視配置

$ cat .dvc/config

[core] remote = local_remote ['remote "local_remote"'] url = /home/lgd/dvc/local_remote_data_register

新增dvc配置檔案到本地Git倉庫

$ git add .dvc/config $ git commit -m "Configure local remote storage"

或者使用以下命令代替上面兩條命令

git commit .dvc/config -m "Configure local remote"

```

DVC 遠端可讓您將 DVC 跟蹤的資料副本儲存在本地快取之外(通常是雲端儲存服務)。

注意: 我這裡Demo使用的是“本地遠端”,雖然“本地遠端”看起來似乎自相矛盾,但其實並非必須如此。 “本地”指的是檔案位置為本地檔案系統中的另一個資料夾。 “遠端”就是我們所說的 DVC 專案的遠端儲存。 它本質上是一個本地資料備份。

然後,我們使用dvc push 將本地快取的資料複製到我們之前設定的遠端儲存中。

bash $ dvc push

您可以使用以下命令檢查資料是否已儲存在 DVC 遠端儲存庫中:

```bash $ ls -R /home/lgd/dvc/local_remote_data_register

/home/lgd/dvc/local_remote_data_register/: a3

/home/lgd/dvc/local_remote_data_register/a3: 04afb96060aad90176268345e10355 ```

通常,我們也需要 git commitgit push 對應的 .dvc 檔案,將.dvc元資料檔案提交本地倉庫並推送到Git遠端倉庫,示例如下:

bash $ git push origin main

下載與恢復資料(dvc pull

將 DVC 跟蹤的資料和模型檔案儲存在遠端倉庫之後,我們可以在需要時使用 dvc pull 將其下載到該專案的其他副本中。 通常,我們在 git clonegit pull 之後執行它。

在其他環境下載專案的資料,示例如下:

```bash $ git clone http://gitee.com/xxxx/dvc-samples.git

$ cd dvc-samples

$ git pull origin main

$ dvc pull ```

在本專案中恢復資料,示例如下: ```bash $ cd example-get-started

假設我們刪除了本地快取的資料

$ rm -rf .dvc/cache $ rm -f data/data.xml

恢復資料

$ dvc pull origin main ```

修改資料檔案

當您對檔案或資料夾進行更改時,再次執行 dvc add 以跟蹤最新版本。

```bash

通過將資料集加倍來模擬修改資料

$ cp data/data.xml /tmp/data.xml $ cat /tmp/data.xml >> data/data.xm

跟蹤最新版本

dvc add data/data.xml `` 通常情況下,我們還需要執行git commitdvc push` 來儲存更改。

bash $ git commit data/data.xml.dvc -m "Dataset updates" $ dvc push

在版本之間進行切換(dvc checkout

通常的工作流程是先使用git checkout(切換分支或切換.dvc檔案版本),然後執行dvc checkout以同步資料。

```bash

首先,獲取資料集的先前一個版本,讓我們回到資料的原始版本

$ git checkout HEAD~1

同步資料

$ dvc checkout ```

之後,讓我們提交.dvc檔案到本地Git倉庫(這次不需要做 dvc push,因為這個原始版本的資料集已經儲存在本地快取和遠端儲存庫了)。

```bash $ git commit data/data.xml.dvc -m "Revert dataset updates"

$ git push origin main ```

總結

其實,從技術上來講,DVC 甚至不是版本控制系統! .dvc 元資料檔案內容定義了資料檔案的版本,本質上是通過 Git 來提供版本控制。 DVC 反過來建立這些 .dvc 檔案,然後更新它們,並有效地同步工作空間中 DVC 跟蹤的資料以匹配它們。