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


Использование автоматизированного машинного обучения в конвейере машинного обучения Azure на Python

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python для ML Azure версии 1

Функция автоматизированного машинного обучения в Машинном обучении Azure позволяет выявлять высокопроизводительные модели без повторной реализации всех возможных подходов. Используя конвейеры Машинного обучения Azure, вы можете создавать развертываемые рабочие процессы, которые позволяют быстро обнаружить алгоритм, наиболее подходящий для ваших данных. В этой статье показано, как эффективно присоединить этап подготовки данных к этапу автоматизированного машинного обучения. Автоматизированное машинное обучение позволяет быстро подобрать оптимальный алгоритм, который лучше всего подходит для ваших данных, и в то же время создать условия для MLOps и оптимизации жизненного цикла модели с помощью конвейеров.

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

Обзор центральных классов автоматизированного машинного обучения

Автоматизированное машинное обучение в конвейере представлено объектом AutoMLStep. Класс AutoMLStep является подклассом PipelineStep. Граф объектов PipelineStep определяет Pipeline.

Существует несколько подклассов PipelineStep. Помимо AutoMLStep, в этой статье будет показан объект PythonScriptStep для подготовки данных и еще один для регистрации модели.

Предпочтительный способ первоначального перемещения данных в конвейер машинного обучения — с помощью объектов Dataset. Для перемещения данных между шагами и сохранения выходных данных после выполнения команды лучше всего использовать объекты OutputFileDatasetConfig и OutputTabularDatasetConfig. Для использования с AutoMLStep объект PipelineData необходимо преобразовать в объект PipelineOutputTabularDataset. Дополнительные сведения см. в статье о входных и выходных данных конвейеров машинного обучения.

Объект AutoMLStep настраивается с помощью объекта AutoMLConfig. AutoMLConfig является гибким классом, как описано в разделе Настройка экспериментов с автоматизированным машинным обучением на Python.

ОбъектPipeline выполняется в Experiment. Для каждого этапа в конвейере Run есть дочерний элемент StepRun. Выходные данные автоматизированного машинного обучения StepRun — это метрики обучения и модель с максимальной производительностью.

Для конкретики в этой статье создается простой конвейер для выполнения задачи классификации. Эта задача прогнозирует выживание Титаника, но мы не будем обсуждать данные или задачу, только передачу.

Начать

Получение исходного набора данных

Часто рабочий процесс машинного обучения начинается с уже существующих базовых данных. Это хороший сценарий для зарегистрированного набора данных. Наборы данных видны в рабочей области, поддерживают управление версиями и доступны для интерактивного изучения. Создавать и заполнять наборы данных можно по-разному, как описано в разделе Создание наборов данных для Машинного обучения Azure. Так как для создания конвейера мы будем использовать пакет SDK для Python, используйте пакет SDK для загрузки базовых данных и зарегистрируйте его под именем "titanic_ds".

from azureml.core import Workspace, Dataset

ws = Workspace.from_config()
if not 'titanic_ds' in ws.datasets.keys() :
    # create a TabularDataset from Titanic training data
    web_paths = ['https://dprepdata.blob.core.windows.net/demo/Titanic.csv',
                 'https://dprepdata.blob.core.windows.net/demo/Titanic2.csv']
    titanic_ds = Dataset.Tabular.from_delimited_files(path=web_paths)

    titanic_ds.register(workspace = ws,
                                     name = 'titanic_ds',
                                     description = 'Titanic baseline data',
                                     create_new_version = True)

titanic_ds = Dataset.get_by_name(ws, 'titanic_ds')

Сначала код входит в рабочую область Машинного обучения Azure, определенную в файле config.json (описание см. в разделе Создание файла конфигурации рабочей области). Если набор данных с именем 'titanic_ds' еще не зарегистрирован, код его создаст. Код загружает CSV-данные из Интернета, использует их для создания экземпляра TabularDataset, а затем регистрирует набор данных в рабочей области. Наконец, функция Dataset.get_by_name() присваивает параметру Dataset значение titanic_ds.

Настройка хранилища и целевого объекта вычислений

Конвейеру необходимы дополнительные ресурсы — хранилище и, как правило, вычислительные ресурсы Машинного обучения Azure.

from azureml.core import Datastore
from azureml.core.compute import AmlCompute, ComputeTarget

