<html> <p> » <a href=„https://www.informatik-aktuell.de/betrieb.html“ target=„_self“>Betrieb</a> » <a href=„https://www.informatik-aktuell.de/betrieb/kuenstliche-intelligenz.html“ target=„_self“>Künstliche Intelligenz</a></p>Veit Schiele 11. August 2020<header></header><div class=„ce-textpic ce-left ce-intext“><div class=„ce-gallery ce-row ce-column“ data-ce-columns=„1“ data-ce-images=„1“><figure class=„image“><img class=„image-embed-item“ title=„Mit DVC können Sie sprachunabhängig ML-Pipelines mit den zugehörigen Trainingsdaten, Konfigurationen, Leistungsmetriken usw. definieren. © Adobe: dsdecoret / stock.adobe.com / 211485579“ alt=„Mit DVC können Sie sprachunabhängig ML-Pipelines mit den zugehörigen Trainingsdaten, Konfigurationen, Leistungsmetriken usw. definieren. © Adobe: dsdecoret / stock.adobe.com / 211485579“ src=„https://www.informatik-aktuell.de/fileadmin/_processed_/5/4/csm_720-AdobeStock_211485579_ddd223b4f7.jpg“ width=„350“ height=„196“ referrerpolicy=„no-referrer“ /><figcaption class=„image-caption“>© Adobe: dsdecoret</figcaption></figure></div><div class=„ce-bodytext“><p><strong>In diesem Artikel erfahren Sie, wie die Modellentwicklung für maschinelles Lernen (ML) systematisch organisiert werden kann. So kann die Leistung eines Modells verbessert werden, wenn die Parameter feiner abgestimmt oder wenn mehr Trainingsdaten verfügbar werden. Um die Verbesserung messen zu können, sollte nachverfolgt werden können, welche Daten für das Training in welcher Modelldefinition und -konfiguration (Parameter etc.) verwendet und welche Modellleistungen damit erzielt wurden. Dabei sollten sowohl die Daten wie auch der zugehörige Programmcode in einer Version erfasst werden.</strong></p><p>DVC (<em>Data Version Control</em>) wurde entwickelt, um Sie genau bei dieser Aufgabe zu unterstützen <a href=„https://www.informatik-aktuell.de/betrieb/kuenstliche-intelligenz/versionskontrolle-fuer-machine-learning-projekte.html#c32318“>[1]</a>. Durch die Implementierung einer DVC-Pipeline werden alle Daten geladen, vorverarbeitet, trainiert und die Leistung bewertet, wobei der Vorgang vollständig reproduzierbar und automatisierbar ist. Trainingsdaten, Modellkonfiguration, das Modell und Leistungsmetriken sind so versioniert, dass Sie bequem zu einer bestimmten Version zurückkehren und alle zugehörigen Konfigurationen und Daten überprüfen können. Außerdem bietet DVC einen Überblick über Metriken für alle Versionen Ihrer Pipeline, mit deren Hilfe Sie die beste Version ermitteln können. Zudem können Sie die Trainingsdaten, Modelle, Leistungsmetriken usw. mit anderen teilen und eine effiziente Zusammenarbeit ermöglichen.</p><h2>Warum DVC?</h2><ul><li><strong>Git-annex</strong> speichert wie DVC große Dateien nicht im Git-Repository selbst, sondern in einem lokalen Schlüssel-Wert-Speicher und verwendet Hardlinks oder Symlinks, anstatt Dateien zu duplizieren <a href=„https://www.informatik-aktuell.de/betrieb/kuenstliche-intelligenz/versionskontrolle-fuer-machine-learning-projekte.html#c32318“>[2]</a>.</li><li><strong>Git-LFS</strong> verwendet Reflinks oder Hardlinks, um Kopiervorgänge zu vermeiden und so große Dateien effizienter verarbeiten zu können. DVC ist jedoch kompatibel zu deutlich mehr Remote-Speichern (S3, Google Cloud, Azure, SSH usw.) <a href=„https://www.informatik-aktuell.de/betrieb/kuenstliche-intelligenz/versionskontrolle-fuer-machine-learning-projekte.html#c32318“>[3]</a>.</li><li>Andere Workflow-Management-Systeme wie <strong>MLflow</strong> sind meist sehr allgemein und nicht speziell für die Verwaltung von Daten in ML-Projekten entwickelt worden <a href=„https://www.informatik-aktuell.de/betrieb/kuenstliche-intelligenz/versionskontrolle-fuer-machine-learning-projekte.html#c32318“>[4]</a>.</li><li><p><strong>DAGsHub</strong> ist ein DVC-Äquivalent, jedoch nur für Github <a href=„https://www.informatik-aktuell.de/betrieb/kuenstliche-intelligenz/versionskontrolle-fuer-machine-learning-projekte.html#c32318“>[5]</a>.</p></li></ul><h2>Ein Beispielprojekt</h2><p>Dieser Artikel führt Sie durch ein Beispielprojekt mit folgenden Phasen:</p><ol><li>Repositories erstellen</li><li>Datenpipelines definieren</li><li>Reproduzieren</li><li>Pipeline visualisieren</li><li>Daten teilen</li></ol></div></div><header><h3>1. Repositories erstellen</h3></header><p>1. Zunächst wird ein Repository mit einer Versionsverwaltung Ihrer Wahl vorbereitet. In unserem Beispiel ist dies Git, DVC kann jedoch auch mit jeder anderen Versionsverwaltung zusammenarbeiten.</p><pre>$ git init</pre><p>2. In diesem Repository DVC initiieren:</p><pre>$ dvc initYou can now commit the changes to git….</pre><p>3. Initiales Git-Repository einchecken:</p><pre>$ git status neue Datei: .dvc/.gitignore neue Datei: .dvc/config$ git add .dvc $ git commit -m „Initial repo“</pre><p>4. Daten mit DVC verwalten:</p><pre>$ mkdir data$ dvc get https://github.com/iterative/dataset-registry get-started/data.xml \ -o data/data.xml$ dvc add data/data.xml</pre><p>5. Datenänderungen mit Git synchronisieren:</p><pre>$ git add data/data.xml.dvc data/.gitignore$ git commit -m „Add raw data“</pre><p>6. Entfernten Datenspeicher konfigurieren:</p><p>Sie können DVC-Daten und -Modelle mit <em>dvc push</em> auch außerhalb Ihres lokalen Caches an einem entfernten Ort speichern, damit sie später auch in anderen Umgebungen abgerufen werden können. Üblicherweise sind dies entfernte Cloud-Services (S3, Azure Blob Storage, Google Cloud Storage), aber auch SSH, HDFS, und HTTP sind möglich. Um das Beispiel möglichst einfach nachvollziehbar zu halten, wählen wir hier einen lokalen Speicherort:</p><pre>$ sudo mkdir -p /var/dvc-storage$ dvc remote add -d local /var/dvc-storageSetting 'local' as a default remote.$ git commit .dvc/config -m „Configure local remote“[master efaeb84] Configure local remote 1 file changed, 4 insertions(+)</pre><p>7. Speichern und teilen:</p><p>Mit <em>dvc push</em> kopieren Sie Dateien aus Ihrem lokalen DVC-Cache in den zuvor konfigurierten Remote-Storage.</p><pre>$ dvc push</pre><p>8. Überprüfen:</p><p>Sie können dies überprüfen, z. B. mit:</p><pre>$ ls -R /var/dvc-storagea3 f1/var/dvc-storage/a3:04afb96060aad90176268345e10355/var/dvc-storage/f1:5a7474cd26c014ce0cf7a8a3d50516.dir</pre><p>Beachten Sie, dass beide Versionen der Daten gespeichert sind und übereinstimmen sollten mit <em>dvc/cache</em>.</p><div class=„ce-image ce-left ce-above ce-gallery ce-row ce-column“><figure class=„image“><a href=„https://www.informatik-aktuell.de/fileadmin/templates/wr/pics/Artikel/03_Betrieb/KI/abb1_Versionskontrolle_schiele.png“ class=„jnlightbox“ data-title=„Abb. 1: Repositories erstellen. © Cusy GmbH, 2020“ rel=„lightbox[lb32386]“ data-lightbox=„lightbox-32386“><img class=„image-embed-item“ title=„Abb. 1: Repositories erstellen. © Cusy GmbH, 2020“ alt=„Abb. 1: Repositories erstellen. © Cusy GmbH, 2020“ src=„https://www.informatik-aktuell.de/fileadmin/_processed_/b/3/csm_abb1_Versionskontrolle_schiele_44c482834d.png“ width=„720“ height=„350“ referrerpolicy=„no-referrer“ /></a><figcaption class=„image-caption“>Abb. 1: Repositories erstellen. © Cusy GmbH, 2020</figcaption></figure></div><header><h3>2. Datenpipelines definieren</h3></header><p>Die Versionierung großer Daten für Data Science ist ein Schritt in die richtige Richtung, aber noch nicht ausreichend, wenn Daten gefiltert, transformiert oder zum Trainieren von ML-Modellen verwendet werden sollen. Daher erfasst DVC auch die Abfolge der Prozesse bei der Manipulation der Daten. Damit können die Ergebnisse später genau so reproduziert werden, wie sie entstanden sind. Für unser Beispiel soll die Pipeline aus den folgenden fünf Phasen bestehen:</p><ol><li>Vorbereiten</li><li>Aufteilen von Trainings- und Testdaten</li><li>Merkmalsextraktion</li><li>Trainieren</li><li>Evaluieren</li></ol><p>Das Ergebnis dieser Pipeline sind die Leistungsmetriken des trainierten Modells. Das gesamte Schema sieht so aus:</p><p>Rohdaten → <em>aufteilen</em> → Trainings-/Testdaten → <em>extrahieren</em> → Features → <em>trainieren</em> → Modell → <em>evaluieren</em> → Metriken</p><p><strong>2.1. Vorbereiten:</strong> Als Vorbereitung auf die Datenpipeline unseres Beispiels benötigen wir zunächst eine virtuelle Python-Umgebung:</p><pre>$ python3 -m venv venv$ source venv/bin/activate$ pip install -r requirements.txt</pre><p>In unserem Beispiel enthält die <em>requirements.txt</em>-Datei die vier Python-Pakete <em>pandas, sklearn, scikit-learn</em> und <em>scipy</em>. Beachten Sie jedoch bitte, dass DVC sprachunabhängig und nicht an Python gebunden ist. Niemand kann Sie davon abhalten, die Phasen in Bash, C oder in einer anderen Lieblingssprache oder einem anderen Framework wie Spark, PyTorch usw. zu implementieren.</p><p><strong>2.2. Aufteilen von Trainings- und Testdaten:</strong> Mit <em>dvc run</em> können Sie einzelne Verarbeitungsphasen erstellen, wobei jede Phase durch eine mit Git verwaltete Quellcode-Datei sowie die Abhängigkeiten und Ausgabedaten beschrieben wird. Alle Phasen zusammen bilden dann die DVC-Pipeline. Unsere erste Phase soll die Daten in Trainings- und Testdaten aufteilen:</p><pre>$ dvc run -n split -d src/split.py -d data/data.xml -o data/splitted \python src/split.py data/data.xml</pre><ul><li><em>-n split</em> gibt den Namen mit der Beschreibung der Verarbeitungsphase an.</li><li><em>-d src/split.py</em> und -<em>d data/data.xml</em> geben die Abhängigkeiten (<em>dependencies</em>) an. Wenn sich später eine dieser Daten ändert, erkennt DVC, dass die Ergebnisse neu berechnet werden müssen.</li><li><em>-o data/splitted</em> gibt das Verzeichnis an, in das die Ergebnisse geschrieben werden sollen. In unserem Fall sollte sich der Arbeitsbereich geändert haben in:</li></ul><pre> ├── data │ ├── data.xml │ ├── data.xml.dvc │ └── splitted+│ ├── test.tsv+│ └── train.tsv+│+├── dvc.lock+├── dvc.yaml ├── requirements.txt └── src └── split.py</pre><ul><li><em>python src/split.py data/data.xml</em> ist der Befehl, der in dieser Verarbeitungsphase ausgeführt wird. Die resultierende <em>dvc.yaml</em>-Datei sieht dann so aus:</li></ul><pre> stages: split: cmd: python src/split.py data/data.xml deps: - data/data.xml - src/split.py outs: - data/splitted</pre><p>In <em>dvc.lock</em> werden hingegen die MD5-Hashwerte gespeichert, anhand derer DVC erkennen kann, ob Änderungen an den Dateien vorgenommen wurden:</p><pre> split: cmd: python src/split.py data/data.xml deps: - path: data/data.xml md5: a304afb96060aad90176268345e10355 - path: src/split.py md5: ffa32f4104c363040f27d2bd22db127d outs: - path: data/splitted md5: 1ce9051bf386e57c03fe779d476d93e7.dir</pre><p>Da die Daten im Ausgabeverzeichnis nie mit Git versioniert werden sollten, hat <em>dvc run</em> dies auch bereits in die <em>data/.gitignore</em>-Datei geschrieben:</p><pre> /data.xml+ /splitted</pre><p><strong>2.3. Merkmalsextraktion</strong></p><p>Die nächste Verarbeitungsphase können Sie nun erstellen, indem die Ausgabe der vorhergehenden als Abhängigkeit definiert wird, in unserem Beispiel mit:</p><pre>dvc run -n featurize -d src/featurization.py -d data/splitted \ -o data/features python src/featurization.py data/splitted data/features</pre><p>Sie können diese Verarbeitungsphase jedoch auch parametrisieren. Hierfür erstellen wir in unserem Beispiel die Datei <em>params.yaml</em> mit folgendem Inhalt:</p><pre> max_features: 6000 ngram_range: lo: 1 hi: 2</pre><p>Der Aufruf fügt dann dem obigen Befehl noch <em>-p <filename>:<params_list></em> hinzu:</p><pre>$ 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</pre><p>Die <em>dvc.yaml</em>-Datei wird dann ergänzt um:</p><pre> + 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</pre><p>Schließlich müssen noch <em>dvc.lock</em>, <em>dvc.yaml</em> und <em>data/.gitignore</em> im Git-Repository aktualisiert werden:</p><pre>$ git add dvc.lock dvc.yaml data/.gitignore</pre><p>Mit <em>dvc params</em> erhalten Sie weitere Informationen zu den Parametrisierungsoptionen.</p><p><strong>2.4. Trainieren</strong></p><p>Die Trainingsphase wird erstellt mit:</p><pre>$ dvc run -n train -d src/train.py -d data/features -o model.pkl \ python src/train.py data/features model.pkl</pre><p><strong>2.5. Evaluieren</strong></p><pre>$ 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</pre><p><em>evaluate.py</em> liest Features aus der <em>features/test.pkl</em>-Datei aus und berechnet den AUC-Wert des Modells. Diese Metrik wird dann in die <em>auc.json</em>-Datei geschrieben. Wir verwenden die <em>-M-Option</em>, um die Datei als Metrik in der <em>dvc.yaml</em>-Datei zu markieren:</p><pre> + 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</pre><p>Die Ergebnisse können Sie sich anzeigen lassen mit <em>dvc metrics</em>:</p><pre> $ dvc metrics show auc.json: 0.514172</pre><p>Um nun unsere erste Version der DVC-Pipeline abzuschließen, fügen wir die Dateien und ein Tag dem Git-Repository hinzu:</p><pre> $ 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“</pre><header><h3>3. Reproduzieren</h3></header><p>Wie Sie sehen konnten, macht DVC das Erstellen einer Pipeline sehr einfach. Der wirkliche Vorteil ist jedoch, dass das Reproduzieren der Ergebnisse oder Teilen davon, d. h. das erneute Ausführen von Stufen ggf. mit geänderten Bedingungen, sehr einfach ist. Hierfür steht Ihnen <em>dvc repro</em> zur Verfügung:</p><pre> $ 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</pre><p>Sie können nun z. B. Parameter in der <em>params.yaml</em>-Datei ändern und anschließend die Pipeline erneut durchlaufen:</p><pre>$ dvc reproStage 'data/data.xml.dvc' didn't change, skippingStage 'split' didn't change, skipping Running stage 'featurize' with command: python src/featurization.py data/splitted data/features…Stage 'train' didn't change, skippingStage 'evaluate' didn't change, skippingTo track the changes with git, run: git add dvc.lock</pre><p>In unserem Fall hatte die Änderung der Parameter also keinen Einfluss auf das Ergebnis. Beachten Sie jedoch, dass DVC Änderungen an Abhängigkeiten und Ausgaben über MD5-Hashwerte erkennt, die in der <em>dvc.lock</em>-Datei gespeichert sind.</p><header><h3>4. Pipeline visualisieren</h3></header><p>Damit sich auch für andere schnell die Struktur der Pipeline erschließt, kann diese sehr einfach mit <em>dvc dag</em> visualisiert werden:</p><p><em>$ dvc dag</em>    +———————+    | data/data.xml.dvc |    +———————+                 *           +——-+           |  split   |           +——-+                *        +———–+         | featurize |        +———–+                   +——-+            *| train   |             +——-+            *                  **       +———-+       | evaluate |       +———-+</p><header><h3>5. Daten teilen</h3></header><p>Sie können nun Ihren Code und Ihre Trainingsdaten einfach mit anderen Teammitlgiedern teilen. Sofern die Teammitglieder ebenfalls auf unser lokales DVC-Repository in <em>/var/dvc-storage</em> zugreifen können, können Sie die Ergebnisse unseres Beispiels reproduzieren mit:</p><pre> $ 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</pre><header><h2>Fazit</h2></header><p>Mit DVC können Sie sprachunabhängig reproduzierbare ML-Pipelines definieren und zusammen mit den zugehörigen Trainingsdaten, Konfigurationen, Leistungsmetriken usw. versioniert speichern. Dabei arbeitet DVC mit allen modernen Versionsverwaltungen zusammen und unterstützt viele verschiedene Speicherarten wie S3, Google Cloud, Azure, SSH usw. Damit strukturiert DVC nicht nur die Datenhaltung, sondern durch einzelne, atomare Phasen der DVC-Pipeline bleiben Änderungen in den Daten auch transparent und nachvollziehbar. Insgesamt erleichtert und effektiviert dies die Arbeit an ML-Projekten erheblich.</p><div id=„c32318“ class=„frame quellen frame-type-text frame-layout-0“><header><p>Quellen</p></header><ol><li><a href=„https://dvc.org/“ title=„DVC“ target=„_blank“ rel=„noreferrer“>DVC</a></li><li><a href=„https://git-annex.branchable.com/“ title=„git annex“ target=„_blank“ rel=„noreferrer“>git-annex</a></li><li><a href=„https://git-lfs.github.com/“ title=„LFS“ target=„_blank“ rel=„noreferrer“>Git Large File Storage (LFS)</a> </li><li><a href=„https://mlflow.org/“ title=„MLflow“ target=„_blank“ rel=„noreferrer“>MLflow</a></li><li><a href=„https://dagshub.com/“ title=„DAGsHub“ target=„_blank“ rel=„noreferrer“>DAGsHub</a></li></ol><p>Github: <a href=„https://github.com/iterative/dvc“ title=„DVC“ target=„_blank“ rel=„noreferrer“>DVC</a>Beispielprojekt: Github: <a href=„https://github.com/veit/dvc-example“ title=„dvc-example“ target=„_blank“ rel=„noreferrer“>dvc-example</a></p><p><a href=„https://www.informatik-aktuell.de/betrieb/kuenstliche-intelligenz/versionskontrolle-fuer-machine-learning-projekte.html#top“><img src=„https://www.informatik-aktuell.de/fileadmin/templates/wr/images/LinkToTop.png“ width=„50“ height=„50“ alt=““ referrerpolicy=„no-referrer“ /></a></p></div><header><p>Autor</p></header><div class=„tx-pwteaser-pi1 main odd“><a href=„https://www.informatik-aktuell.de/autoren-cv/veit-schiele.html“><img src=„https://www.informatik-aktuell.de/fileadmin/_processed_/4/0/csm_200-veit-schiele_f5dbffc384.jpg“ width=„150“ height=„150“ alt=„“ referrerpolicy=„no-referrer“ /></a><h3><a href=„https://www.informatik-aktuell.de/autoren-cv/veit-schiele.html“>Veit Schiele</a></h3>Veit Schiele ist erfahrener Trainer für Analysten, Wissenschaftler und Ingenieure bei der Entwicklung von Analyse- und Forschungssoftware sowie Autor des Jupyter-Tutorial und des PyViz-Tutorial.<a href=„https://www.informatik-aktuell.de/autoren-cv/veit-schiele.html“>>> Weiterlesen</a></div><header><p>Das könnte Sie auch interessieren</p></header><p>Kommentare (0)</p> </html>