Delen via


Hyperparameters afstemmen in pijplijnen

VAN TOEPASSING OP:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)

In dit artikel leert u hoe u hyperparameterafstemming in Azure Machine Learning-pijplijnen automatiseert met behulp van Azure Machine Learning CLI v2 of Azure Machine Learning SDK voor Python v2.

Hyperparameters zijn aanpasbare parameters waarmee u het modeltrainingsproces kunt beheren. Hyperparameterafstemming is het proces voor het vinden van de configuratie van hyperparameters die de beste prestaties opleveren. Met Azure Machine Learning kunt u hyperparameterafstemming automatiseren en experimenten parallel uitvoeren om hyperparameters efficiënt te optimaliseren.

Vereisten

Een pijplijn voor het afstemmen van hyperparameters maken en uitvoeren

Een opdrachtonderdeel maken met hyperparameterinvoer

De Azure Machine Learning-pijplijn moet een opdrachtonderdeel met hyperparameterinvoer hebben. Het volgende train.yml bestand uit de voorbeeldprojecten definieert een trial onderdeel met de c_valueinvoer en kernelcoef hyperparameterinvoer en voert de broncode uit die zich in de map ./train-src bevindt.

$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}}

De broncode van het proefonderdeel maken

De broncode voor dit voorbeeld is één train.py bestand. Deze code wordt uitgevoerd in elke proefversie van de sweep-taak.

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

Notitie

Zorg ervoor dat u de metrische gegevens in de broncode van het proefonderdeel met exact dezelfde naam als de primary_metric waarde in het pijplijnbestand aanmeldt. In dit voorbeeld wordt mlflow.autolog()gebruikgemaakt van de aanbevolen manier om machine learning-experimenten bij te houden. Zie Ml-experimenten en -modellen bijhouden met MLflow voor meer informatie over MLflow.

Een pijplijn maken met een stap voor hyperparameter opruimen

Gezien het opdrachtonderdeel dat is gedefinieerd in train.yml, maakt de volgende code een definitiebestand in twee stappen train en predict pijplijndefinities. In de sweep_step, het vereiste staptype is sweep, en de c_value, kernelen coef hyperparameter-invoer voor het trial onderdeel worden toegevoegd aan de search_space.

In het volgende voorbeeld wordt de afstemming van hyperparameters sweep_stepgemarkeerd.

$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

Zie HET YAML-schema van de CLI -taak (v2) voor het volledige opruimen van taken.

De pijplijntaak voor hyperparameterafstemming verzenden

Nadat u deze pijplijntaak hebt verzonden, voert Azure Machine Learning het trial onderdeel meerdere keren uit om hyperparameters over te vegen, op basis van de zoekruimte en limieten die u hebt gedefinieerd in de sweep_step.

Resultaten van hyperparameterafstemming weergeven in studio

Nadat u een pijplijntaak hebt verzonden, krijgt u met de SDK- of CLI-widget een web-URL-koppeling naar de pijplijngrafiek in de Azure Machine Learning-studio-gebruikersinterface.

Als u resultaten voor het afstemmen van hyperparameters wilt weergeven, dubbelklikt u op de stap opruimen in de pijplijngrafiek, selecteert u het tabblad Onderliggende taken in het detailvenster en selecteert u vervolgens de onderliggende taak.

Schermopname van de pijplijn met onderliggende taak en het train_model knooppunt gemarkeerd.

Selecteer op de pagina onderliggende taak het tabblad Proefversies om metrische gegevens voor alle onderliggende uitvoeringen weer te geven en te vergelijken. Selecteer een van de onderliggende uitvoeringen om de details voor die uitvoering weer te geven.

Schermopname van de onderliggende taakpagina met het tabblad Proefversies.

Als een onderliggende uitvoering is mislukt, kunt u het tabblad Uitvoer en logboeken op de onderliggende uitvoeringspagina selecteren om nuttige foutopsporingsgegevens weer te geven.

Schermopname van het tabblad Uitvoer en logboeken van een onderliggende uitvoering.