Bekræft din kode lokalt

Fuldført

Når du ændrer kode i dit machine learning-projekt, skal du bekræfte koden og modelkvaliteten.

Under løbende integration opretter og bekræfter du aktiver for dit program. Som dataforsker vil du sandsynligvis fokusere på at oprette scripts, der bruges til dataforberedelse og modeltræning. Maskinlæringsteknikeren bruger scripts senere i pipelines til at automatisere disse processer.

Der er to almindelige opgaver for at bekræfte dine scripts:

  • Linting: Kontrollér, om der er programmatiske eller stilistiske fejl i Python- eller R-scripts.
  • Enhedstest: Kontrollér ydeevnen af scriptets indhold.

Diagram over kontrolflow med lokal og automatiseret test.

Når du bekræfter din kode, kan du forhindre fejl eller problemer, når modellen udrulles. Du kan bekræfte din kode lokalt ved at køre linters og enhedstest lokalt i en IDE, f.eks. Visual Studio Code.

Du kan også køre linters- og enhedstest i en automatiseret arbejdsproces med Azure Pipelines eller GitHub-handlinger.

Du får mere at vide om, hvordan du kører linting- og enhedstest i Visual Studio Code.

Lint din kode

Kvaliteten af din kode afhænger af de standarder, du og dit team er enige om. For at sikre, at den aftalte kvalitet er opfyldt, kan du køre linters, der kontrollerer, om koden er i overensstemmelse med teamets standarder.

Afhængigt af det kodesprog, du bruger, er der flere muligheder for at linte din kode. Hvis du f.eks. arbejder med Python, kan du bruge enten Flake8- eller Pylint-.

Brug Flake8 til at linte din kode

Sådan bruger du Flake8 lokalt med Visual Studio Code:

  1. Installér Flake8 med pip install flake8.
  2. Opret en konfigurationsfil .flake8, og gem filen i lageret.
  3. Konfigurer Visual Studio Code til at bruge Flake8 som linter ved at gå til dine indstillinger (Ctrl+,).
  4. Søg efter flake8.
  5. Aktivér Python > Linting > Flake8 aktiveret.
  6. Angiv Flake8-stien til den placering i lageret, hvor du har gemt din .flake8-fil.

Skærmbillede af konfiguration af Flake8 i Visual Studio Code.

Hvis du vil angive, hvad dit teams standarder er for kodekvalitet, kan du konfigurere Flake8 linter. En almindelig metode til at definere standarderne er ved at oprette en .flake8 fil, der er gemt sammen med din kode.

Den .flake8 fil skal starte med [flake8]efterfulgt af en af de konfigurationer, du vil bruge.

Drikkepenge

Du kan finde en komplet liste over mulige konfigurationsparametre i dokumentationen til Flake8.

Hvis du f.eks. vil angive, at den maksimale længde på en linje ikke må være mere end 80 tegn, skal du føje følgende linje til din .flake8 fil:

[flake8]
max-line-length = 80

Flake8 har en foruddefineret liste over fejl, der kan returneres. Derudover kan du bruge fejlkoder, der er baseret på PEP 8-typografivejledningen. Du kan f.eks. inkludere fejlkoder, der refererer til korrekt brug af indrykning eller blanktegn.

Du kan vælge enten at vælge (select) et sæt fejlkoder, der skal være en del af linteren, eller vælge, hvilke fejlkoder der skal ignoreres (ignore) på standardlisten over indstillinger.

Derfor kan din .flake8 konfigurationsfil se ud som i følgende eksempel:

[flake8]
ignore = 
    W504,
    C901,
    E41
max-line-length = 79
exclude = 
    .git,
    .cache,
per-file-ignores =
    code/__init__.py:D104
max-complexity = 10
import-order-style = pep8

Drikkepenge

Hvis du vil have en oversigt over fejlkoder, du kan se, skal du gennemse Flake8-fejllisten

Når du har konfigureret Visual Studio Code til at lint din kode, kan du åbne en hvilken som helst kodefil for at gennemse lintresultaterne. Eventuelle advarsler eller fejl understreges. Du kan vælge Vis problem for at undersøge problemet for at forstå fejlen.

Skærmbillede af Flake 8 resulterer i Visual Studio Code.

Lint med Azure Pipelines eller GitHub-handlinger

