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
- Ha ett Azure Machine Learning-konto och en arbetsyta.
- Förstå Azure Machine Learning-pipelines och hyperparameterjustering av en modell.
Skapa och köra en justeringspipeline för hyperparameter
Följande exempel kommer från Kör ett pipelinejobb med hjälp av svep (hyperdrive) i pipeline i Azure Machine Learning-exempellagringsplatsen . Mer information om hur du skapar pipelines med komponenter finns i Skapa och köra maskininlärningspipelines med hjälp av komponenter med Azure Machine Learning CLI.
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
, kernel
och 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_step
I är sweep
den obligatoriska stegtypen , och indata för c_value
, kernel
och 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.
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.
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.