datastore = ws.get_default_datastore()

compute_name = 'cpu-cluster'
if not compute_name in ws.compute_targets :
    print('creating a new compute target...')
    provisioning_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                                min_nodes=0,
                                                                max_nodes=1)
    compute_target = ComputeTarget.create(ws, compute_name, provisioning_config)

    compute_target.wait_for_completion(
        show_output=True, min_node_count=None, timeout_in_minutes=20)

    # Show the result
    print(compute_target.get_status().serialize())

compute_target = ws.compute_targets[compute_name]

Промежуточные данные, которые создаются между подготовкой данных и этапом автоматизированного машинного обучения, можно хранить в хранилище данных рабочей области по умолчанию, поэтому достаточно просто вызвать get_default_datastore() для объекта Workspace.

После этого код проверяет, существует ли Машинное обучение Azure целевой объект 'cpu-cluster' вычислений. Если нет, мы указываем, что нам нужен небольшой вычислительный ресурс на основе ЦП. Если вы планируете использовать функции глубокого обучения в автоматизированном машинном обучении (например, конструирование текста с поддержкой DNN), выбирайте вычислительную систему с хорошей поддержкой GPU, как описано в статье Размеры виртуальных машин, оптимизированных для GPU.

Код блокируется до тех пор, пока не будет подготовлен целевой объект, а затем выводит некоторые сведения о только что созданном целевом объекте вычислений. Наконец, указанный целевой объект вычислений извлекается из рабочей области и назначается объекту compute_target.

Настройка выполнения обучения

Контекст среды выполнения задается путем создания и настройки объекта RunConfiguration. Здесь мы указываем целевой объект вычислений.

from azureml.core.runconfig import RunConfiguration
from azureml.core.conda_dependencies import CondaDependencies

aml_run_config = RunConfiguration()
# Use just-specified compute target ("cpu-cluster")
aml_run_config.target = compute_target

# Specify CondaDependencies obj, add necessary packages
aml_run_config.environment.python.conda_dependencies = CondaDependencies.create(
    conda_packages=['pandas','scikit-learn'], 
    pip_packages=['azureml-sdk[automl]', 'pyarrow'])

Подготовка данных для автоматизированного машинного обучения

Написание кода подготовки данных

Базовый набор данных Титаника состоит из смешанных числовых и текстовых данных. При этом некоторые значения отсутствуют. Чтобы подготовить его для автоматизированного машинного обучения, этап конвейера подготовки данных выполнит следующие действия.

  • Заполнит отсутствующие данные либо случайными данными, либо данными категории "Unknown" (Неизвестно).
  • Преобразует категориальные данные в целые числа.
  • Удалит столбцы, которые мы не планируем использовать.
  • Разделит данные на наборы данных для обучения и тестирования.
  • Запишет преобразованные данные в пути для выходных данных OutputFileDatasetConfig.
%%writefile dataprep.py
from azureml.core import Run

import pandas as pd 
import numpy as np 
import argparse

RANDOM_SEED=42

def prepare_age(df):
    # Fill in missing Age values from distribution of present Age values 
    mean = df["Age"].mean()
    std = df["Age"].std()
    is_null = df["Age"].isnull().sum()
    # compute enough (== is_null().sum()) random numbers between the mean, std
    rand_age = np.random.randint(mean - std, mean + std, size = is_null)
    # fill NaN values in Age column with random values generated
    age_slice = df["Age"].copy()
    age_slice[np.isnan(age_slice)] = rand_age
    df["Age"] = age_slice
    df["Age"] = df["Age"].astype(int)
    
    # Quantize age into 5 classes
    df['Age_Group'] = pd.qcut(df['Age'],5, labels=False)
    df.drop(['Age'], axis=1, inplace=True)
    return df

def prepare_fare(df):
    df['Fare'].fillna(0, inplace=True)
    df['Fare_Group'] = pd.qcut(df['Fare'],5,labels=False)
    df.drop(['Fare'], axis=1, inplace=True)
    return df 

def prepare_genders(df):
    genders = {"male": 0, "female": 1, "unknown": 2}
    df['Sex'] = df['Sex'].map(genders)
    df['Sex'].fillna(2, inplace=True)
    df['Sex'] = df['Sex'].astype(int)
    return df

