Руководство по Создание конвейеров Машинного обучения Azure для пакетной оценкиTutorial: Build an Azure Machine Learning pipeline for batch scoring

Применимо к: даБазовый выпуск даКорпоративный выпуск                    (Обновление до выпуска "Корпоративный")APPLIES TO: yesBasic edition yesEnterprise edition                    (Upgrade to Enterprise edition)

В рамках этого руководства вы будете использовать конвейер Машинного обучения Azure для выполнения заданий пакетной оценки.In this tutorial, you use a pipeline in Azure Machine Learning to run a batch scoring job. В этой статье для классификации изображений без метки используется Inception-V3, предварительно обученная модель сверточной нейронной сети Tensorflow.The example uses the pretrained Inception-V3 convolutional neural network Tensorflow model to classify unlabeled images. После создания и публикации конвейера необходимо настроить конечную точку REST, позволяющую активировать конвейер с любой библиотеки HTTP на любой платформе.After you build and publish a pipeline, you configure a REST endpoint that you can use to trigger the pipeline from any HTTP library on any platform.

Контейнеры машинного обучения оптимизируют ваш рабочий процесс за счет ускорения, мобильности и повторного использования, позволив вам сосредоточиться непосредственно на задачах обучения, а не на сложностях инфраструктуры.Machine learning pipelines optimize your workflow with speed, portability, and reuse, so you can focus on your expertise - machine learning - instead of on infrastructure and automation. Дополнительные сведения о конвейерах машинного обучения.Learn more about machine learning pipelines.

В этом руководстве выполняются следующие задачи:In this tutorial, you complete the following tasks:

  • Настройка рабочей области и скачивание образцов данных.Configure workspace and download sample data
  • Создание объектов данных для извлечения и вывода данных.Create data objects to fetch and output data
  • Скачивание, подготовка и регистрация модели в рабочей областиDownload, prepare, and register the model in your workspace
  • Подготовка целевых объектов вычислений и создание сценария оценки.Provision compute targets and create a scoring script
  • Создание, запуск и публикация конвейера.Build, run, and publish a pipeline
  • Включение конечной точки REST для конвейера.Enable a REST endpoint for the pipeline

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.If you don’t have an Azure subscription, create a free account before you begin. Опробуйте бесплатную или платную версию Машинного обучения Azure уже сегодня.Try the free or paid version of Azure Machine Learning today.

Предварительные требованияPrerequisites

  • Если у вас еще нет рабочей области Машинного обучения Azure или виртуальной машины записной книжки, выполните инструкции, приведенные в первой части руководства по установке.If you don't already have an Azure Machine Learning workspace or notebook virtual machine, complete Part 1 of the setup tutorial.
  • Завершив установку, используйте тот же сервер записной книжки, чтобы открыть записную книжку tutorials/tutorial-pipeline-batch-scoring-classification.ipynb.When you finish the setup tutorial, use the same notebook server to open the tutorials/tutorial-pipeline-batch-scoring-classification.ipynb notebook.

Если вы хотите открыть руководство по установке в собственной локальной среде, доступ к нему можно получить на GitHub.If you want to run the setup tutorial in your own local environment, you can access the tutorial on GitHub. Выполните команду pip install azureml-sdk[notebooks] azureml-pipeline-core azureml-pipeline-steps pandas requests, чтобы получить необходимые пакеты.Run pip install azureml-sdk[notebooks] azureml-pipeline-core azureml-pipeline-steps pandas requests to get the required packages.

Настройка рабочей области и создание хранилища данныхConfigure workspace and create a datastore

В имеющейся рабочей области Машинного обучения Azure создайте объект.Create a workspace object from the existing Azure Machine Learning workspace.

  • Класс workspace принимает сведения о подписке и ресурсах Azure.A workspace is a class that accepts your Azure subscription and resource information. Он также создает облачный ресурс, который можно использовать для мониторинга и отслеживания работы модели.The workspace also creates a cloud resource you can use to monitor and track your model runs.
  • Workspace.from_config() считывает файл config.json и загружает сведения о проверке подлинности в объект с именем ws.Workspace.from_config() reads the config.json file and then loads the authentication details into an object named ws. Объект ws используется в коде в рамках этого руководства.The ws object is used in the code throughout this tutorial.
