Aracılığıyla paylaş


İşlem hattında hiper parametre ayarlaması yapma (v2)

ŞUNLAR IÇIN GEÇERLIDIR: Azure CLI ml uzantısı v2 (geçerli)Python SDK azure-ai-ml v2 (geçerli)

Bu makalede Azure Machine Learning işlem hattında hiper parametre ayarlamayı öğreneceksiniz.

Önkoşul

  1. Hyperparameter tuning nedir ve Azure Machine Learning'de SweepJob kullanarak hiper parametre ayarlamanın nasıl yapıldığını anlayın.
  2. Azure Machine Learning işlem hattı nedir anlama
  3. Giriş olarak hiper parametre alan bir komut bileşeni oluşturun.

Azure Machine Learning işlem hattında hiper parametre ayarlaması yapma

Bu bölümde, CLI v2 ve Python SDK'sını kullanarak Azure Machine Learning işlem hattında hiper parametre ayarlamanın nasıl yapılacağını açıklanmaktadır. Her iki yaklaşım da aynı önkoşulu paylaşır: zaten bir komut bileşeniniz oluşturulmuştur ve komut bileşeni hiper parametreleri giriş olarak alır. Henüz bir komut bileşeniniz yoksa. Önce bir komut bileşeni oluşturmak için aşağıdaki bağlantıları izleyin.

CLI v2

Bu makalede kullanılan örnek azureml-example deposunda bulunabilir. Örneği denetlemek için [azureml-examples/cli/jobs/pipelines-with-components/pipeline_with_hyperparameter_sweep adresine gidin.

içinde train.yamltanımlanmış bir komut bileşeniniz olduğunu varsayalım. İki aşamalı işlem hattı işi (eğit ve tahmin) YAML dosyası aşağıdaki gibi görünür.

$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

sweep_step, hiper parametre ayarlama adımıdır. Türünün olması sweepgerekir. Ve trial içinde tanımlanan komut bileşenine başvurur train.yaml. Alandan search space arama alanına üç hyparmeter (c_value, kernelve coef) eklendiğini görebiliriz. Bu işlem hattı işini gönderdikten sonra Azure Machine Learning, içinde tanımladığınız sweep_steparama alanına ve sonlandırma ilkesine göre hiper parametreler üzerinde tarama yapmak için deneme bileşenini birden çok kez çalıştırır. Süpürme işinin tam şeması için süpürme işi YAML şemasını denetleyin.

Aşağıda deneme bileşeni tanımı (train.yml dosyası) yer almaktadır.

$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.0/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}}

pipeline.yml arama alanına eklenen hiper parametreler, deneme bileşeni için girişler olmalıdır. Deneme bileşeninin kaynak kodu klasörün altındadır ./train-src . Bu örnekte tek train.py bir dosyadır. Bu, süpürme işinin her denemesinde yürütülecek koddur. Deneme bileşeni kaynak kodundaki ölçümleri, pipeline.yml dosyasındaki değerle tam olarak primary_metric aynı adla kaydettiğinizden emin olun. Bu örnekte, ML denemelerinizi izlemenin önerilen yolu olan öğesini kullanırız mlflow.autolog(). Mlflow hakkında daha fazla bilgi için buraya bakın

Aşağıdaki kod parçacığı, deneme bileşeninin kaynak kodudur.

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

Python SDK'sı

Python SDK örneği azureml-example deposunda bulunabilir. Örneği denetlemek için azureml-examples/sdk/jobs/pipelines/1c_pipeline_with_hyperparameter_sweep adresine gidin.

Azure Machine Learning Python SDK v2'de, yöntemini çağırarak .sweep() herhangi bir komut bileşeni için hiper parametre ayarlamasını etkinleştirebilirsiniz.

Aşağıdaki kod parçacığında için train_modelsüpürmeyi etkinleştirme gösterilmektedir.

train_component_func = load_component(source="./train.yml")
score_component_func = load_component(source="./predict.yml")

# define a pipeline
@pipeline()
def pipeline_with_hyperparameter_sweep():
    """Tune hyperparameters using sample components."""
    train_model = train_component_func(
        data=Input(
            type="uri_file",
            path="wasbs://datasets@azuremlexamples.blob.core.windows.net/iris.csv",
        ),
        c_value=Uniform(min_value=0.5, max_value=0.9),
        kernel=Choice(["rbf", "linear", "poly"]),
        coef0=Uniform(min_value=0.1, max_value=1),
        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,
    )
    sweep_step = train_model.sweep(
        primary_metric="training_f1_score",
        goal="minimize",
        sampling_algorithm="random",
        compute="cpu-cluster",
    )
    sweep_step.set_limits(max_total_trials=20, max_concurrent_trials=10, timeout=7200)

    score_data = score_component_func(
        model=sweep_step.outputs.model_output, test_data=sweep_step.outputs.test_data
    )


pipeline_job = pipeline_with_hyperparameter_sweep()

# set pipeline level compute
pipeline_job.settings.default_compute = "cpu-cluster"

İlk olarak train_component_func dosyada tanımlandık train.yml . oluştururken train_modelarama alanına ve coef0 ekleriz c_valuekernel (satır 15-17). Satır 30-35 birincil ölçümü, örnekleme algoritmasını vb. tanımlar.

Studio'da süpürme adımıyla işlem hattı işini denetleme

İşlem hattı işi gönderdikten sonra SDK veya CLI pencere öğesi size Studio kullanıcı arabirimine bir web URL'si bağlantısı verir. Bağlantı, varsayılan olarak işlem hattı grafı görünümüne yönlendirecektir.

Süpürme adımının ayrıntılarını denetlemek için süpürme adımına çift tıklayın ve sağ taraftaki panelde alt iş sekmesine gidin.

Alt işin ve train_model düğümünün vurgulandığı işlem hattının ekran görüntüsü.

Bu, aşağıdaki ekran görüntüsünde gösterildiği gibi sizi süpürme işi sayfasına bağlar. Alt iş sekmesine gidin, burada tüm alt işlerin ölçümlerini ve tüm alt işlerin listesini görebilirsiniz.

Alt işler sekmesindeki iş sayfasının ekran görüntüsü.

Bir alt iş başarısız olursa, ilgili alt işin ayrıntı sayfasını girmek için bu alt işin adını seçin (aşağıdaki ekran görüntüsüne bakın). Yararlı hata ayıklama bilgileri Çıkışlar + Günlükler altındadır.

Alt çalıştırmanın çıkış + günlükler sekmesinin ekran görüntüsü.

Örnek not defterleri

Sonraki adımlar