def prepare_embarked(df):
    df['Embarked'].replace('', 'U', inplace=True)
    df['Embarked'].fillna('U', inplace=True)
    ports = {"S": 0, "C": 1, "Q": 2, "U": 3}
    df['Embarked'] = df['Embarked'].map(ports)
    return df
    
parser = argparse.ArgumentParser()
parser.add_argument('--output_path', dest='output_path', required=True)
args = parser.parse_args()
    
titanic_ds = Run.get_context().input_datasets['titanic_ds']
df = titanic_ds.to_pandas_dataframe().drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
df = prepare_embarked(prepare_genders(prepare_fare(prepare_age(df))))

df.to_csv(os.path.join(args.output_path,"prepped_data.csv"))

print(f"Wrote prepped data to {args.output_path}/prepped_data.csv")

Фрагмент кода, показанный выше, представляет собой полный, но минимальный пример подготовки данных для данных Титаника. Фрагмент кода начинается с "магической команды" Jupyter, которая выводит код в файл. Если вы не используете записную книжку Jupyter, удалите эту строку и создайте файл вручную.

Различные функции prepare_ в приведенном выше фрагменте изменяют соответствующий столбец во входном наборе данных. Эти функции работают с данными после их изменения в объекте DataFrame Pandas. В каждом случае отсутствующие данные заполняются либо репрезентативными случайными данными, либо категориальными данными с указанием Unknown (Неизвестно). Категориальные данные на основе текста сопоставляются с целыми числами. Ненужные столбцы перезаписываются или отбрасываются.

Определив функции подготовки данных, код проанализирует входной аргумент, представляющий собой путь к каталогу, в который мы хотим записать свои данные. (Эти значения будут определяться объектами OutputFileDatasetConfig, которые мы обсудим в следующем шаге.) Код извлекает зарегистрированный 'titanic_cs'Dataset, преобразует его в DataFrame Pandas и вызывает различные функции подготовки данных.

Так как объект output_path является каталогом, в вызове to_csv() указывается имя файла prepped_data.csv.

Создание этапа конвейера подготовки данных (PythonScriptStep)

Приведенный выше код подготовки данных должен быть связан с объектом PythonScripStep, который будет использоваться в конвейере. Путь к каталогу, в который записываются выходные данные CSV, создается объектом OutputFileDatasetConfig. Ресурсы, подготовленные ранее, такие как ComputeTarget, RunConfig и 'titanic_ds' Dataset, используются для выполнения спецификации.

from azureml.data import OutputFileDatasetConfig
from azureml.pipeline.steps import PythonScriptStep

prepped_data_path = OutputFileDatasetConfig(name="output_path")

dataprep_step = PythonScriptStep(
    name="dataprep", 
    script_name="dataprep.py", 
    compute_target=compute_target, 
    runconfig=aml_run_config,
    arguments=["--output_path", prepped_data_path],
    inputs=[titanic_ds.as_named_input('titanic_ds')],
    allow_reuse=True
)

Объект prepped_data_path имеет тип OutputFileDatasetConfig, который указывает на каталог. Обратите внимание на то, что он указан в параметре arguments. Если вы просмотрите предыдущий шаг, то увидите, что в коде подготовки данных значение аргумента '--output_path' — это путь к каталогу, в который был записан CSV-файл.

Обучение с помощью AutoMLStep

Настройка этапа конвейера автоматизированного машинного обучения выполняется с помощью класса AutoMLConfig. Это гибкий класс, описанный в разделе Настройка экспериментов с автоматизированным машинным обучением на Python. Входные и выходные данные являются единственными аспектами настройки, которые требуют особого внимания в конвейере машинного обучения. Входные и выходные данные для AutoMLConfig в конвейерах обсуждаются ниже. Помимо данных, преимуществом конвейеров машинного обучения является возможность использовать различные целевые объекты вычислений для различных этапов. Вы можете использовать более мощный вариант объекта ComputeTarget только для процесса автоматизированного машинного обучения. Это так же просто, как назначение более мощного объекта RunConfiguration для параметра run_configuration объекта AutoMLConfig.

Отправка данных в AutoMLStep

В конвейере машинного обучения входные данные должны быть объектом Dataset. Самый эффективный способ — предоставить входные данные в форме объектов OutputTabularDatasetConfig. Для создания этого типа объекта используется функция read_delimited_files() в объекте OutputFileDatasetConfig, таком как prepped_data_path, таком как prepped_data_path объект.