from azureml.core import Workspace
ws = Workspace.from_config()

Создание хранилища данных для образцов изображенийCreate a datastore for sample images

В учетной записи pipelinedata извлеките образец общедоступных данных вычисления ImageNet из общедоступного контейнера больших двоичных объектов sampledata.On the pipelinedata account, get the ImageNet evaluation public data sample from the sampledata public blob container. Выполните вызов register_azure_blob_container(), чтобы предоставить рабочей области images_datastore доступ к данным.Call register_azure_blob_container() to make the data available to the workspace under the name images_datastore. Затем задайте хранилище данных рабочей области по умолчанию в качестве выходного.Then, set the workspace default datastore as the output datastore. Используйте выходное хранилище данных для оценки выходных данных в конвейере.Use the output datastore to score output in the pipeline.

from azureml.core.datastore import Datastore

batchscore_blob = Datastore.register_azure_blob_container(ws, 
                      datastore_name="images_datastore", 
                      container_name="sampledata", 
                      account_name="pipelinedata", 
                      overwrite=True)

def_data_store = ws.get_default_datastore()

Создание объектов данныхCreate data objects

При создании конвейера объект DataReference считывает данные из хранилища данных рабочей области.When you build a pipeline, a DataReference object reads data from the workspace datastore. Объект PipelineData передает промежуточные данные между шагами конвейера.A PipelineData object transfers intermediate data between pipeline steps.

Важно!

Пример оценки пакетной службы в этом руководстве использует только один шаг конвейера.The batch scoring example in this tutorial uses only one pipeline step. В вариантах использования с несколькими шагами типичный поток будет включать следующие шаги:In use cases that have multiple steps, the typical flow will include these steps:

  1. Использование объектов DataReference в качестве входных данных для извлечения необработанных данных, выполнение определенных преобразований, а затем вывод объекта PipelineData.Use DataReference objects as inputs to fetch raw data, perform some transformation, and then output a PipelineData object.

  2. Использование выходного объекта PipelineData в предыдущем шаге в качестве входного объекта.Use the PipelineData output object in the preceding step as an input object. Повторение для последующих шагов.Repeat it for subsequent steps.

В этом сценарии создайте объекты DataReference, соответствующие каталогам хранилища данных для входных изображений и меток классификации (значения y-test).In this scenario, you create DataReference objects that correspond to the datastore directories for both the input images and the classification labels (y-test values). Кроме того, создайте объект PipelineData для выходных данных пакетной оценки.You also create a PipelineData object for the batch scoring output data.

from azureml.data.data_reference import DataReference
from azureml.pipeline.core import PipelineData

input_images = DataReference(datastore=batchscore_blob, 
                             data_reference_name="input_images",
                             path_on_datastore="batchscoring/images",
                             mode="download"
                            )

label_dir = DataReference(datastore=batchscore_blob, 
                          data_reference_name="input_labels",
                          path_on_datastore="batchscoring/labels",
                          mode="download"                          
                         )

output_dir = PipelineData(name="scores", 
                          datastore=def_data_store, 
                          output_path_on_compute="batchscoring/results")

Скачивание и регистрация моделиDownload and register the model

Скачайте предварительно обученную модель Tensorflow, чтобы использовать ее для пакетной оценки в конвейере.Download the pretrained Tensorflow model to use it for batch scoring in a pipeline. Сначала создайте локальный каталог, в котором будет храниться модель.First, create a local directory where you store the model. Затем скачайте и извлеките модель.Then, download and extract the model.

import os
import tarfile
import urllib.request

if not os.path.isdir("models"):
    os.mkdir("models")
    
response = urllib.request.urlretrieve("http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz", "model.tar.gz")
tar = tarfile.open("model.tar.gz", "r:gz")
tar.extractall("models")

