SlideShare ist ein Scribd-Unternehmen logo
1 von 67
Downloaden Sie, um offline zu lesen
Versionskontrolle in ML-Projekten
FrankHofmann
CusyGmbH,Berlin
enterPy,6.Mai2021
de.slideshare.net/cusyio/dvcenterpy
Installation
$ pipenv install dvc[ssh]
Installation
$ pipenv install dvc[ssh]
Extras
[ssh]
[s3]
[gs]
[azure]
[oss]
[all]
Projekt erstellen
$ mkdir -p dvc-example/data
$ cd dvc-example
$ git init
$ dvc init
$ git add .dvc
$ git commit -m "Initialise DVC"
dvc init
erstellteinVerzeichnis .dvc/ mit config , .gitignore und cache -Verzeichnis.
git commit
stellt .dvc/config und .dvc/.gitignore unterGit-Versionskontrolle.
DVC konfigurieren
BevorDVCverwendetwird,solltenocheinentfernterSpeicherplatz(remotestorage)
eingerichtetwerden,z.B.einNFS-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, --default
StandardwertfürdenentferntenSpeicherplatz
local
NamedesentferntenSpeicherplatz
/var/dvc-storage
URLdesentferntenSpeicherplatzes
DanebenwerdennochweitereProtokolleunterstützt,diedemPfadvorangestelltwerden,u.a.
ssh: , hdfs: , https: .
SokannbeispielsweiseeinfacheinwetererentfernterDatenspeicherhinzugefügtwerdenmit:
$ dvc remote add webserver https://dvc.cusy.io/myproject
DiezugehörigeKonfigurationsdatei .dvc/config siehtdannsoaus:
['remote "local"']
url = /var/dvc-storage
[core]
remote = local
['remote "webserver"']
url = https://dvc.cusy.io/myproject
Daten hinzufügen
$ dvc get https://github.com/iterative/dataset-registry
get-started/data.xml 
-o data/data.xml
$ dvc add data/data.xml
.DiesfügtdieDatei data/data.xml in data/.gitignore hinzu
.DieMeta-Angabenwerdenin data/data.xml.dvc geschrieben.
WeitereInformationenzumDateiformatder *.dvc -Dateierhaltetihrunter .
DVC-FileFormat
InGitwerdenfürdieverschiedeneVersioneneurerProjektdatenverwaltetindemIhrdieCVS-
Dateihinzufügt:
$ git add data/.gitignore data/fortune500.csv.dvc
$ git commit -m "Add raw data to project"
Daten speichern und abrufen
DieDatenkönnenvomArbeitsverzeichniseuresGit-Repositoryaufdenentfernten
Speicherplatzkopiertwerdenmit
$ dvc push
FallsihraktuellereDatenabrufenwollt,könntihrdiesmit
$ dvc pull
Importieren und Aktualisieren
dvc import
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'
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'
.DieslädtdieDateiausder indasaktuelleArbeitsverzeichnis
.fügtsieder .gitignore -Dateihinzu
.erstelltdieDatei data.xml.dvc
dataset-registry
dvc update
dvc update
Beispiel
$ dvc update data.xml.dvc
Stage 'data.xml.dvc' didn't change.
Saving information to 'data.xml.dvc'.
Big Picture
Big Picture
Big Picture
Big Picture
Big Picture
Big Picture
Pipelines
dvc run erstelltVerarbeitungsstufen.
JedeStufeistgekennzeichnetdurch
eine,mitGitverwaltete,Quellcode-Datei
weitereAbhängigkeiten
Ausgabedaten
AlleStufenzusammenbildendieDVC-Pipeline.
Beispiel
github.com/cusyio/dvc-example
1. Phase: Aufteilen in Trainings- und Testdaten
dvc-example/src/split.py
dvc-example/src/split.py
$ dvc run -n split -d src/split.py -d data/data.xml -o
data/splitted 
python src/split.py data/data.xml
dvc-example/src/split.py
$ dvc run -n split -d src/split.py -d data/data.xml -o
data/splitted 
python src/split.py data/data.xml
-n
gibtdenNamenderVerarbeitungsstufean.
dvc-example/src/split.py
$ dvc run -n split -d src/split.py -d data/data.xml -o
data/splitted 
python src/split.py data/data.xml
-n
gibtdenNamenderVerarbeitungsstufean.
-d
gibtAbhängigkeiten(dependencies)fürdasreproduzierbareKommandoan.
WennzumReproduzierenderErgebnissebeimnächstenMal dvc repo aufgerufen
wird,überprüftDVCdieseAbhängigkeitenundentscheidet,obdieseaufdemaktuellen
StandsondodererneutausgeführtwerdenmüssenumaktuellereErgebnissezu
erhalten.
dvc-example/src/split.py
$ dvc run -n split -d src/split.py -d data/data.xml -o
data/splitted 
python src/split.py data/data.xml
-n
gibtdenNamenderVerarbeitungsstufean.
-d
gibtAbhängigkeiten(dependencies)fürdasreproduzierbareKommandoan.
WennzumReproduzierenderErgebnissebeimnächstenMal dvc repo aufgerufen
wird,überprüftDVCdieseAbhängigkeitenundentscheidet,obdieseaufdemaktuellen
StandsondodererneutausgeführtwerdenmüssenumaktuellereErgebnissezu
erhalten.
-o
gibtdieAusgabedateioderdasAusgabeverzeichnisan.
DerArbeitsbereichhatsichnungeändertin:
.
├── data
│ ├── data.xml
│ ├── data.xml.dvc
+ │ └── splitted
+ │ ├── test.tsv
+ │ └── train.tsv
+ ├── dvc.lock
+ ├── dvc.yaml
├── requirements.txt
└── src
└── split.py
Diegenerierte dvc.yaml -Dateisiehtdannfolgendermaßenaus:
stages:
split:
cmd: pipenv run python src/split.py data/data.xml
deps:
- data/data.xml
- src/split.py
outs:
- data/splitted
DadieDatenimAusgabeverzeichnisniemitGitversioniertwerdensollten,hat dvc run
bereitsdie data/.gitignore -Dateigeschrieben:
/data.xml
+ /splitted
AnschließendmüssendiegeändertenDatennurnochinGitbzw.DVCübernommenwerden:
$ git add data/.gitignore dvc.yaml
$ git commit -m "Create split stage"
$ dvc push
WerdennunmehrerePhasenmit dvc run erstellt,wobeidieAusgabeeinesKommandosals
Abhängigkeiteinesanderenangegebenwird,entstehteineDVCPipeline.
2. Phase: Parametrisierung
params.yaml mitfolgendemInhalt:
max_features: 6000
ngram_range:
lo: 1
hi: 2
dvc run mit -p <filename>:<params_list> liestdieParameter,inunseremBeispiel:
$ 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
Diesergänztdie dvc.yaml -Dateiumden 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
DamitdiesePhasewiederholtwerdenkann,werdendieMD5-HashwerteundParameterwerte
inder dvc.lock -Dateigespeichert:
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ßlichmüssennochdiefolgendenDateienimGit-Repositoryaktualisiertwerden:
dvc.lock
dvc.yaml
data/.gitignore
$ git add dvc.lock dvc.yaml data/.gitignore
3. Phase: Evaluation
berechnetdenWertfürdie (engl.:AUC
(AreaUndertheCurve).
dvc-example/src/evaluate.py FlächeunterderKurve
berechnetdenWertfürdie (engl.:AUC
(AreaUndertheCurve).
dvc-example/src/evaluate.py FlächeunterderKurve
DabeiverwendetesdenTestdatensatz,ließtdieFeaturesaus features/test.pkl und
erstelltdieMetrikdatei auc.metric .
berechnetdenWertfürdie (engl.:AUC
(AreaUndertheCurve).
dvc-example/src/evaluate.py FlächeunterderKurve
DabeiverwendetesdenTestdatensatz,ließtdieFeaturesaus features/test.pkl und
erstelltdieMetrikdatei auc.metric .
auc.metric kannDVCalsMetrikmitder -M -Optionvon dvc run kenntlichgemacht
werden:
berechnetdenWertfürdie (engl.:AUC
(AreaUndertheCurve).
dvc-example/src/evaluate.py FlächeunterderKurve
DabeiverwendetesdenTestdatensatz,ließtdieFeaturesaus features/test.pkl und
erstelltdieMetrikdatei auc.metric .
auc.metric kannDVCalsMetrikmitder -M -Optionvon dvc run kenntlichgemacht
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
Dieserweitertdie /dvc.yaml -Dateiumden 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
Versuchsmetriken
Mit dvc metrics show lassensichExperimenteüberverschiedeneBranchesundTags
hinwegvergleichen:
Versuchsmetriken
Mit dvc metrics show lassensichExperimenteüberverschiedeneBranchesundTags
hinwegvergleichen:
$ dvc metrics show
auc.json: 0.514172
DieDVC-PipelinekannnunzusammenmiteinemTagdemGit-Repositoryhinzugefü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"
Pipelines anzeigen
$ 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 generierteine -.dot -Datei,diedannz.B.alsSVG-Datei
gerendertwerdenkann:
data/data.xml.dvc
split
featurize
train
evaluate
Graphviz
Ergebnisse reproduzieren
1. Code und Daten wiederherstellen
1. Code und Daten wiederherstellen
$ 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
2. Ergebnisse reproduzieren
2. Ergebnisse reproduzieren
$ 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
3. Parametrisieren
3. Parametrisieren
DieParameterinder params.yaml -DateikönnengeändertundanschließenddiePipeline
erneutdurchlaufenwerden:
$ 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ÄnderungderParameterhattekeinenEinflussaufdasErgebnis.
DVCerkenntÄnderungenanAbhängigkeitenundAusgabenüberdiemd5-Hashwerte,diein
der dvc.lock -Dateigespeichertsind.
Zum Weiterlesen
DVCimJupyter-Tutorial
Documentation
params
GitRepository

Weitere ähnliche Inhalte

Was ist angesagt?

Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenOPITZ CONSULTING Deutschland
 
Hendrik Jungnitsch: Software verpacken mit Docker
Hendrik Jungnitsch: Software verpacken mit DockerHendrik Jungnitsch: Software verpacken mit Docker
Hendrik Jungnitsch: Software verpacken mit Dockergedoplan
 
Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen B1 Systems GmbH
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Joachim Baumann
 

Was ist angesagt? (6)

Testing tools
Testing toolsTesting tools
Testing tools
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
 
Hendrik Jungnitsch: Software verpacken mit Docker
Hendrik Jungnitsch: Software verpacken mit DockerHendrik Jungnitsch: Software verpacken mit Docker
Hendrik Jungnitsch: Software verpacken mit Docker
 
Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)
 
systemd & Docker
systemd & Dockersystemd & Docker
systemd & Docker
 

Ähnlich wie Versionskontrolle in Machine-Learning-Projekten

DDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungDDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungFrank Schmittlein
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Von Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenVon Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenQAware GmbH
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsTorsten Kleiber
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsJosef Adersberger
 
IPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedIPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedRalf Eggert
 
Ist Gradle auch für die APEX-Projekte?
Ist Gradle auch für die APEX-Projekte?Ist Gradle auch für die APEX-Projekte?
Ist Gradle auch für die APEX-Projekte?MT AG
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit RustJens Siebert
 
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.Torsten Kleiber
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Ralf Sigmund
 
JAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & JavascriptJAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & Javascriptdzuvic
 
Slides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfSlides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfAlexanderStz1
 
Django & Buildout
Django & BuildoutDjango & Buildout
Django & Buildoutzerok
 
WP-CLI - Das Kommandozeilen Interface für Wordpress
WP-CLI - Das Kommandozeilen Interface für WordpressWP-CLI - Das Kommandozeilen Interface für Wordpress
WP-CLI - Das Kommandozeilen Interface für Wordpressfrankstaude
 
Einfacher bauen
Einfacher bauenEinfacher bauen
Einfacher bauenjohofer
 
Deployment pipeline mit maven, chef und jenkins
Deployment pipeline mit maven, chef und jenkinsDeployment pipeline mit maven, chef und jenkins
Deployment pipeline mit maven, chef und jenkinsBild GmbH & Co. KG
 

Ähnlich wie Versionskontrolle in Machine-Learning-Projekten (20)

DDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale EntwicklungsumgebungDDEV - Eine lokale Entwicklungsumgebung
DDEV - Eine lokale Entwicklungsumgebung
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Von Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenVon Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 Minuten
 
Automatisierung mit grunt
Automatisierung mit gruntAutomatisierung mit grunt
Automatisierung mit grunt
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and Operations
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
IPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedIPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 Reloaded
 
Node.js
Node.jsNode.js
Node.js
 
yeoman
yeoman yeoman
yeoman
 
Ist Gradle auch für die APEX-Projekte?
Ist Gradle auch für die APEX-Projekte?Ist Gradle auch für die APEX-Projekte?
Ist Gradle auch für die APEX-Projekte?
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
 
JAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & JavascriptJAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & Javascript
 
Slides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfSlides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdf
 
Django & Buildout
Django & BuildoutDjango & Buildout
Django & Buildout
 
WP-CLI - Das Kommandozeilen Interface für Wordpress
WP-CLI - Das Kommandozeilen Interface für WordpressWP-CLI - Das Kommandozeilen Interface für Wordpress
WP-CLI - Das Kommandozeilen Interface für Wordpress
 
Einfacher bauen
Einfacher bauenEinfacher bauen
Einfacher bauen
 
Deployment pipeline mit maven, chef und jenkins
Deployment pipeline mit maven, chef und jenkinsDeployment pipeline mit maven, chef und jenkins
Deployment pipeline mit maven, chef und jenkins
 

Mehr von cusy GmbH

Warum gRPC? – und wie in Python implementieren?
Warum gRPC? – und wie in Python implementieren?Warum gRPC? – und wie in Python implementieren?
Warum gRPC? – und wie in Python implementieren?cusy GmbH
 
Python-Bibliotheken zur Datenvisualisierung
Python-Bibliotheken zur DatenvisualisierungPython-Bibliotheken zur Datenvisualisierung
Python-Bibliotheken zur Datenvisualisierungcusy GmbH
 
Continuous Everything
Continuous EverythingContinuous Everything
Continuous Everythingcusy GmbH
 
Opensource Search Engines
Opensource Search EnginesOpensource Search Engines
Opensource Search Enginescusy GmbH
 
Cusy GSA-Alternativen
Cusy GSA-AlternativenCusy GSA-Alternativen
Cusy GSA-Alternativencusy GmbH
 
Sicherheitsrichtlinien für Linux-Workstations
Sicherheitsrichtlinien für Linux-WorkstationsSicherheitsrichtlinien für Linux-Workstations
Sicherheitsrichtlinien für Linux-Workstationscusy GmbH
 
Quo vadis-devops-nuernberg
Quo vadis-devops-nuernbergQuo vadis-devops-nuernberg
Quo vadis-devops-nuernbergcusy GmbH
 
Quo vadis DevOps
Quo vadis DevOpsQuo vadis DevOps
Quo vadis DevOpscusy GmbH
 
Devops ohne root
Devops ohne rootDevops ohne root
Devops ohne rootcusy GmbH
 
Cusy Developer-Baukasten
Cusy Developer-BaukastenCusy Developer-Baukasten
Cusy Developer-Baukastencusy GmbH
 

Mehr von cusy GmbH (11)

Warum gRPC? – und wie in Python implementieren?
Warum gRPC? – und wie in Python implementieren?Warum gRPC? – und wie in Python implementieren?
Warum gRPC? – und wie in Python implementieren?
 
About cusy
About cusyAbout cusy
About cusy
 
Python-Bibliotheken zur Datenvisualisierung
Python-Bibliotheken zur DatenvisualisierungPython-Bibliotheken zur Datenvisualisierung
Python-Bibliotheken zur Datenvisualisierung
 
Continuous Everything
Continuous EverythingContinuous Everything
Continuous Everything
 
Opensource Search Engines
Opensource Search EnginesOpensource Search Engines
Opensource Search Engines
 
Cusy GSA-Alternativen
Cusy GSA-AlternativenCusy GSA-Alternativen
Cusy GSA-Alternativen
 
Sicherheitsrichtlinien für Linux-Workstations
Sicherheitsrichtlinien für Linux-WorkstationsSicherheitsrichtlinien für Linux-Workstations
Sicherheitsrichtlinien für Linux-Workstations
 
Quo vadis-devops-nuernberg
Quo vadis-devops-nuernbergQuo vadis-devops-nuernberg
Quo vadis-devops-nuernberg
 
Quo vadis DevOps
Quo vadis DevOpsQuo vadis DevOps
Quo vadis DevOps
 
Devops ohne root
Devops ohne rootDevops ohne root
Devops ohne root
 
Cusy Developer-Baukasten
Cusy Developer-BaukastenCusy Developer-Baukasten
Cusy Developer-Baukasten
 

Versionskontrolle in Machine-Learning-Projekten