Uw code lokaal verifiëren
Wanneer u code in uw machine learning-project wijzigt, wilt u de code en modelkwaliteit controleren.
Tijdens continue integratie maakt en verifieert u assets voor uw toepassing. Als data scientist richt u zich waarschijnlijk op het maken van scripts die worden gebruikt voor gegevensvoorbereiding en modeltraining. De machine learning-engineer gebruikt de scripts verderop in pijplijnen om deze processen te automatiseren.
Er zijn twee veelvoorkomende taken om uw scripts te controleren:
- Linting: Controleer op programmatische of stilistische fouten in Python- of R-scripts.
- Eenheidstests: Controleer de prestaties van de inhoud van de scripts.
Door uw code te verifiëren, voorkomt u fouten of problemen wanneer het model wordt geïmplementeerd. U kunt uw code lokaal verifiëren door linters en eenheidstests lokaal uit te voeren in een IDE zoals Visual Studio Code.
U kunt ook linters en eenheidstests uitvoeren in een geautomatiseerde werkstroom met Azure Pipelines of GitHub Actions.
U leert hoe u linting- en eenheidstests uitvoert in Visual Studio Code.
Lint uw code
De kwaliteit van uw code is afhankelijk van de normen waaraan u en uw team akkoord gaan. Om ervoor te zorgen dat aan de overeengekomen kwaliteit wordt voldaan, kunt u linters uitvoeren die controleren of de code voldoet aan de normen van het team.
Afhankelijk van de codetaal die u gebruikt, zijn er verschillende opties om uw code te linten. Als u bijvoorbeeld met Python werkt, kunt u Flake8 of Pylint gebruiken.
Flake8 gebruiken om uw code te linten
Flake8 lokaal gebruiken met Visual Studio Code:
- Installeer Flake8 met
pip install flake8. - Maak een configuratiebestand
.flake8en sla het bestand op in uw opslagplaats. - Configureer Visual Studio Code om Flake8 als linter te gebruiken door naar uw instellingen (
Ctrl+,) te gaan. - Zoek naar
flake8. - Schakel Python > Linting > Flake8 in.
- Stel het Flake8-pad in op de locatie in uw opslagplaats waar u het
.flake8bestand hebt opgeslagen.
Als u wilt opgeven wat de standaarden van uw team zijn voor codekwaliteit, kunt u de Flake8 linter configureren. Een veelgebruikte methode voor het definiëren van de standaarden is door een .flake8 bestand te maken dat is opgeslagen met uw code.
Het .flake8 bestand moet beginnen met [flake8], gevolgd door een van de configuraties die u wilt gebruiken.
Aanbeveling
Een volledige lijst met mogelijke configuratieparameters vindt u in de Flake8-documentatie.
Als u bijvoorbeeld wilt opgeven dat de maximale lengte van een regel niet langer mag zijn dan 80 tekens, voegt u de volgende regel toe aan het .flake8 bestand:
[flake8]
max-line-length = 80
Flake8 heeft een vooraf gedefinieerde lijst met fouten die kunnen worden geretourneerd. Daarnaast kunt u gebruikmaken van foutcodes die zijn gebaseerd op de PEP 8-stijlgids. U kunt bijvoorbeeld foutcodes opnemen die verwijzen naar het juiste gebruik van inspringing of spaties.
U kunt ervoor kiezen om (select) een set foutcodes te selecteren die deel uitmaken van de linter of te selecteren welke foutcodes moeten worden genegeerd (ignore) in de standaardlijst met opties.
Als gevolg hiervan kan uw .flake8 configuratiebestand er als volgt uitzien:
[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
Aanbeveling
Raadpleeg de lijst met Flake8-fouten voor een overzicht van foutcodes waarnaar u kunt verwijzen
Wanneer u Visual Studio Code hebt geconfigureerd om uw code te linten, kunt u elk codebestand openen om de lintresultaten te bekijken. Eventuele waarschuwingen of fouten worden onderstreept. U kunt Probleem weergeven selecteren om het probleem te inspecteren om de fout te begrijpen.
Lint met Azure Pipelines of GitHub Actions
U kunt de linter ook automatisch uitvoeren met Azure Pipelines of GitHub Actions. De agent die door beide platforms wordt geleverd, voert de linter uit wanneer u:
- Maak een configuratiebestand
.flake8en sla het bestand op in uw opslagplaats. - Definieer de pijplijn of werkstroom voor continue integratie in YAML.
- Als taak of stap installeert u Flake8 met
python -m pip install flake8. - Als taak of stap voert u de
flake8opdracht uit om uw code te linten.
Unittests
Waar linting controleert hoe u de code hebt geschreven, controleren eenheidstests hoe uw code werkt. Eenheden verwijzen naar de code die u maakt. Eenheidstests worden daarom ook wel codetests genoemd.
Als best practice moet uw code voornamelijk uit functies bestaan. Of u nu functies hebt gemaakt om gegevens voor te bereiden of om een model te trainen. U kunt eenheidstests toepassen op bijvoorbeeld:
- Controleer of de kolomnamen juist zijn.
- Controleer het voorspellingsniveau van het model op nieuwe gegevenssets.
- Controleer de verdeling van voorspellingsniveaus.
Wanneer u met Python werkt, kunt u Pytest en Numpy (dat gebruikmaakt van het Pytest-framework) gebruiken om uw code te testen. Meer informatie over het werken met Pytest vindt u in het schrijven van tests met Pytest.
Aanbeveling
Bekijk een gedetailleerder overzicht van Python-tests in Visual Studio Code.
Stel dat u een trainingsscript train.pyhebt gemaakt dat de volgende functie bevat:
# 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
Stel dat u het trainingsscript hebt opgeslagen in de map src/model/train.py in uw opslagplaats. Als u de train_model functie wilt testen, moet u de functie importeren uit src.model.train.
U maakt het test_train.py bestand in de tests map. Een manier om Python-code te testen, is door te gebruiken numpy. Numpy biedt verschillende assert functies om matrices, tekenreeksen, objecten of items te vergelijken.
Aanbeveling
Meer informatie over testrichtlijnen bij het gebruik van Numpy-tests en de ondersteuning van Numpy-tests.
Als u de train_model functie bijvoorbeeld wilt testen, kunt u een kleine trainingsgegevensset gebruiken en gebruiken assert om te controleren of de voorspellingen bijna gelijk zijn aan uw vooraf gedefinieerde prestatiemetrieken.
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])
Uw code testen in Visual Studio Code met behulp van de gebruikersinterface:
- Installeer alle benodigde bibliotheken om het trainingsscript uit te voeren.
- Zorg ervoor dat
pytestdeze is geïnstalleerd en ingeschakeld in Visual Studio Code. - Installeer de Python-extensie voor Visual Studio Code.
- Selecteer het
train.pyscript dat u wilt testen. - Selecteer het tabblad Testen in het linkermenu.
- Configureer Python-tests door pytest te selecteren en de testmap in te stellen op uw
tests/map. - Voer alle tests uit door de afspeelknop te selecteren en de resultaten te bekijken.
De test uitvoeren in een Azure DevOps Pipeline of GitHub Action:
- Zorg ervoor dat alle benodigde bibliotheken zijn geïnstalleerd om het trainingsscript uit te voeren. Gebruik idealiter een
requirements.txtlijst met alle bibliotheken metpip install -r requirements.txt - Installeren
pytestmetpip install pytest - De tests uitvoeren met
pytest tests/
De resultaten van de tests worden weergegeven in de uitvoer van de pijplijn of werkstroom die u uitvoert.
Notitie
Als er tijdens linting of eenheidstests een fout wordt geretourneerd, kan de CI-pijplijn mislukken. Het is daarom beter om uw code eerst lokaal te verifiëren voordat u de CI-pijplijn activeert.