Выполните регистрацию модели в рабочей области, что позволит быстро извлекать ее в процессе конвейера.Next, register the model to your workspace, so you can easily retrieve the model in the pipeline process. В статической функции register() параметр model_name является ключом, который используется для определения расположения модели в пакете SDK.In the register() static function, the model_name parameter is the key you use to locate your model throughout the SDK.

from azureml.core.model import Model
 
model = Model.register(model_path="models/inception_v3.ckpt",
                       model_name="inception",
                       tags={"pretrained": "inception"},
                       description="Imagenet trained tensorflow inception",
                       workspace=ws)

Создание и вложение удаленного целевого объекта вычисленийCreate and attach the remote compute target

Конвейеры машинного обучения невозможно запустить локально, поэтому их можно запускать в облачных ресурсах или удаленных целевых объектах вычислений.Machine learning pipelines can't be run locally, so you run them on cloud resources or remote compute targets. Удаленный целевой объект вычислений — это повторно используемая виртуальная среда вычислений, в которой выполняются эксперименты и рабочие процессы машинного обучения.A remote compute target is a reusable virtual compute environment where you run experiments and machine learning workflows.

Выполните приведенный ниже код, чтобы создать целевой объект AmlCompute с поддержкой GPU, а затем вложите его в свою рабочую область.Run the following code to create a GPU-enabled AmlCompute target, and then attach it to your workspace. Дополнительные сведения о целевых объектах вычислений см. в тематической статье.For more information about compute targets, see the conceptual article.

from azureml.core.compute import AmlCompute, ComputeTarget
from azureml.exceptions import ComputeTargetException
compute_name = "gpu-cluster"

# checks to see if compute target already exists in workspace, else create it
try:
    compute_target = ComputeTarget(workspace=ws, name=compute_name)
except ComputeTargetException:
    config = AmlCompute.provisioning_configuration(vm_size="STANDARD_NC6",
                                                   vm_priority="lowpriority", 
                                                   min_nodes=0, 
                                                   max_nodes=1)

    compute_target = ComputeTarget.create(workspace=ws, name=compute_name, provisioning_configuration=config)
    compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

Написание сценария оценкиWrite a scoring script

Для оценки необходимо создать скрипт пакетной оценки под названием batch_scoring.py, а затем записать его в текущий каталог.To do the scoring, create a batch scoring script called batch_scoring.py, and then write it to the current directory. Скрипт принимает входные изображения, применяет модель классификации, а затем выводит прогнозы в файл результатов.The script takes input images, applies the classification model, and then outputs the predictions to a results file.

Скрипт batch_scoring.py принимает приведенные ниже параметры, передаваемые из шага конвейера, который вы создадите позже:The batch_scoring.py script takes the following parameters, which are passed from the pipeline step that you create later in this tutorial:

  • --model_name: Имя используемой модели.--model_name: The name of the model being used.
  • --label_dir: Каталог, содержащий файл labels.txt.--label_dir: The directory that holds the labels.txt file.
  • --dataset_path: Каталог, содержащий входные изображения.--dataset_path: The directory that contains the input images.
  • --output_dir: Выходной каталог для файла results-label.txt после того, как скрипт запустит модель по данным.--output_dir: The output directory for the results-label.txt file after the script runs the model on the data.
  • --batch_size: Размер пакета, используемый при запуске модели.--batch_size: The batch size used in running the model.

Инфраструктура конвейеров использует класс ArgumentParser для передачи параметров в шаги конвейера.The pipeline infrastructure uses the ArgumentParser class to pass parameters into pipeline steps. Например, в следующем коде первый аргумент --model_name получает идентификатор свойства model_name.For example, in the following code, the first argument --model_name is given the property identifier model_name. В функции main() для доступа к этому свойству используется Model.get_model_path(args.model_name).In the main() function, Model.get_model_path(args.model_name) is used to access this property.

%%writefile batch_scoring.py

import os
import argparse
import datetime
import time
import tensorflow as tf
from math import ceil
import numpy as np
import shutil
from tensorflow.contrib.slim.python.slim.nets import inception_v3
from azureml.core.model import Model

