Поделиться через


Как выполнять настройку гиперпараметров в конвейерах

ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения Azure CLI версии 2 (current)Python SDK azure-ai-ml версии 2 (current)

В этой статье вы узнаете, как автоматизировать настройку гиперпараметров в конвейерах Машинное обучение Azure с помощью Машинное обучение Azure CLI версии 2 или пакета SDK Машинное обучение Azure для Python версии 2.

Гиперпараметры — это настраиваемые параметры, позволяющие управлять процессом обучения модели. Настройка гиперпараметра — это процесс поиска конфигурации гиперпараметров, которые приводят к оптимальной производительности. Машинное обучение Azure позволяет автоматизировать настройку гиперпараметров и запускать эксперименты параллельно, чтобы эффективно оптимизировать гиперпараметры.

Необходимые компоненты

Создание и запуск конвейера настройки гиперпараметров

Ниже приведены примеры выполнения задания конвейера с помощью очистки (hyperdrive) в конвейере в репозитории Машинное обучение Azure примеров. Дополнительные сведения о создании конвейеров с компонентами см. в статье "Создание и запуск конвейеров машинного обучения с помощью компонентов с помощью интерфейса командной строки Машинное обучение Azure".

Создание компонента команды с входными данными гиперпараметров

Конвейер Машинное обучение Azure должен иметь компонент команды с входными данными гиперпараметров. Следующий train.yml файл из примеров проектов определяет trial компонент, имеющий c_valuekernelвходные данные , и 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В поле "Обязательный тип шага" добавляются kernelcoef sweepc_valuesearch_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.

Чтобы просмотреть результаты настройки гиперпараметров, дважды щелкните шаг очистки в графе конвейера, перейдите на вкладку "Дочерние задания " на панели сведений и выберите дочернее задание.

Снимок экрана: конвейер с дочерним заданием и выделенным узлом train_model.

На странице дочернего задания выберите вкладку "Пробные версии" , чтобы просмотреть и сравнить метрики для всех дочерних запусков. Выберите любой из дочерних запусков, чтобы просмотреть сведения об этом выполнении.

Снимок экрана: дочерняя страница задания с вкладкой

Если дочерний запуск завершился сбоем, можно выбрать вкладку "Выходные данные и журналы " на дочерней странице запуска, чтобы просмотреть полезные сведения об отладке.

Снимок экрана: вкладка выходных данных и журналов дочернего запуска.