Vérifier votre code en local

Effectué

Chaque fois que vous modifiez du code dans votre projet Machine Learning, vous souhaitez vérifier la qualité du code et du modèle.

Pendant l’intégration continue, vous créez et vérifiez les éléments de votre application. En tant que scientifique des données, vous allez probablement vous concentrer sur la création de scripts utilisés pour la préparation des données et l’entraînement de modèle. L’ingénieur Machine Learning utilise les scripts plus loin dans les pipelines pour automatiser ces processus.

Pour vérifier vos scripts, il existe deux tâches courantes :

  • Linting : Vérification des erreurs programmatiques ou stylistiques dans les scripts Python ou R.
  • Test unitaire : Vérification des performances du contenu des scripts.

Diagramme de flux de vérification avec test local et automatisé.

En vérifiant votre code, vous évitez les bogues ou problèmes quand vous déployez le modèle. Vous pouvez vérifier votre code localement en exécutant des linters et des tests unitaires en local dans un IDE comme Visual Studio Code.

Vous pouvez également exécuter des linters et des tests unitaires dans un workflow automatisé avec Azure Pipelines ou GitHub Actions.

Vous allez apprendre à exécuter le linting et les tests unitaires dans Visual Studio Code.

Linter votre code

La qualité de votre code dépend des standards sur lesquels vous et votre équipe êtes tombés d’accord. Pour vous assurer que la qualité convenue est respectée, vous pouvez exécuter des linters qui vérifient si le code est conforme aux standards de l’équipe.

Selon le langage de code que vous utilisez, il existe plusieurs options pour linter votre code. Par exemple, si vous utilisez Python, vous pouvez utiliser Flake8 ou Pylint.

Utiliser Flake8 pour linter votre code

Pour utiliser Flake8 en local avec Visual Studio Code :

  1. Installez Flake8 avec pip install flake8.
  2. Créez un fichier de configuration .flake8 et stockez le fichier dans votre dépôt.
  3. Configurez Visual Studio Code pour utiliser Flake8 comme linter en accédant à vos paramètres (Ctrl+,).
  4. Recherchez flake8.
  5. Activez Python > Linting > Flake8 Enabled.
  6. Définissez le chemin Flake8 dans votre dépôt, là où vous avez stocké votre fichier .flake8.

Capture d’écran de la configuration de Flake8 dans Visual Studio Code.

Pour spécifier les standards de votre équipe en matière de qualité du code, vous pouvez configurer le linter Flake8. Une méthode courante pour définir les standards consiste à créer un fichier .flake8 stocké avec votre code.

Le fichier .flake8 doit commencer par [flake8], suivi de l’une des configurations que vous souhaitez utiliser.

Conseil

Vous trouverez la liste complète des paramètres de configuration possibles dans la documentation de Flake8.

Par exemple, si vous souhaitez spécifier que la longueur maximale d’une ligne ne peut pas dépasser 80 caractères, vous allez ajouter la ligne suivante à votre fichier .flake8 :

[flake8]
max-line-length = 80

Flake8 contient une liste prédéfinie d’erreurs qu’il peut retourner. De plus, vous pouvez utiliser des codes d’erreur basés sur le guide de style PEP 8. Par exemple, vous pouvez inclure des codes d’erreur qui font référence au bon usage de la mise en retrait ou des espaces blancs.

Vous pouvez choisir de sélectionner (select) un ensemble de codes d’erreur qui feront partie du linter ou de sélectionner les codes d’erreur à ignorer (ignore) dans la liste par défaut des options.

Ainsi, votre fichier de configuration.flake8 pourrait ressembler à l’exemple suivant :