slim = tf.contrib.slim

parser = argparse.ArgumentParser(description="Start a tensorflow model serving")
parser.add_argument('--model_name', dest="model_name", required=True)
parser.add_argument('--label_dir', dest="label_dir", required=True)
parser.add_argument('--dataset_path', dest="dataset_path", required=True)
parser.add_argument('--output_dir', dest="output_dir", required=True)
parser.add_argument('--batch_size', dest="batch_size", type=int, required=True)

args = parser.parse_args()

image_size = 299
num_channel = 3

# create output directory if it does not exist
os.makedirs(args.output_dir, exist_ok=True)


def get_class_label_dict(label_file):
    label = []
    proto_as_ascii_lines = tf.gfile.GFile(label_file).readlines()
    for l in proto_as_ascii_lines:
        label.append(l.rstrip())
    return label


class DataIterator:
    def __init__(self, data_dir):
        self.file_paths = []
        image_list = os.listdir(data_dir)
        self.file_paths = [data_dir + '/' + file_name.rstrip() for file_name in image_list]
        self.labels = [1 for file_name in self.file_paths]

    @property
    def size(self):
        return len(self.labels)

    def input_pipeline(self, batch_size):
        images_tensor = tf.convert_to_tensor(self.file_paths, dtype=tf.string)
        labels_tensor = tf.convert_to_tensor(self.labels, dtype=tf.int64)
        input_queue = tf.train.slice_input_producer([images_tensor, labels_tensor], shuffle=False)
        labels = input_queue[1]
        images_content = tf.read_file(input_queue[0])

        image_reader = tf.image.decode_jpeg(images_content, channels=num_channel, name="jpeg_reader")
        float_caster = tf.cast(image_reader, tf.float32)
        new_size = tf.constant([image_size, image_size], dtype=tf.int32)
        images = tf.image.resize_images(float_caster, new_size)
        images = tf.divide(tf.subtract(images, [0]), [255])

        image_batch, label_batch = tf.train.batch([images, labels], batch_size=batch_size, capacity=5 * batch_size)
        return image_batch


def main(_):
    label_file_name = os.path.join(args.label_dir, "labels.txt")
    label_dict = get_class_label_dict(label_file_name)
    classes_num = len(label_dict)
    test_feeder = DataIterator(data_dir=args.dataset_path)
    total_size = len(test_feeder.labels)
    count = 0

    # get model from model registry
    model_path = Model.get_model_path(args.model_name)

    with tf.Session() as sess:
        test_images = test_feeder.input_pipeline(batch_size=args.batch_size)
        with slim.arg_scope(inception_v3.inception_v3_arg_scope()):
            input_images = tf.placeholder(tf.float32, [args.batch_size, image_size, image_size, num_channel])
            logits, _ = inception_v3.inception_v3(input_images,
                                                  num_classes=classes_num,
                                                  is_training=False)
            probabilities = tf.argmax(logits, 1)

        sess.run(tf.global_variables_initializer())
        sess.run(tf.local_variables_initializer())
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)
        saver = tf.train.Saver()
        saver.restore(sess, model_path)
        out_filename = os.path.join(args.output_dir, "result-labels.txt")
        with open(out_filename, "w") as result_file:
            i = 0
            while count < total_size and not coord.should_stop():
                test_images_batch = sess.run(test_images)
                file_names_batch = test_feeder.file_paths[i * args.batch_size:
                                                          min(test_feeder.size, (i + 1) * args.batch_size)]
                results = sess.run(probabilities, feed_dict={input_images: test_images_batch})
                new_add = min(args.batch_size, total_size - count)
                count += new_add
                i += 1
                for j in range(new_add):
                    result_file.write(os.path.basename(file_names_batch[j]) + ": " + label_dict[results[j]] + "\n")
                result_file.flush()
            coord.request_stop()
            coord.join(threads)

        shutil.copy(out_filename, "./outputs/")

if __name__ == "__main__":
    tf.app.run()

Совет