# type(prepped_data) == OutputTabularDatasetConfig
prepped_data = prepped_data_path.read_delimited_files()

Другой вариант — использовать объекты Dataset, зарегистрированные в рабочей области:

prepped_data = Dataset.get_by_name(ws, 'Data_prepared')

Сравним два метода:

Методика Преимущества и недостатки
OutputTabularDatasetConfig Более высокая производительность
Естественный маршрут из OutputFileDatasetConfig
Данные после выполнения конвейера не сохраняются
Зарегистрированный Dataset Снижение производительности.
Может создаваться различными способами
Данные сохраняются и видны во всей рабочей области
Записная книжка с зарегистрированным методом Dataset

Указание выходных данных автоматизированного машинного обучения

Выходные данные AutoMLStep представляют собой финальные показатели метрик модели с более высокой производительностью и саму эту модель. Чтобы использовать эти выходные данные в дальнейших этапах конвейера, подготовьте объекты OutputFileDatasetConfig для их получения.

from azureml.pipeline.core import TrainingOutput, PipelineData

metrics_data = PipelineData(name='metrics_data',
                            datastore=datastore,
                            pipeline_output_name='metrics_output',
                            training_output=TrainingOutput(type='Metrics'))

model_data = PipelineData(name='best_model_data',
                          datastore=datastore,
                          pipeline_output_name='model_output',
                          training_output=TrainingOutput(type='Model'))

В приведенном выше фрагменте кода создаются два объекта PipelineData для метрик и выходных данных модели. Каждый из них получает имя, назначаемое полученному ранее хранилищу данных по умолчанию, и определенный type объекта TrainingOutput из AutoMLStep. Поскольку мы присвоили pipeline_output_name этим объектам PipelineData, их значения будут доступны не только на этапе отдельного конвейера, но и из конвейера в целом — это мы обсудим ниже в разделе "Анализ результатов конвейера".

Настройка и создание этапа конвейера автоматизированного машинного обучения

После того как будут определены входные и выходные данные, нужно создать AutoMLConfig и AutoMLStep. Сведения о конфигурации будут зависеть от вашей задачи, как описано в разделе Настройка экспериментов с автоматизированным машинным обучением на Python. В следующем фрагменте кода демонстрируется простая конфигурация для задачи классификации выживания Титаника.

from azureml.train.automl import AutoMLConfig
from azureml.pipeline.steps import AutoMLStep

# Change iterations to a reasonable number (50) to get better accuracy
automl_settings = {
    "iteration_timeout_minutes" : 10,
    "iterations" : 2,
    "experiment_timeout_hours" : 0.25,
    "primary_metric" : 'AUC_weighted'
}

automl_config = AutoMLConfig(task = 'classification',
                             path = '.',
                             debug_log = 'automated_ml_errors.log',
                             compute_target = compute_target,
                             run_configuration = aml_run_config,
                             featurization = 'auto',
                             training_data = prepped_data,
                             label_column_name = 'Survived',
                             **automl_settings)

train_step = AutoMLStep(name='AutoML_Classification',
    automl_config=automl_config,
    passthru_automl_config=False,
    outputs=[metrics_data,model_data],
    enable_default_model_output=False,
    enable_default_metrics_output=False,
    allow_reuse=True)

В этом фрагменте кода показана идиома, которая обычно используется с AutoMLConfig. Более гибкие аргументы (с гиперпараметрами) задаются в отдельном словаре, а значения с меньшей вероятностью изменения — непосредственно в конструкторе AutoMLConfig. В этом случае automl_settings определяют короткое выполнение: оно будет остановлено всего после 2 итераций или через 15 минут в зависимости от того, что случится раньше.

Словарь automl_settings передается в конструктор AutoMLConfig как kwargs. Другие параметры не являются сложными:

  • В этом примере для объекта task задано значение classification. Другие допустимые значения: regression и forecasting.
  • path и debug_log описывают путь к проекту и локальный файл, в который будут записаны отладочные данные.
  • Объект compute_target — это определенный ранее объект compute_target, который в этом примере является недорогим компьютером на основе ЦП. Если вы используете средства глубокого обучения AutoML, измените целевой объект вычислений так, чтобы он был основан на GPU.
  • featurization задан как auto. Дополнительные сведения см. в разделе Конструирование признаков документа о настройке автоматизированного машинного обучения.
  • label_column_name указывает, какой столбец нам нужен для прогнозирования.
  • training_data задается для объектов OutputTabularDatasetConfig, полученных из выходных данных этапа подготовки данных.

