Partager via


Réglage des hyperparamètres dans les pipelines

S’APPLIQUE À :Extension Azure CLI v2 (actuelle)Kit de développement logiciel (SDK) Python azure-ai-ml v2 (version actuelle)

Dans cet article, vous allez apprendre à automatiser le réglage des hyperparamètres dans les pipelines Azure Machine Learning à l’aide d’Azure Machine Learning CLI v2 ou du Kit de développement logiciel (SDK) Azure Machine Learning pour Python v2.

Les hyperparamètres sont des paramètres réglables qui vous permettent de contrôler le processus d’entraînement du modèle. L’optimisation des hyperparamètres est le processus de recherche de la configuration des hyperparamètres qui produit les meilleures performances. Azure Machine Learning vous permet d’automatiser le réglage des hyperparamètres et d’exécuter des expérimentations parallèles pour optimiser efficacement les hyperparamètres.

Prérequis

Créer et exécuter un pipeline de réglage des hyperparamètres

Les exemples suivants proviennent de la section Exécuter une tâche de pipeline à l’aide d’une organisation (hyperdrive) du référentiel azureml-examples . Pour plus d’informations sur la création de pipelines avec des composants, consultez Créer et exécuter des pipelines Machine Learning à l’aide de composants avec l’interface CLI Azure Machine Learning.

Créer un composant de commande avec des entrées d’hyperparamètre

Le pipeline Azure Machine Learning doit avoir un composant de commande avec des entrées d’hyperparamètre. Le fichier train.yml suivant à partir des exemples de projets définit un composant trial qui a les entrées d’hyperparamètres c_value, kernel et coef et exécute le code source situé dans le dossier ./train-src.

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command

name: train_model
display_name: train_model
version: 1

inputs: 
  data:
    type: uri_folder
  c_value:
    type: number
    default: 1.0
  kernel:
    type: string
    default: rbf
  degree:
    type: integer
    default: 3
  gamma:
    type: string
    default: scale
  coef0: 
    type: number
    default: 0
  shrinking:
    type: boolean
    default: false
  probability:
    type: boolean
    default: false
  tol:
    type: number
    default: 1e-3
  cache_size:
    type: number
    default: 1024
  verbose:
    type: boolean
    default: false
  max_iter:
    type: integer
    default: -1
  decision_function_shape:
    type: string
    default: ovr
  break_ties:
    type: boolean
    default: false
  random_state:
    type: integer
    default: 42

outputs:
  model_output:
    type: mlflow_model
  test_data:
    type: uri_folder
  
code: ./train-src

environment: azureml://registries/azureml/environments/sklearn-1.5/labels/latest

command: >-
  python train.py 
  --data ${{inputs.data}}
  --C ${{inputs.c_value}}
  --kernel ${{inputs.kernel}}
  --degree ${{inputs.degree}}
  --gamma ${{inputs.gamma}}
  --coef0 ${{inputs.coef0}}
  --shrinking ${{inputs.shrinking}}
  --probability ${{inputs.probability}}
  --tol ${{inputs.tol}}
  --cache_size ${{inputs.cache_size}}
  --verbose ${{inputs.verbose}}
  --max_iter ${{inputs.max_iter}}
  --decision_function_shape ${{inputs.decision_function_shape}}
  --break_ties ${{inputs.break_ties}}
  --random_state ${{inputs.random_state}}
  --model_output ${{outputs.model_output}}
  --test_data ${{outputs.test_data}}

Créer le code source du composant d’essai

Le code source de cet exemple est un fichier train.py unique. Ce code s’exécute dans chaque version d’essai de la tâche de balayage.

# imports
import os
import mlflow
import argparse

import pandas as pd
from pathlib import Path

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# define functions
def main(args):
    # enable auto logging
    mlflow.autolog()

    # setup parameters
    params = {
        "C": args.C,
        "kernel": args.kernel,
        "degree": args.degree,
        "gamma": args.gamma,
        "coef0": args.coef0,
        "shrinking": args.shrinking,
        "probability": args.probability,
        "tol": args.tol,
        "cache_size": args.cache_size,
        "class_weight": args.class_weight,
        "verbose": args.verbose,
        "max_iter": args.max_iter,
        "decision_function_shape": args.decision_function_shape,
        "break_ties": args.break_ties,
        "random_state": args.random_state,
    }

    # read in data
    df = pd.read_csv(args.data)

    # process data
    X_train, X_test, y_train, y_test = process_data(df, args.random_state)

    # train model
    model = train_model(params, X_train, X_test, y_train, y_test)
    # Output the model and test data
    # write to local folder first, then copy to output folder

    mlflow.sklearn.save_model(model, "model")

    from distutils.dir_util import copy_tree

    # copy subdirectory example
    from_directory = "model"
    to_directory = args.model_output

    copy_tree(from_directory, to_directory)

    X_test.to_csv(Path(args.test_data) / "X_test.csv", index=False)
    y_test.to_csv(Path(args.test_data) / "y_test.csv", index=False)


def process_data(df, random_state):
    # split dataframe into X and y
    X = df.drop(["species"], axis=1)
    y = df["species"]

    # train/test split
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=random_state
    )

    # return split data
    return X_train, X_test, y_train, y_test


