Weryfikowanie kodu lokalnie

Ukończone

Za każdym razem, gdy zmienisz dowolny kod w projekcie uczenia maszynowego, chcesz zweryfikować kod i jakość modelu.

Podczas ciągłej integracji tworzysz i weryfikujesz zasoby dla aplikacji. Jako analityk danych prawdopodobnie skupisz się na tworzeniu skryptów używanych do przygotowywania danych i trenowania modelu. Inżynier uczenia maszynowego używa skryptów w dalszej części potoków do automatyzacji tych procesów.

Aby zweryfikować skrypty, istnieją dwa typowe zadania:

  • Linting: sprawdź błędy programowe lub stylistyczne w skryptach języka Python lub R.
  • Testowanie jednostkowe: sprawdź wydajność zawartości skryptów.

Diagram of verification flow with local and automated testing.

Weryfikując kod, zapobiegasz usterce lub problemom podczas wdrażania modelu. Kod można zweryfikować lokalnie, uruchamiając narzędzia linters i testy jednostkowe lokalnie w środowisku IDE, na przykład Visual Studio Code.

Można również uruchamiać linters i testy jednostkowe w zautomatyzowanym przepływie pracy za pomocą usługi Azure Pipelines lub GitHub Actions.

Dowiesz się, jak uruchamiać testy lintingu i testów jednostkowych w programie Visual Studio Code.

Lint your code (Lint your code)

Jakość kodu zależy od standardów, na które zgadza się Twój zespół. Aby upewnić się, że uzgodniona jakość jest zgodna, można uruchamiać linters, które będą sprawdzać, czy kod jest zgodny ze standardami zespołu.

W zależności od używanego języka kodu istnieje kilka opcji lint kodu. Jeśli na przykład pracujesz z językiem Python, możesz użyć platformy Flake8 lub Pylint.

Używanie platformy Flake8 do lint kodu

Aby używać platformy Flake8 lokalnie z programem Visual Studio Code:

  1. Zainstaluj platformę Flake8 za pomocą polecenia pip install flake8.
  2. Utwórz plik .flake8 konfiguracji i zapisz plik w repozytorium.
  3. Skonfiguruj program Visual Studio Code, aby używać platformy Flake8 jako narzędzia linter, przechodząc do ustawień (Ctrl+,).
  4. Wyszukaj ciąg flake8.
  5. Włącz platformę Linting > Flake8 języka Python>.
  6. Ustaw ścieżkę Flake8 na lokalizację w repozytorium, w którym został zapisany .flake8 plik.

Screenshot of configuring Flake8 in Visual Studio Code.

Aby określić standardy zespołu dotyczące jakości kodu, można skonfigurować linter Flake8. Typową metodą definiowania standardów jest utworzenie pliku przechowywanego .flake8 przy użyciu kodu.

Plik .flake8 powinien zaczynać się od [flake8], a następnie dowolnego z konfiguracji, których chcesz użyć.

Napiwek

Pełną listę możliwych parametrów konfiguracji można znaleźć w dokumentacji platformy Flake8.

Jeśli na przykład chcesz określić, że maksymalna długość dowolnego wiersza nie może przekraczać 80 znaków, dodaj następujący wiersz do .flake8 pliku:

[flake8]
max-line-length = 80

Platforma Flake8 ma wstępnie zdefiniowaną listę błędów, które może zwrócić. Ponadto można używać kodów błędów opartych na przewodniku stylu PEP 8. Można na przykład uwzględnić kody błędów odwołujące się do odpowiedniego użycia wcięcia lub białych spacji.

Możesz wybrać (select) zestaw kodów błędów, które będą częścią linteru, lub wybrać kody błędów do zignorowania (ignore) z domyślnej listy opcji.

W związku .flake8 z tym plik konfiguracji może wyglądać podobnie do następującego przykładu:

[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

Napiwek

Aby zapoznać się z omówieniem kodów błędów, które można znaleźć, zapoznaj się z listą błędów flake8

Po skonfigurowaniu programu Visual Studio Code pod kątem lint kodu możesz otworzyć dowolny plik kodu, aby przejrzeć wyniki lint. Wszelkie ostrzeżenia lub błędy zostaną podkreślone. Możesz wybrać pozycję Wyświetl problem , aby sprawdzić problem, aby zrozumieć błąd.

Screenshot of Flake 8 results in Visual Studio Code.

Lint with Azure Pipelines or GitHub Actions

Możesz również automatycznie uruchamiać linter za pomocą usługi Azure Pipelines lub GitHub Actions. Agent dostarczony przez jedną platformę uruchomi linter podczas wykonywania następujących czynności:

  1. Utwórz plik .flake8 konfiguracji i zapisz plik w repozytorium.
  2. Zdefiniuj potok ciągłej integracji lub przepływ pracy w języku YAML.
  3. Jako zadanie lub krok zainstaluj platformę Flake8 za pomocą polecenia python -m pip install flake8.
  4. Jako zadanie lub krok uruchom flake8 polecenie , aby utworzyć lint kodu.

Testy jednostkowe

Gdzie linting sprawdza, jak napisał kod, testy jednostkowe sprawdzają, jak działa kod. Jednostki odwołują się do tworzonego kodu. W związku z tym testowanie jednostkowe jest również nazywane testowaniem kodu.

Najlepszym rozwiązaniem jest istnienie kodu głównie poza funkcjami. Niezależnie od tego, czy utworzono funkcje do przygotowywania danych, czy trenowania modelu. Możesz na przykład zastosować testowanie jednostkowe:

  • Sprawdź, czy nazwy kolumn mają rację.
  • Sprawdź poziom przewidywania modelu dla nowych zestawów danych.
  • Sprawdź rozkład poziomów przewidywania.

Podczas pracy z językiem Python możesz przetestować kod przy użyciu narzędzi Pytest i Numpy (które używają struktury Pytest). Aby dowiedzieć się więcej na temat pracy z narzędziem Pytest, dowiedz się, jak pisać testy za pomocą narzędzia Pytest.

Napiwek

Zapoznaj się z bardziej szczegółowym przewodnikiem testowania języka Python w programie Visual Studio Code.

Załóżmy, że utworzono skrypt train.pytrenowania, który zawiera następującą funkcję:

# 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

Załóżmy, że skrypt trenowania został zapisany w katalogu src/model/train.py w repozytorium. Aby przetestować train_model funkcję, należy zaimportować funkcję z src.model.trainpliku .

Plik zostanie test_train.py utworzony w folderze tests . Jednym ze sposobów testowania kodu w języku Python jest użycie polecenia numpy. Narzędzie Numpy oferuje kilka assert funkcji do porównywania tablic, ciągów, obiektów lub elementów.

Napiwek

Dowiedz się więcej na temat wytycznych dotyczących testowania podczas korzystania z testowania Numpy i obsługi testów numpy.

Na przykład aby przetestować train_model funkcję, możesz użyć małego zestawu danych trenowania i użyć assert go do sprawdzenia, czy przewidywania są prawie równe wstępnie zdefiniowanym metryce wydajności.

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])

Aby przetestować kod w programie Visual Studio Code przy użyciu interfejsu użytkownika:

  1. Zainstaluj wszystkie niezbędne biblioteki, aby uruchomić skrypt szkoleniowy.
  2. Upewnij się, że pytest jest zainstalowana i włączona w programie Visual Studio Code.
  3. Zainstaluj rozszerzenie języka Python dla programu Visual Studio Code.
  4. train.py Wybierz skrypt, który chcesz przetestować.
  5. Wybierz kartę Testowanie z menu po lewej stronie.
  6. Skonfiguruj testowanie języka Python, wybierając pozycję pytest i ustawiając katalog testowy na foldertests/.
  7. Uruchom wszystkie testy, wybierając przycisk odtwarzania i przeglądając wyniki.

Screenshot of successful unit test results in Visual Studio Code.

Aby uruchomić test w potoku usługi Azure DevOps lub akcji usługi GitHub:

  1. Upewnij się, że wszystkie niezbędne biblioteki są zainstalowane w celu uruchomienia skryptu szkoleniowego. Najlepiej używać requirements.txt listy wszystkich bibliotek z pip install -r requirements.txt
  2. Instalowanie pytest za pomocą polecenia pip install pytest
  3. Uruchamianie testów za pomocą polecenia pytest tests/

Wyniki testów zostaną wyświetlone w danych wyjściowych uruchomionego potoku lub przepływu pracy.

Uwaga

Jeśli podczas lintingu lub testowania jednostkowego zostanie zwrócony błąd, potok ciągłej integracji może zakończyć się niepowodzeniem. Dlatego lepiej jest najpierw zweryfikować kod lokalnie przed wyzwoleniem potoku ciągłej integracji.