Конвейер в этом руководстве содержит только один шаг и записывает выходные данные в файл.The pipeline in this tutorial has only one step, and it writes the output to a file. Для многошаговых конвейеров также используется ArgumentParser, чтобы определить каталог для записи выходных данных для последующего выполнения действий.For multi-step pipelines, you also use ArgumentParser to define a directory to write output data for input to subsequent steps. Пример передачи данных между несколькими шагами конвейера с использованием конструктивного шаблона ArgumentParser см. в записной книжке.For an example of passing data between multiple pipeline steps by using the ArgumentParser design pattern, see the notebook.

Создание и запуск конвейераBuild and run the pipeline

Перед запуском конвейера создайте объект, который определяет среду Python и создает зависимости, необходимые скрипту batch_scoring.py.Before you run the pipeline, create an object that defines the Python environment and creates the dependencies that your batch_scoring.py script requires. Основной зависимостью является Tensorflow, но кроме нее установите azureml-defaults для фоновых процессов из пакета SDK.The main dependency required is Tensorflow, but you also install azureml-defaults from the SDK for background processes. Создайте объект RunConfiguration с помощью зависимостей.Create a RunConfiguration object by using the dependencies. Кроме того, следует указать поддержку Docker и Docker-GPU.Also, specify Docker and Docker-GPU support.

from azureml.core.runconfig import DEFAULT_GPU_IMAGE
from azureml.core.runconfig import CondaDependencies, RunConfiguration

cd = CondaDependencies.create(pip_packages=["tensorflow-gpu==1.13.1", "azureml-defaults"])

amlcompute_run_config = RunConfiguration(conda_dependencies=cd)
amlcompute_run_config.environment.docker.enabled = True
amlcompute_run_config.environment.docker.base_image = DEFAULT_GPU_IMAGE
amlcompute_run_config.environment.spark.precache_packages = False

Параметризация конвейераParameterize the pipeline

Определите пользовательский параметр для конвейера, чтобы управлять размером пакета.Define a custom parameter for the pipeline to control the batch size. Когда конвейер публикуется и предоставляется через конечную точку REST, также предоставляются все настроенные параметры.After the pipeline is published and exposed via a REST endpoint, any configured parameters are also exposed. При повторном запуске конвейера через HTTP-запрос можно указать пользовательские параметры в полезных данных JSON.You can specify custom parameters in the JSON payload when you rerun the pipeline via an HTTP request.

Создайте объект PipelineParameter, чтобы включить это поведение и определить имя и значение по умолчанию.Create a PipelineParameter object to enable this behavior and to define a name and default value.

from azureml.pipeline.core.graph import PipelineParameter
batch_size_param = PipelineParameter(name="param_batch_size", default_value=20)

Создание шага конвейераCreate the pipeline step

Шаг конвейера — это объект, который инкапсулирует все необходимое для запуска конвейера, включая:A pipeline step is an object that encapsulates everything you need to run a pipeline, including:

  • параметры среды и зависимостей;Environment and dependency settings
  • вычислительный ресурс для запуска конвейера;The compute resource to run the pipeline on
  • входные и выходные данные и любые пользовательские параметры;Input and output data, and any custom parameters
  • ссылку на скрипт или логику пакета SDK для запуска во время выполнения шага.Reference to a script or SDK logic to run during the step

Несколько классов наследуют от родительского класса PipelineStep.Multiple classes inherit from the parent class PipelineStep. Для создания шага можно выбрать классы для использования конкретных платформ или стеков.You can choose classes to use specific frameworks or stacks to build a step. В этом примере используется класс PythonScriptStep для определения логики шага с помощью пользовательского скрипта Python.In this example, you use the PythonScriptStep class to define your step logic by using a custom Python script. Если аргумент вашего скрипта является вводом или выводом шага, его необходимо определить в массиве arguments и в параметре input или output соответственно.If an argument to your script is either an input to the step or an output of the step, the argument must be defined both in the arguments array and in either the input or the output parameter, respectively.