[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

Conseil

Pour obtenir une vue d’ensemble des codes d’erreur auxquels vous pouvez vous référer, consultez la liste d’erreurs Flake8

Lorsque vous configurez Visual Studio Code pour linter votre code, vous pouvez ouvrir n’importe quel fichier de code pour consulter les résultats de lint. Tous les avertissements ou erreurs sont soulignés. Vous pouvez sélectionner Afficher le problème pour inspecter le problème et comprendre l’erreur.

Capture d’écran des résultats Flake8 dans Visual Studio Code.

Linter avec Azure Pipelines ou GitHub Actions

Vous pouvez également exécuter le linter automatiquement avec Azure Pipelines ou GitHub Actions. L’agent fourni par l’une ou l’autre plateforme exécute le linter lorsque vous :

  1. Créez un fichier de configuration .flake8 et stockez le fichier dans votre dépôt.
  2. Définissez le pipeline d’intégration continue ou le workflow dans YAML.
  3. En tant que tâche ou étape, installez Flake8 avec python -m pip install flake8.
  4. En tant que tâche ou étape, exécutez la commande flake8 pour linter votre code.

Tests unitaires

Là où le linting vérifie la façon dont vous avez écrit le code, les tests unitaires vérifient la façon dont votre code fonctionne. Les unités font référence au code que vous créez. Les tests unitaires sont donc également appelés tests de code.

En guise de bonne pratique, votre code doit exister principalement hors fonctions. Que vous ayez créé des fonctions pour préparer des données ou entraîner un modèle. Par exemple, vous pouvez appliquer des tests unitaires pour :

  • Vérifier que les noms de colonne sont exacts.
  • Vérifier le niveau de prédiction du modèle sur les nouveaux jeux de données.
  • Vérifier la distribution des niveaux de prédiction.

Lorsque vous travaillez avec Python, vous pouvez utiliser Pytest et Numpy (qui utilise le framework Pytest) pour tester votre code. Pour en savoir plus sur l’utilisation de Pytest, découvrez comment écrire des tests avec Pytest.

Conseil

Consultez une procédure pas à pas plus détaillée des tests Python dans Visual Studio Code.

Imaginez que vous avez créé un script d’entraînement train.py, qui contient la fonction suivante :

# 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

Supposons que vous avez stocké le script d’entraînement dans le répertoire src/model/train.py de votre dépôt. Pour tester la fonction train_model, vous devez l’importer à partir de src.model.train.

Vous créez le fichier test_train.py dans le dossier tests. Une façon de tester le code Python consiste à utiliser numpy. Numpy offre plusieurs fonctions assert pour comparer des tableaux, des chaînes, des objets ou des éléments.

Par exemple, pour tester la fonction train_model, vous pouvez utiliser un petit jeu de données d’entraînement et assert pour vérifier si les prédictions sont presque égales à vos métriques de performances prédéfinies.

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

Pour tester votre code dans Visual Studio Code à l’aide de l’interface utilisateur :

  1. Installez toutes les bibliothèques nécessaires pour exécuter le script d’entraînement.
  2. Vérifiez que pytest est installé et activé dans Visual Studio Code.
  3. Installez l’extension Python pour Visual Studio Code.
  4. Sélectionnez le script train.py que vous souhaitez tester.
  5. Sélectionnez l’onglet Testing dans le menu de gauche.
  6. Configurez les tests Python en sélectionnant pytest et en définissant le répertoire de test sur votre dossier tests/.
  7. Exécutez tous les tests en sélectionnant le bouton de lecture et passez en revue les résultats.

Capture d’écran des résultats de test d’unité réussis dans Visual Studio Code.

Pour exécuter le test dans un pipeline Azure DevOps ou une action GitHub :

  1. Vérifiez que toutes les bibliothèques nécessaires sont installées pour exécuter le script d’entraînement. Dans l’idéal, utilisez une liste requirements.txt de toutes les bibliothèques avec pip install -r requirements.txt
  2. Installer pytest avec pip install pytest
  3. Exécutez les tests avec pytest tests/

Les résultats des tests s’affichent dans la sortie du pipeline ou workflow que vous exécutez.

Notes

Si, au cours du linting ou des tests unitaires, une erreur est retournée, le pipeline CI peut échouer. Il est donc préférable de vérifier votre code localement avant de déclencher le pipeline CI.