AutoMLStep сам принимает AutoMLConfig, а в качестве выходных данных включает объекты PipelineData, созданные для хранения метрик и данных модели.

Внимание

Задавайте для параметров enable_default_model_output и enable_default_metrics_output значение True, только если используется AutoMLStepRun.

В этом примере процесс автоматизированного машинного обучения выполнит перекрестные проверки по параметру training_data. Число перекрестных проверок по аргументу n_cross_validations можно контролировать. Если вы уже разделили обучающие данные на этапах подготовки данных, вы можете задать для validation_data его собственный Dataset.

Иногда для функций данных используется X, а для меток данных — y. Этот метод устарел, и для входных данных нужно использовать training_data.

Регистрация модели, созданной автоматизированным машинным обучением

Последний шаг в простом конвейере машинного обучения — это регистрация созданной модели. Если вы добавите модель в реестр моделей рабочей области, она будет доступна на портале, и ее версиями можно будет управлять. Чтобы зарегистрировать модель, напишите другой PythonScriptStep, который принимает выходные данные model_data из AutoMLStep.

Написание кода для регистрации модели

Модель регистрируется в Workspace. Возможно, вы уже знаете, как использовать Workspace.from_config() для входа в рабочую область на локальном компьютере, но существует и другой способ получения рабочей области в выполняемом конвейере машинного обучения. Функция Run.get_context() извлекает активный объект Run. Объект run предоставляет доступ ко многим важным объектам, включая Workspace, который используется здесь.

%%writefile register_model.py
from azureml.core.model import Model, Dataset
from azureml.core.run import Run, _OfflineRun
from azureml.core import Workspace
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--model_name", required=True)
parser.add_argument("--model_path", required=True)
args = parser.parse_args()

print(f"model_name : {args.model_name}")
print(f"model_path: {args.model_path}")

run = Run.get_context()
ws = Workspace.from_config() if type(run) == _OfflineRun else run.experiment.workspace

model = Model.register(workspace=ws,
                       model_path=args.model_path,
                       model_name=args.model_name)

print("Registered version {0} of model {1}".format(model.version, model.name))

Написание кода PythonScriptStep

Предупреждение

Если вы используете пакет SDK Машинное обучение Azure версии 1, а рабочая область настроена для сетевой изоляции (виртуальная сеть), при выполнении этого шага может возникнуть ошибка. Дополнительные сведения см. в статье HyperdriveStep и AutoMLStep сбоем с сетевой изоляцией.

При регистрации модели PythonScriptStep использует PipelineParameter как один из аргументов. Параметры конвейера — это аргументы конвейеров, которые легко можно задать при отправке выполнения. После объявления они передаются как обычные аргументы.


from azureml.pipeline.core.graph import PipelineParameter

# The model name with which to register the trained model in the workspace.
model_name = PipelineParameter("model_name", default_value="TitanicSurvivalInitial")

register_step = PythonScriptStep(script_name="register_model.py",
                                       name="register_model",
                                       allow_reuse=False,
                                       arguments=["--model_name", model_name, "--model_path", model_data],
                                       inputs=[model_data],
                                       compute_target=compute_target,
                                       runconfig=aml_run_config)

Создание и выполнение конвейера автоматизированного машинного обучения

Конвейер, содержащий объект AutoMLStep, создается и выполняется так же, как и обычный конвейер.

from azureml.pipeline.core import Pipeline
from azureml.core import Experiment

pipeline = Pipeline(ws, [dataprep_step, train_step, register_step])

experiment = Experiment(workspace=ws, name='titanic_automl')

run = experiment.submit(pipeline, show_output=True)
run.wait_for_completion()

Приведенный выше код объединяет этапы подготовки данных, автоматизированного машинного обучения и регистрации модели в объект Pipeline. Затем он создает объект Experiment. Конструктор Experiment извлечет указанный эксперимент, если он существует, или создаст его, если нужно. Он отправляет Pipeline в Experiment, создавая объект Run, который выполняет конвейер асинхронно. Функция wait_for_completion() блокируется до завершения выполнения.

