Dela via


Så här gör du hyperparameterjustering i pipelines

GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)

I den här artikeln får du lära dig hur du automatiserar hyperparameterjustering i Azure Machine Learning-pipelines med hjälp av Azure Machine Learning CLI v2 eller Azure Machine Learning SDK för Python v2.

Hyperparametrar är justerbara parametrar som gör att du kan styra modellträningsprocessen. Hyperparameterjustering är processen att hitta konfigurationen av hyperparametrar som ger bästa prestanda. Med Azure Machine Learning kan du automatisera hyperparameterjustering och köra experiment parallellt för att effektivt optimera hyperparametrar.

Förutsättningar

Skapa och köra en justeringspipeline för hyperparameter

Skapa en kommandokomponent med hyperparameterindata

Azure Machine Learning-pipelinen måste ha en kommandokomponent med hyperparameterindata. Följande train.yml fil från exempelprojekten definierar en trial komponent som har indata för c_value, kerneloch coef hyperparameter och kör källkoden som finns i mappen ./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}}

Skapa källkoden för utvärderingskomponenten

Källkoden för det här exemplet är en enda train.py fil. Den här koden körs i varje utvärderingsversion av svepjobbet.

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

Kommentar

Logga måtten i källkoden för utvärderingskomponenten med exakt samma namn som primary_metric värdet i pipelinefilen. I det här exemplet används mlflow.autolog(), vilket är det rekommenderade sättet att spåra maskininlärningsexperiment. Mer information om MLflow finns i Spåra ML-experiment och modeller med MLflow.

Skapa en pipeline med ett svepsteg för hyperparameter

Med tanke på kommandokomponenten som definierats i train.yml skapar följande kod en tvåstegs train - och predict pipelinedefinitionsfil. sweep_stepI är sweepden obligatoriska stegtypen , och indata för c_value, kerneloch coef hyperparameter för komponenten trial läggs till i search_space.

I följande exempel markeras hyperparameterjusteringen 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

Det fullständiga svepjobbschemat finns i YAML-schema för CLI -svepjobb (v2).

Skicka pipelinejobbet för justering av hyperparameter

När du har skickat det här pipelinejobbet kör Azure Machine Learning komponenten trial flera gånger för att svepa över hyperparametrar, baserat på sökutrymmet och de gränser som du definierade i sweep_step.

Visa hyperparameterjusteringsresultat i studio

När du har skickat ett pipelinejobb ger SDK- eller CLI-widgeten en webb-URL-länk till pipelinediagrammet i Azure Machine Learning-studio användargränssnittet.

Om du vill visa resultat för hyperparameterjustering dubbelklickar du på svepsteget i pipelinediagrammet, väljer fliken Underordnade jobb i informationspanelen och väljer sedan det underordnade jobbet.

Skärmbild av pipelinen med underordnat jobb och den train_model noden markerad.

På den underordnade jobbsidan väljer du fliken Utvärderingsversioner för att se och jämföra mått för alla underordnade körningar. Välj någon av de underordnade körningarna för att se information om den körningen.

Skärmbild av den underordnade jobbsidan med fliken Utvärderingsversioner.

Om en underordnad körning misslyckades kan du välja fliken Utdata + loggar på den underordnade körningssidan för att se användbar felsökningsinformation.

Skärmbild av fliken utdata och loggar för en underordnad körning.