Ссылка на объект в массиве outputs становится доступной в качестве входных данных для последующего шага конвейера в сценариях с несколькими шагами.In scenarios where there is more than one step, an object reference in the outputs array becomes available as an input for a subsequent pipeline step.

from azureml.pipeline.steps import PythonScriptStep

batch_score_step = PythonScriptStep(
    name="batch_scoring",
    script_name="batch_scoring.py",
    arguments=["--dataset_path", input_images, 
               "--model_name", "inception",
               "--label_dir", label_dir, 
               "--output_dir", output_dir, 
               "--batch_size", batch_size_param],
    compute_target=compute_target,
    inputs=[input_images, label_dir],
    outputs=[output_dir],
    runconfig=amlcompute_run_config
)

Список всех классов для разных типов шагов см. в этой статье.For a list of all the classes you can use for different step types, see the steps package.

Запуск конвейераRun the pipeline

Теперь запустите конвейер.Now, run the pipeline. Сначала создайте объект Pipeline с помощью ссылки на вашу рабочую область и созданный шаг конвейера.First, create a Pipeline object by using your workspace reference and the pipeline step you created. Параметр steps является массивом шагов.The steps parameter is an array of steps. В этом случае для пакетной оценки выполняется только один шаг.In this case, there's only one step for batch scoring. Чтобы создать конвейеры с несколькими шагами, разместите шаги по порядку в этом массиве.To build pipelines that have multiple steps, place the steps in order in this array.

Затем используйте функцию Experiment.submit(), чтобы передать конвейер для выполнения.Next, use the Experiment.submit() function to submit the pipeline for execution. Кроме того, укажите пользовательский параметр param_batch_size.You also specify the custom parameter param_batch_size. Функция wait_for_completion выводит журналы во время процесса сборки конвейера.The wait_for_completion function outputs logs during the pipeline build process. В журналах можно просмотреть текущий ход выполнения.You can use the logs to see current progress.

Важно!

Первый запуск конвейера занимает примерно 15 минут.The first pipeline run takes roughly 15 minutes. Необходимо скачать все зависимости, создать образ Docker и подготовить и создать среду Python.All dependencies must be downloaded, a Docker image is created, and the Python environment is provisioned and created. Повторный запуск конвейера занимает значительно меньше времени, так как эти ресурсы используются повторно, а не создаются.Running the pipeline again takes significantly less time because those resources are reused instead of created. Однако общее время запуска для конвейера зависит от рабочей нагрузки ваших скриптов и процессов, выполняемых в каждом шаге конвейера.However, total run time for the pipeline depends on the workload of your scripts and the processes that are running in each pipeline step.

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

pipeline = Pipeline(workspace=ws, steps=[batch_score_step])
pipeline_run = Experiment(ws, 'batch_scoring').submit(pipeline, pipeline_parameters={"param_batch_size": 20})
pipeline_run.wait_for_completion(show_output=True)

Скачивание и просмотр выходных данныхDownload and review output

Запустите приведенный ниже код, чтобы скачать выходной файл, созданный из скрипта batch_scoring.py.Run the following code to download the output file that's created from the batch_scoring.py script. Затем изучите результаты оценки.Then, explore the scoring results.

import pandas as pd

step_run = list(pipeline_run.get_children())[0]
step_run.download_file("./outputs/result-labels.txt")

df = pd.read_csv("result-labels.txt", delimiter=":", header=None)
df.columns = ["Filename", "Prediction"]
df.head(10)
Имя файлаFilename ПрогнозированиеPrediction
00 ILSVRC2012_val_00000102.JPEGILSVRC2012_val_00000102.JPEG Родезийский риджбекRhodesian Ridgeback
11 ILSVRC2012_val_00000103.JPEGILSVRC2012_val_00000103.JPEG Штативtripod
22 ILSVRC2012_val_00000104.JPEGILSVRC2012_val_00000104.JPEG Клавиатура пишущего устройстваtypewriter keyboard
33 ILSVRC2012_val_00000105.JPEGILSVRC2012_val_00000105.JPEG Шелковистый терьерsilky terrier
4\.4 ILSVRC2012_val_00000106.JPEGILSVRC2012_val_00000106.JPEG Виндзорский галстукWindsor tie
55 ILSVRC2012_val_00000107.JPEGILSVRC2012_val_00000107.JPEG Сенокосецharvestman
66 ILSVRC2012_val_00000108.JPEGILSVRC2012_val_00000108.JPEG Скрипкаviolin
77 ILSVRC2012_val_00000109.JPEGILSVRC2012_val_00000109.JPEG Громкоговорительloudspeaker
88 ILSVRC2012_val_00000110.JPEGILSVRC2012_val_00000110.JPEG Фартукapron
99 ILSVRC2012_val_00000111.JPEGILSVRC2012_val_00000111.JPEG Американский омарAmerican lobster