Проверка результатов конвейера

Когда run завершится, вы сможете извлечь объекты PipelineData, которым было присвоено значение pipeline_output_name. Вы можете скачать результаты и загрузить их для последующей обработки.

metrics_output_port = run.get_pipeline_output('metrics_output')
model_output_port = run.get_pipeline_output('model_output')

metrics_output_port.download('.', show_progress=True)
model_output_port.download('.', show_progress=True)

Загруженные файлы записываются в подкаталог azureml/{run.id}/. Файл метрик имеет формат JSON и может быть преобразован в кадр данных Pandas для проверки.

Для локальной обработки может потребоваться установить соответствующие пакеты, такие как Pandas, Pickle, пакет SDK Машинное обучение Azure и т. д. В этом примере наилучшая модель, обнаруженная автоматизированным машинным обучением, будет зависеть от XGBoost.

!pip install xgboost==0.90
import pandas as pd
import json

metrics_filename = metrics_output._path_on_datastore
# metrics_filename = path to downloaded file
with open(metrics_filename) as f:
   metrics_output_result = f.read()
   
deserialized_metrics_output = json.loads(metrics_output_result)
df = pd.DataFrame(deserialized_metrics_output)
df

В приведенном выше фрагменте кода показан файл метрик, загруженный из его местонахождения в хранилище данных Azure. Его также можно загрузить из скачанного файла, как показано в комментарии. После того как вы его десериализуете и преобразуете в кадр данных Pandas, вы сможете просмотреть подробные метрики для каждой итерации этапа автоматизированного машинного обучения.

Файл модели можно десериализовать в объект Model, который вы сможете использовать для получения выводов, дополнительного анализа метрик и т. д.

import pickle

model_filename = model_output._path_on_datastore
# model_filename = path to downloaded file

with open(model_filename, "rb" ) as f:
    best_model = pickle.load(f)

# ... inferencing code not shown ...

Дополнительные сведения о загрузке и работе с существующими моделями см. в разделе Использование существующей модели с Машинным обучением Azure.

Загрузка результатов выполнения автоматизированного машинного обучения

Если вы выполнили инструкции из этой статьи, то у вас должен получиться экземпляр объекта run. Однако вы также можете извлечь готовые объекты Run из Workspace с помощью объекта Experiment.

Рабочая область содержит полную запись всех экспериментов и выполнений. С помощью портала вы можете искать и скачивать выходные данные экспериментов или использовать код. Чтобы получить доступ к записям из прошлых выполнений, используйте Машинное обучение Azure для поиска идентификатора интересующего вас выполнения. С помощью этого идентификатора можно выбрать конкретный объект run, задав параметры Workspace и Experiment.

# Retrieved from Azure Machine Learning web UI
run_id = 'aaaaaaaa-bbbb-cccc-dddd-0123456789AB'
experiment = ws.experiments['titanic_automl']
run = next(run for run in ex.get_runs() if run.id == run_id)

Строки в приведенном выше коде нужно будет скорректировать с учетом характеристик вашего прошлого выполнения. В приведенном выше фрагменте кода предполагается, что вы присвоили ws соответствующему объекту Workspace с помощью обычной функции from_config(). Интересующий вас эксперимент извлекается напрямую, а затем код находит соответствующий объект Run, сопоставляя значение run.id.

После получения объекта Run вы можете скачать метрики и модель.

automl_run = next(r for r in run.get_children() if r.name == 'AutoML_Classification')
outputs = automl_run.get_outputs()
metrics = outputs['default_metrics_AutoML_Classification']
model = outputs['default_model_AutoML_Classification']

metrics.get_port_data_reference().download('.')
model.get_port_data_reference().download('.')

Каждый объект Run содержит объекты StepRun, содержащие сведения о выполнении отдельных этапов конвейера. Поиск объекта run выполняется объектом StepRun для AutoMLStep. Метрики и модель извлекаются с использованием имен по умолчанию, которые доступны, даже если не передать объекты PipelineData в параметр outputsAutoMLStep.

Наконец, фактические метрики и модель скачиваются на локальный компьютер, как рассказывается выше в разделе "Анализ результатов конвейера".

Next Steps