def train_model(params, X_train, X_test, y_train, y_test):
    # train model
    model = SVC(**params)
    model = model.fit(X_train, y_train)

    # return model
    return model


def parse_args():
    # setup arg parser
    parser = argparse.ArgumentParser()

    # add arguments
    parser.add_argument("--data", type=str)
    parser.add_argument("--C", type=float, default=1.0)
    parser.add_argument("--kernel", type=str, default="rbf")
    parser.add_argument("--degree", type=int, default=3)
    parser.add_argument("--gamma", type=str, default="scale")
    parser.add_argument("--coef0", type=float, default=0)
    parser.add_argument("--shrinking", type=bool, default=False)
    parser.add_argument("--probability", type=bool, default=False)
    parser.add_argument("--tol", type=float, default=1e-3)
    parser.add_argument("--cache_size", type=float, default=1024)
    parser.add_argument("--class_weight", type=dict, default=None)
    parser.add_argument("--verbose", type=bool, default=False)
    parser.add_argument("--max_iter", type=int, default=-1)
    parser.add_argument("--decision_function_shape", type=str, default="ovr")
    parser.add_argument("--break_ties", type=bool, default=False)
    parser.add_argument("--random_state", type=int, default=42)
    parser.add_argument("--model_output", type=str, help="Path of output model")
    parser.add_argument("--test_data", type=str, help="Path of output model")

    # parse args
    args = parser.parse_args()

    # return args
    return args


# run script
if __name__ == "__main__":
    # parse args
    args = parse_args()

    # run main function
    main(args)

Remarque

Veillez à consigner les métriques dans le code source du composant d’essai avec exactement le même nom que la valeur primary_metric dans le fichier de pipeline. Cet exemple utilise mlflow.autolog(), qui est la méthode recommandée pour suivre les expériences de Machine Learning. Pour plus d’informations sur MLflow, consultez Suivre les expériences ML et des modèles avec MLflow.

Créer un pipeline avec une étape de balayage d’hyperparamètre

Étant donné le composant de commande défini dans train.yml, le code suivant crée un fichier de définition de pipeline en deux étapes train et predict. Dans sweep_step, le type d’étape requis est sweep, et les entrées d’hyperparamètre c_value, kernel et coef pour le composant trial sont ajoutées au search_space.

L’exemple suivant met en évidence le réglage des hyperparamètres sweep_step.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: pipeline_with_hyperparameter_sweep
description: Tune hyperparameters using TF component
settings:
    default_compute: azureml:cpu-cluster
jobs:
  sweep_step:
    type: sweep
    inputs:
      data: 
        type: uri_file
        path: wasbs://datasets@azuremlexamples.blob.core.windows.net/iris.csv
      degree: 3
      gamma: "scale"
      shrinking: False
      probability: False
      tol: 0.001
      cache_size: 1024
      verbose: False
      max_iter: -1
      decision_function_shape: "ovr"
      break_ties: False
      random_state: 42
    outputs:
      model_output:
      test_data:
    sampling_algorithm: random
    trial: ./train.yml
    search_space:
      c_value:
        type: uniform
        min_value: 0.5
        max_value: 0.9
      kernel:
        type: choice
        values: ["rbf", "linear", "poly"]
      coef0:
        type: uniform
        min_value: 0.1
        max_value: 1
    objective:
      goal: minimize
      primary_metric: training_f1_score
    limits:
      max_total_trials: 5
      max_concurrent_trials: 3
      timeout: 7200

  predict_step:
    type: command
    inputs:
      model: ${{parent.jobs.sweep_step.outputs.model_output}}
      test_data: ${{parent.jobs.sweep_step.outputs.test_data}}
    outputs:
      predict_result:
    component: ./predict.yml

Pour connaître le schéma complet de la tâche de balayage, consultez schéma YAML de la tâche d’organisation CLI (v2).

Envoyer la tâche de pipeline de réglage des hyperparamètres

Après avoir envoyé cette tâche de pipeline, Azure Machine Learning exécute plusieurs fois le composant trial pour balayer les hyperparamètres, en fonction de l’espace de recherche et des limites que vous avez définis dans le sweep_step.

Afficher les résultats du réglage des hyperparamètres dans Studio

Une fois que vous avez envoyé une tâche de pipeline, le widget Kit de développement logiciel (SDK) ou CLI vous donne un lien d’URL web vers le graphique de pipeline dans l’interface utilisateur d’Azure Machine Learning Studio.

Pour afficher les résultats du réglage des hyperparamètres, double-cliquez sur l’étape de balayage dans le graphique de pipeline, sélectionnez l’onglet Tâche enfants dans le volet d’informations, puis sélectionnez la tâche enfant.

Capture d’écran du pipeline, avec le travail enfant et le nœud train_model en surbrillance.

Dans la page de la tâche enfant, sélectionnez l’onglet Essais pour afficher et comparer les métriques pour toutes les exécutions enfants. Sélectionnez l’une des exécutions enfants pour afficher les détails de cette exécution.

Capture d’écran de la page de tâche enfant avec l’onglet Essais.

Si une exécution enfant a échoué, vous pouvez sélectionner l'onglet Sorties + journaux d’activité de la page d’exécution enfant pour afficher des informations de débogage utiles.

Capture d'écran de l'onglet sortie et journaux d’activité d'une exécution d’élément enfant.