Публикация и запуск из конечной точки RESTPublish and run from a REST endpoint

Выполните приведенный ниже код, чтобы опубликовать конвейер в рабочей области.Run the following code to publish the pipeline to your workspace. В своей рабочей области студии машинного обучения Azure вы можете просмотреть метаданные для конвейера, включая журнал выполнения и продолжительность.In your workspace in Azure Machine Learning studio, you can see metadata for the pipeline, including run history and durations. Вы также можете запустить в студии конвейер вручную.You can also run the pipeline manually from the studio.

Публикация конвейера позволяет конечной точке REST повторно запускать конвейер из любой библиотеки HTTP на любой платформе.Publishing the pipeline enables a REST endpoint that you can use to run the pipeline from any HTTP library on any platform.

published_pipeline = pipeline_run.publish_pipeline(
    name="Inception_v3_scoring", description="Batch scoring using Inception v3 model", version="1.0")

published_pipeline

Чтобы запустить конвейер из конечной точки REST, вам потребуется заголовок проверки подлинности типа OAuth2 Bearer.To run the pipeline from the REST endpoint, you need an OAuth2 Bearer-type authentication header. В следующем примере для иллюстрации используется интерактивная проверка подлинности, но для большинства производственных сценариев, требующих автоматической или автономной проверки подлинности, необходимо использовать проверку подлинности субъекта-службы, как описано в этой записной книжке.The following example uses interactive authentication (for illustration purposes), but for most production scenarios that require automated or headless authentication, use service principal authentication as described in this notebook.

Проверка подлинности субъекта-службы включает в себя создание регистрации приложения в Azure Active Directory.Service principal authentication involves creating an App Registration in Azure Active Directory. Сначала необходимо создать секрет клиента, а затем предоставить субъекту-службе доступ роли к вашей рабочей области машинного обучения.First, you generate a client secret, and then you grant your service principal role access to your machine learning workspace. Используйте класс ServicePrincipalAuthentication для управления потоком проверки подлинности.Use the ServicePrincipalAuthentication class to manage your authentication flow.

InteractiveLoginAuthentication и ServicePrincipalAuthentication наследуются от AbstractAuthentication.Both InteractiveLoginAuthentication and ServicePrincipalAuthentication inherit from AbstractAuthentication. В обоих случаях используйте функцию get_authentication_header() для извлечения заголовка:In both cases, use the get_authentication_header() function in the same way to fetch the header:

from azureml.core.authentication import InteractiveLoginAuthentication

interactive_auth = InteractiveLoginAuthentication()
auth_header = interactive_auth.get_authentication_header()

Получите URL-адрес REST из свойства endpoint объекта опубликованного конвейера.Get the REST URL from the endpoint property of the published pipeline object. Кроме того, URL-адрес REST можно найти в рабочей области в студии машинного обучения Azure.You can also find the REST URL in your workspace in Azure Machine Learning studio.

Создайте запрос HTTP POST к конечной точке.Build an HTTP POST request to the endpoint. Укажите заголовок проверки подлинности в запросе.Specify your authentication header in the request. Добавьте объект полезных данных JSON с именем эксперимента и параметром размера пакета.Add a JSON payload object that has the experiment name and the batch size parameter. Как уже говорилось ранее в руководстве, param_batch_size передается в ваш скрипт batch_scoring.py, потому что вы определили его как объект PipelineParameter в конфигурации шага.As noted earlier in the tutorial, param_batch_size is passed through to your batch_scoring.py script because you defined it as a PipelineParameter object in the step configuration.