Du kan også køre linter automatisk med Azure Pipelines eller GitHub Actions. Den agent, der leveres af en af platformene, kører linteren, når du:

  1. Opret en konfigurationsfil .flake8, og gem filen i lageret.
  2. Definer den kontinuerlige integrationspipeline eller arbejdsproces i YAML.
  3. Som en opgave eller et trin skal du installere Flake8 med python -m pip install flake8.
  4. Kør kommandoen flake8 som en opgave eller et trin for at linte koden.

Enhedstest

Hvor linting kontrollerer, hvordan du skrev koden, kontrollerer enhedstests, hvordan din kode fungerer. Enheder henviser til den kode, du opretter. Enhedstest kaldes derfor også kodetest.

Som bedste praksis bør din kode hovedsageligt være uden for funktioner. Uanset om du har oprettet funktioner til at forberede data eller til at oplære en model. Du kan anvende enhedstest på f.eks.:

  • Kontrollér, at kolonnenavnene har ret.
  • Kontrollér forudsigelsesniveauet for modellen for nye datasæt.
  • Kontrollér fordelingen af forudsigelsesniveauer.

Når du arbejder med Python, kan du bruge Pytest- og Numpy- (som bruger Pytest framework) til at teste din kode. Hvis du vil vide mere om at arbejde med Pytest, få mere at vide om, hvordan du skriver test med Pytest.

Drikkepenge

Gennemse en mere detaljeret gennemgang af Python-test i Visual Studio Code.

Forestil dig, at du har oprettet et træningsscript train.py, som indeholder følgende funktion:

# Train the model, return the model
def train_model(data, ridge_args):
    reg_model = Ridge(**ridge_args)
    reg_model.fit(data["train"]["X"], data["train"]["y"])
    return reg_model

Antag, at du har gemt træningsscriptet i mappen src/model/train.py i dit lager. Hvis du vil teste funktionen train_model, skal du importere funktionen fra src.model.train.

Du opretter den test_train.py fil i mappen tests. En måde at teste Python-kode på er ved at bruge numpy. Numpy tilbyder flere assert funktioner til sammenligning af matrixer, strenge, objekter eller elementer.

Hvis du f.eks. vil teste funktionen train_model, kan du bruge et lille oplæringsdatasæt og bruge assert til at kontrollere, om forudsigelserne næsten svarer til dine foruddefinerede målepunkter for ydeevnen.

import numpy as np
from src.model.train import train_model

def test_train_model():
    X_train = np.array([1, 2, 3, 4, 5, 6]).reshape(-1, 1)
    y_train = np.array([10, 9, 8, 8, 6, 5])
    data = {"train": {"X": X_train, "y": y_train}}

    reg_model = train_model(data, {"alpha": 1.2})

    preds = reg_model.predict([[1], [2]])
    np.testing.assert_almost_equal(preds, [9.93939393939394, 9.03030303030303])

Sådan tester du din kode i Visual Studio Code ved hjælp af brugergrænsefladen:

  1. Installér alle nødvendige biblioteker for at køre træningsscriptet.
  2. Sørg for, at pytest er installeret og aktiveret i Visual Studio Code.
  3. Installér udvidelsen Python til Visual Studio Code.
  4. Vælg det train.py script, du vil teste.
  5. Vælg fanen Test i menuen til venstre.
  6. Konfigurer Python-test ved at vælge pytest- og angive testmappen til din tests/ mappe.
  7. Kør alle test ved at vælge afspilningsknappen, og gennemse resultaterne.

Skærmbillede af vellykkede enhedstestresultater i Visual Studio Code.

Sådan kører du testen i en Azure DevOps Pipeline eller GitHub-handling:

  1. Sørg for, at alle nødvendige biblioteker er installeret for at køre træningsscriptet. Ideelt set skal du bruge en requirements.txt med en liste over alle biblioteker med pip install -r requirements.txt
  2. Installér pytest med pip install pytest
  3. Kør testene med pytest tests/

Resultaterne af testene vises i outputtet fra den pipeline eller arbejdsproces, du kører.

Seddel

Hvis der enten under linting eller enhedstest returneres en fejl, kan CI-pipelinen mislykkes. Det er derfor bedre at bekræfte din kode lokalt først, før ci-pipelinen udløses.