Code organiseren en refactoren

Introductie tot dataversiebeheer met DVC

Ravi Bhadauria

Machine Learning Engineer

Prototyping vs. productierijpe code

  • Prototyping maakt snelle iteratie mogelijk
  • Maar is niet geschikt voor productie
    • Niet getest en foutgevoelig
    • Niet modulair, met veel herhaling
    • Waarschijnlijk niet reproduceerbaar
Introductie tot dataversiebeheer met DVC

Eigenschappen van goede productierijpe code

  • Reproduceerbaar: zelfde output in andere omgevingen en later

  • Modulair: losse, onafhankelijke, testbare modules

  • Consistent: één bron voor alle parameters

    • Een configuratie-/parameterbestand

Een schematisch diagram met drie eigenschappen van productierijpe code

Introductie tot dataversiebeheer met DVC

Configuratiebestanden en YAML

  • Bestanden moeten een ondersteund formaat hebben

    • YAML, JSON, TOML, Python
    • Standaard is params.yaml
  • We werken met YAML

    • YAML Ain't Markup Language
    • Standaardformaat om data tussen talen/apps uit te wisselen
    • Simpel en leesbaar
    • Geldige extensies: .yaml of .yml
1 https://dvc.org/doc/command-reference/params#description
Introductie tot dataversiebeheer met DVC

YAML-syntaxis

  • Parameters als dictionaries

    • Keys en values gescheiden door :
  • Comments beginnen met #

  • Datatypes:

    • Integer, floats, strings
  • Datastructuren:

    • Arrays
    • Geneste dictionaries
  • Inspringing is belangrijk

# Key-value pairs
a: 1
b: 1.2
c: "String value"
# Arrays
a: [1, 2.2, 3, 4.8]
b:
  - 5
  - "String value"
# Nested dictionaries
a:
  b: "Some value"
  c: "Some other value"
Introductie tot dataversiebeheer met DVC

Voorbeeldconfiguratiebestand

# Parameters voor datapreprocessing
preprocess:
  ...
  target_column: RainTomorrow
  categorical_features:
    - Location
    - WindGustDir
    - ...

# Parameters voor modeltraining/-evaluatie train_and_evaluate: rfc_params: n_estimators: 2 ...
Introductie tot dataversiebeheer met DVC

Voorbeeld van een modulaire functie

# In model.py
def evaluate_model(model, X_test, y_test):
    """Evaluate a model on a test set and return metrics."""
    y_pred = model.predict(X_test)
    precision = precision_score(y_test, y_pred)
    ...
    return { "accuracy": accuracy, "precision": precision,
        "recall": recall, "f1_score": f1 }
# In entrypoint-code (train_and_evaluate.py)
from model import evaluate_model
metrics = evaluate_model(model, X_test, y_test)
Introductie tot dataversiebeheer met DVC

Voorbeeldproject: codelay-out

Afbeelding van de codelay-out in een Machine Learning-repository

Introductie tot dataversiebeheer met DVC

Laten we oefenen!

Introductie tot dataversiebeheer met DVC

Preparing Video For Download...