Как выполнять настройку гиперпараметров в конвейерах
ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения Azure CLI версии 2 (current)Python SDK azure-ai-ml версии 2 (current)
В этой статье вы узнаете, как автоматизировать настройку гиперпараметров в конвейерах Машинное обучение Azure с помощью Машинное обучение Azure CLI версии 2 или пакета SDK Машинное обучение Azure для Python версии 2.
Гиперпараметры — это настраиваемые параметры, позволяющие управлять процессом обучения модели. Настройка гиперпараметра — это процесс поиска конфигурации гиперпараметров, которые приводят к оптимальной производительности. Машинное обучение Azure позволяет автоматизировать настройку гиперпараметров и запускать эксперименты параллельно, чтобы эффективно оптимизировать гиперпараметры.
Необходимые компоненты
- У вас есть учетная запись Машинное обучение Azure и рабочая область.
- Общие сведения о Машинное обучение Azure конвейерах и настройке гиперпараметров модели.
Создание и запуск конвейера настройки гиперпараметров
Ниже приведены примеры выполнения задания конвейера с помощью очистки (hyperdrive) в конвейере в репозитории Машинное обучение Azure примеров. Дополнительные сведения о создании конвейеров с компонентами см. в статье "Создание и запуск конвейеров машинного обучения с помощью компонентов с помощью интерфейса командной строки Машинное обучение Azure".
Создание компонента команды с входными данными гиперпараметров
Конвейер Машинное обучение Azure должен иметь компонент команды с входными данными гиперпараметров. Следующий train.yml файл из примеров проектов определяет trial
компонент, имеющий c_value
kernel
входные данные , и coef
гиперпараметр и запускает исходный код, расположенный в папке ./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}}
Создание исходного кода компонента пробной версии
Исходный код для этого примера — это один файл train.py . Этот код выполняется во всех пробных версиях задания очистки.
# 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)
Примечание.
Обязательно регистрировать метрики в исходном коде пробного компонента с точно таким же именем, как primary_metric
и значение в файле конвейера. В этом примере используется mlflow.autolog()
рекомендуемый способ отслеживания экспериментов машинного обучения. Дополнительные сведения о MLflow см. в разделе "Отслеживание экспериментов и моделей машинного обучения" с помощью MLflow.
Создание конвейера с шагом очистки гиперпараметров
Учитывая компонент команды, определенный в train.yml, следующий код создает двухфакторный train
и predict
файл определения конвейера. sweep_step
В поле "Обязательный тип шага" добавляются kernel
coef
sweep
c_value
search_space
и входные данные гиперпараметра для trial
компонента.
В следующем примере выделена настройка 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://[email protected]/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
Сведения о схеме задания полной очистки см. в схеме YAML задания cli (версии 2).
Отправка задания конвейера настройки гиперпараметров
После отправки этого задания конвейера Машинное обучение Azure выполняет trial
компонент несколько раз для перебора гиперпараметров на основе пространства поиска и ограничений, определенных в разделе sweep_step
.
Просмотр результатов настройки гиперпараметров в студии
После отправки задания конвейера мини-приложение SDK или CLI предоставляет веб-URL-адрес графу конвейера в пользовательском интерфейсе Студия машинного обучения Azure.
Чтобы просмотреть результаты настройки гиперпараметров, дважды щелкните шаг очистки в графе конвейера, перейдите на вкладку "Дочерние задания " на панели сведений и выберите дочернее задание.
На странице дочернего задания выберите вкладку "Пробные версии" , чтобы просмотреть и сравнить метрики для всех дочерних запусков. Выберите любой из дочерних запусков, чтобы просмотреть сведения об этом выполнении.
Если дочерний запуск завершился сбоем, можно выбрать вкладку "Выходные данные и журналы " на дочерней странице запуска, чтобы просмотреть полезные сведения об отладке.