$ pipenv install dvc[ssh]
[ssh][s3][gs][azure][oss][all]$ mkdir -p dvc-example/data
$ cd dvc-example
$ git init
$ dvc init
$ git add .dvc
$ git commit -m "Initialise DVC"
dvc init.dvc/ mit config, .gitignore und cache-Verzeichnis.git commit.dvc/config und .dvc/.gitignore unter Git-Versionskontrolle.Bevor DVC verwendet wird, sollte noch ein entfernter Speicherplatz (remote storage) eingerichtet werden, z.B. ein NFS-Mount.
$ sudo mkdir -p /var/dvc-storage
$ dvc remote add -d local /var/dvc-storage
Setting 'local' as a default remote.
$ git commit .dvc/config -m "Configure local remote"
[master efaeb84] Configure local remote
1 file changed, 4 insertions(+)
-d, --defaultlocal/var/dvc-storageDaneben werden noch weitere Protokolle unterstützt, die dem Pfad vorangestellt werden, u.a. ssh:, hdfs:, https:.
So kann beispielsweise einfach ein weterer entfernter Datenspeicher hinzugefügt werden mit:
$ dvc remote add webserver https://dvc.cusy.io/myproject
Die zugehörige Konfigurationsdatei .dvc/config sieht dann so aus:
['remote "local"']
url = /var/dvc-storage
[core]
remote = local
['remote "webserver"']
url = https://dvc.cusy.io/myproject
$ dvc get https://github.com/iterative/dataset-registry get-started/data.xml \
-o data/data.xml
$ dvc add data/data.xml
data/data.xml in data/.gitignore hinzudata/data.xml.dvc geschrieben.Weitere Informationen zum Dateiformat der *.dvc-Datei erhaltet ihr unter DVC-File Format.
In Git werden für die verschiedene Versionen eurer Projektdaten verwaltet indem Ihr die CVS-Datei hinzufügt:
$ git add data/.gitignore data/fortune500.csv.dvc
$ git commit -m "Add raw data to project"
Die Daten können vom Arbeitsverzeichnis eures Git-Repository auf den entfernten Speicherplatz kopiert werden mit
$ dvc push
Falls ihr aktuellere Daten abrufen wollt, könnt ihr dies mit
$ dvc pull
dvc import¶Beispiel
$ dvc import https://github.com/iterative/dataset-registry get-started/data.xml
Importing 'get-started/data.xml (https://github.com/iterative/dataset-registry)' -> 'data.xml'
.gitignore-Datei hinzudata.xml.dvcdvc update¶Beispiel
$ dvc update data.xml.dvc
Stage 'data.xml.dvc' didn't change.
Saving information to 'data.xml.dvc'.
dvc run erstellt Verarbeitungsstufen.
Jede Stufe ist gekennzeichnet durch
Alle Stufen zusammen bilden die DVC-Pipeline.
$ dvc run -n split -d src/split.py -d data/data.xml -o data/splitted \
python src/split.py data/data.xml
-n-ddvc repo aufgerufen wird, überprüft DVC diese Abhängigkeiten und entscheidet, ob diese auf dem aktuellen Stand sond oder erneut ausgeführt werden müssen um aktuellere Ergebnisse zu erhalten.
-oDer Arbeitsbereich hat sich nun geändert in:
.
├── data
│ ├── data.xml
│ ├── data.xml.dvc
+ │ └── splitted
+ │ ├── test.tsv
+ │ └── train.tsv
+ ├── dvc.lock
+ ├── dvc.yaml
├── requirements.txt
└── src
└── split.py
Die generierte dvc.yaml-Datei sieht dann folgendermaßen aus:
stages:
split:
cmd: pipenv run python src/split.py data/data.xml
deps:
- data/data.xml
- src/split.py
outs:
- data/splitted
Da die Daten im Ausgabeverzeichnis nie mit Git versioniert werden sollten, hat dvc run bereits die data/.gitignore-Datei geschrieben:
/data.xml
+ /splitted
Anschließend müssen die geänderten Daten nur noch in Git bzw. DVC übernommen werden:
$ git add data/.gitignore dvc.yaml
$ git commit -m "Create split stage"
$ dvc push
Werden nun mehrere Phasen mit dvc run erstellt, wobei die Ausgabe eines Kommandos als Abhängigkeit eines anderen angegeben wird, entsteht eine DVC Pipeline.
params.yaml mit folgendem Inhalt:
max_features: 6000
ngram_range:
lo: 1
hi: 2
dvc run mit -p <filename>:<params_list> liest die Parameter, in unserem Beispiel:
$ dvc run -n featurize -d src/featurization.py -d data/splitted \
-p params.yaml:max_features,ngram_range.lo,ngram_range.hi -o data/features \
python src/featurization.py data/splitted data/features
Dies ergänzt die dvc.yaml-Datei um den featurize-Abschnitt:
featurize:
cmd: python src/featurization.py data/splitted data/features
deps:
- data/splitted
- src/featurization.py
params:
- max_features
- ngram_range.lo
- ngram_range.hi
outs:
- data/features
Damit diese Phase wiederholt werden kann, werden die MD5-Hashwerte und Parameterwerte in der dvc.lock-Datei gespeichert:
featurize:
cmd: python src/featurization.py data/splitted data/features
deps:
- path: data/splitted
md5: 1ce9051bf386e57c03fe779d476d93e7.dir
- path: src/featurization.py
md5: a56570e715e39134adb4fdc779296373
params:
params.yaml:
max_features: 1000
ngram_range.hi: 2
ngram_range.lo: 1
Schließlich müssen noch die folgenden Dateien im Git-Repository aktualisiert werden:
dvc.lockdvc.yamldata/.gitignore$ git add dvc.lock dvc.yaml data/.gitignore
dvc-example/src/evaluate.py berechnet den Wert für die Fläche unter der Kurve (engl.: AUC (Area Under the Curve).
Dabei verwendet es den Testdatensatz, ließt die Features aus features/test.pkl und erstellt die Metrikdatei auc.metric.
auc.metric kann DVC als Metrik mit der -M-Option von dvc run kenntlich gemacht werden:
$ dvc run -n evaluate -d src/evaluate.py -d model.pkl -d data/features \
-M auc.json python src/evaluate.py model.pkl data/features auc.json
Dies erweitert die /dvc.yaml-Datei um den evaluate-Abschnitt:
evaluate:
cmd: python src/evaluate.py model.pkl data/features auc.json
deps:
- data/features
- model.pkl
- src/evaluate.py
metrics:
- auc.json:
cache: false
Mit dvc metrics show lassen sich Experimente über verschiedene Branches und Tags hinweg vergleichen:
$ dvc metrics show
auc.json: 0.514172
Die DVC-Pipeline kann nun zusammen mit einem Tag dem Git-Repository hinzugefügt werden:
$ git add dvc.yaml dvc.lock auc.json
$ git commit -m 'Add stage ‹evaluate›'
$ git tag -a 0.1.0 -m "Initial pipeline version 0.1.0"
$ dvc dag
+-------------------+
| data/data.xml.dvc |
+-------------------+
*
*
*
+-------+
| split |
+-------+
*
*
*
+-----------+
| featurize |
+-----------+
** **
** *
* **
+-------+ *
| train | **
+-------+ *
** **
** **
* *
+----------+
| evaluate |
+----------+
data/data.xml.dvc
prepare.dvc
featurize.dvc
train.dvc
evaluate.dvc
dvc dag --dot generiert eine Graphviz-.dot-Datei, die dann z.B. als SVG-Datei gerendert werden kann:
$ git clone https://github.com/veit/dvc-example.git
$ cd dvc-example
$ dvc pull -TR
A data/data.xml
1 file added
$ ls data/
data.xml data.xml.dvc
$ dvc repro
Verifying data sources in stage: 'data/data.xml.dvc'
Stage 'split' didn't change, skipping
Stage 'featurize' didn't change, skipping
Stage 'train' didn't change, skipping
Stage 'evaluate' didn't change, skipping
Die Parameter in der params.yaml-Datei können geändert und anschließend die Pipeline erneut durchlaufen werden:
$ dvc repro
Stage 'data/data.xml.dvc' didn't change, skipping
Stage 'split' didn't change, skipping
Running stage 'featurize' with command:
python src/featurization.py data/splitted data/features
…
Stage 'train' didn't change, skipping
Stage 'evaluate' didn't change, skipping
To track the changes with git, run:
git add dvc.lock
Die Änderung der Parameter hatte keinen Einfluss auf das Ergebnis.
DVC erkennt Änderungen an Abhängigkeiten und Ausgaben über die md5-Hashwerte, die in der dvc.lock-Datei gespeichert sind.