Выполните запрос на активацию запуска.Make the request to trigger the run. Включите код для доступа к ключу Id из словаря ответов, чтобы получить значение идентификатора запуска.Include code to access the Id key from the response dictionary to get the value of the run ID.

import requests

rest_endpoint = published_pipeline.endpoint
response = requests.post(rest_endpoint, 
                         headers=auth_header, 
                         json={"ExperimentName": "batch_scoring",
                               "ParameterAssignments": {"param_batch_size": 50}})
run_id = response.json()["Id"]

Используйте его для отслеживания состояния нового запуска.Use the run ID to monitor the status of the new run. Для завершения нового запуска требуется еще 10–15 минут.The new run takes another 10-15 min to finish.

Новый запуск будет выглядеть аналогично конвейеру, который вы запустили ранее в этом руководстве.The new run will look similar to the pipeline you ran earlier in the tutorial. Вы можете не просматривать все выходные данные.You can choose not to view the full output.

from azureml.pipeline.core.run import PipelineRun
from azureml.widgets import RunDetails

published_pipeline_run = PipelineRun(ws.experiments["batch_scoring"], run_id)
RunDetails(published_pipeline_run).show()

Очистка ресурсовClean up resources

Не выполняйте инструкции из этого раздела, если вы собираетесь изучать другие руководства по Машинному обучению Azure.Don't complete this section if you plan to run other Azure Machine Learning tutorials.

Остановка работы виртуальной машины для записных книжекStop the Notebook VM

Если вы использовали вычислительный экземпляр или виртуальную машину для записных книжек, завершите работу неиспользуемой виртуальной машины, чтобы сократить расходы.If you used a compute instance or Notebook VM, stop the VM when you are not using it to reduce cost.

  1. В своей рабочей области выберите Вычисление.In your workspace, select Compute.

  2. Выберите пользователя из списка.From the list, select the VM.

  3. Выберите Остановить.Select Stop.

  4. Когда вам снова понадобится использовать сервер, выберите Запустить.When you're ready to use the server again, select Start.

Удаление всех ресурсовDelete everything

Если вы не планируете использовать созданные ресурсы, удалите их, чтобы с вас не взималась плата.If you don't plan to use the resources you created, delete them, so you don't incur any charges:

  1. На портале Azure в меню слева выберите Группы ресурсов.In the Azure portal, in the left menu, select Resource groups.
  2. В списке групп ресурсов выберите созданную группу ресурсов.In the list of resource groups, select the resource group you created.
  3. Выберите Удалить группу ресурсов.Select Delete resource group.
  4. Введите имя группы ресурсов.Enter the resource group name. Затем нажмите кнопку Удалить.Then, select Delete.

Вы также можете сохранить группу ресурсов, но удалить одну рабочую область.You can also keep the resource group but delete a single workspace. Отобразите свойства рабочей области и нажмите кнопку Удалить.Display the workspace properties, and then select Delete.

Дополнительная информацияNext steps

Изучив это руководство о конвейерах машинного обучения, вы выполнили следующие задачи:In this machine learning pipelines tutorial, you did the following tasks:

  • Создание конвейера с зависимостями среды для запуска в удаленном ресурсе вычислений GPU.Built a pipeline with environment dependencies to run on a remote GPU compute resource.
  • Создание скрипта оценки для выполнения пакетных прогнозирований с помощью предварительно обученной модели Tensorflow.Created a scoring script to run batch predictions by using a pretrained Tensorflow model.
  • Публикация конвейера и его включение для запуска с конечной точки REST.Published a pipeline and enabled it to be run from a REST endpoint.

Дополнительные примеры создания конвейеров с помощью пакета SDK для машинного обучения см. в репозитории записных книжек.For more examples of how to build pipelines by using the machine learning SDK, see the notebook repository.