Краткое руководство. Начало работы со службой "Машинное обучение Azure"

ОБЛАСТЬ ПРИМЕНЕНИЯ: пакет SDK для Python azure-ai-ml версии 2 (текущая версия)

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

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

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

Ниже приведены шаги, которые вы предстоит выполнить.

  • Настройка дескриптора для рабочей области Машинного обучения Azure
  • Создать сценарий обучения
  • Создание масштабируемого вычислительного ресурса, вычислительного кластера
  • Создайте и запустите командное задание, которое будет выполнять скрипт обучения в вычислительном кластере, настроенном с использованием соответствующей среды задания.
  • Просмотр выходных данных сценария обучения
  • развертывание новой обученной модели в качестве конечной точки;
  • Вызов конечной точки Машинного обучения Azure для вывода

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

  1. Чтобы использовать Машинное обучение Azure, сначала потребуется рабочая область. Если у вас ее нет, заполните раздел Создание ресурсов, необходимых для начала создания рабочей области, и узнайте больше о ее использовании.

  2. Войдите в студию и выберите рабочую область, если она еще не открыта.

  3. Откройте или создайте записную книжку в рабочей области:

    • Создайте записную книжку, если вы хотите скопировать или вставить код в ячейки.
    • Или откройте tutorials/get-started-notebooks/quickstart.ipynb в разделе Примеры студии. Затем выберите Клонировать , чтобы добавить записную книжку в файлы. (См., где найти примеры.)

Настройка ядра

  1. На верхней панели над открытой записной книжкой создайте вычислительный экземпляр, если у вас его еще нет.

    Снимок экрана: создание вычислительного экземпляра.

  2. Если вычислительный экземпляр остановлен, выберите Запустить вычисление и подождите, пока он не будет запущен.

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

  3. Убедитесь, что ядро, найденное в правом верхнем углу, имеет значение Python 3.10 - SDK v2. В противном случае используйте раскрывающийся список, чтобы выбрать это ядро.

    Снимок экрана: настройка ядра.

  4. Если отображается баннер с сообщением о необходимости проверки подлинности, выберите Проверка подлинности.

Важно!

Остальная часть этого руководства содержит ячейки записной книжки. Скопируйте или вставьте их в новую записную книжку или переключитесь на записную книжку, если вы клонировали ее.

Создание дескриптора в рабочей области

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

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

В следующей ячейке введите идентификатор подписки, имя группы ресурсов и имя рабочей области. Вот как найти эти значения:

  1. На панели инструментов в правом верхнем углу Студии машинного обучения Azure выберите имя рабочей области.
  2. Скопируйте значение рабочей области, группы ресурсов и идентификатора подписки в код.
  3. Вам потребуется скопировать одно значение, закрыть область и вставить его, а затем вернуться к следующему.

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

from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

# authenticate
credential = DefaultAzureCredential()

# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id="<SUBSCRIPTION_ID>",
    resource_group_name="<RESOURCE_GROUP>",
    workspace_name="<AML_WORKSPACE_NAME>",
)

Примечание

При создании клиента ML не будет выполняться подключение к рабочей области. Инициализация клиента отложена, он будет ожидать первого вызова (в этой записной книжке это произойдет в ячейке, создающей вычислительный кластер).

Создание сценария обучения

Начнем с создания сценария обучения — файла Python main.py.

Сначала создайте исходную папку для скрипта:

import os

train_src_dir = "./src"
os.makedirs(train_src_dir, exist_ok=True)

Этот скрипт обрабатывает данные предварительно, разбивая их на тестовые и обучающие данные. Затем они используются для обучения модели на основе дерева и возврата выходной модели.

MLFlow будет использоваться для регистрации параметров и метрик во время выполнения конвейера.

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

%%writefile {train_src_dir}/main.py
import os
import argparse
import pandas as pd
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

def main():
    """Main function of the script."""

    # input and output arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("--data", type=str, help="path to input data")
    parser.add_argument("--test_train_ratio", type=float, required=False, default=0.25)
    parser.add_argument("--n_estimators", required=False, default=100, type=int)
    parser.add_argument("--learning_rate", required=False, default=0.1, type=float)
    parser.add_argument("--registered_model_name", type=str, help="model name")
    args = parser.parse_args()
   
    # Start Logging
    mlflow.start_run()

    # enable autologging
    mlflow.sklearn.autolog()

    ###################
    #<prepare the data>
    ###################
    print(" ".join(f"{k}={v}" for k, v in vars(args).items()))

    print("input data:", args.data)
    
    credit_df = pd.read_csv(args.data, header=1, index_col=0)

    mlflow.log_metric("num_samples", credit_df.shape[0])
    mlflow.log_metric("num_features", credit_df.shape[1] - 1)

    train_df, test_df = train_test_split(
        credit_df,
        test_size=args.test_train_ratio,
    )
    ####################
    #</prepare the data>
    ####################

    ##################
    #<train the model>
    ##################
    # Extracting the label column
    y_train = train_df.pop("default payment next month")

    # convert the dataframe values to array
    X_train = train_df.values

    # Extracting the label column
    y_test = test_df.pop("default payment next month")

    # convert the dataframe values to array
    X_test = test_df.values

    print(f"Training with data of shape {X_train.shape}")

    clf = GradientBoostingClassifier(
        n_estimators=args.n_estimators, learning_rate=args.learning_rate
    )
    clf.fit(X_train, y_train)

    y_pred = clf.predict(X_test)

    print(classification_report(y_test, y_pred))
    ###################
    #</train the model>
    ###################

    ##########################
    #<save and register model>
    ##########################
    # Registering the model to the workspace
    print("Registering the model via MLFlow")
    mlflow.sklearn.log_model(
        sk_model=clf,
        registered_model_name=args.registered_model_name,
        artifact_path=args.registered_model_name,
    )

    # Saving the model to a file
    mlflow.sklearn.save_model(
        sk_model=clf,
        path=os.path.join(args.registered_model_name, "trained_model"),
    )
    ###########################
    #</save and register model>
    ###########################
    
    # Stop Logging
    mlflow.end_run()

if __name__ == "__main__":
    main()

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

Возможно, потребуется нажать кнопку Обновить , чтобы увидеть новую папку и скрипт в файлах.

Снимок экрана: значок обновления.

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

Примечание

Чтобы попробовать бессерверные вычисления (предварительная версия), пропустите этот шаг и перейдите к настройке команды.

У вас уже есть вычислительный экземпляр, который используется для запуска записной книжки. Теперь вы добавите второй тип вычислений— вычислительный кластер , который будет использоваться для выполнения задания обучения. Хотя вычислительный экземпляр является компьютером с одним узлом, вычислительный кластер может быть компьютером с одним или несколькими узлами с ОС Linux или Windows или определенной вычислительной структурой, такой как Spark.

Вы подготовите вычислительный кластер Linux. См. полный список по размерам виртуальных машин и ценам на них.

В этом примере требуется только базовый кластер, поэтому вы будете использовать модель Standard_DS3_v2 с 2 ядрами виртуальных ЦП и 7 ГБ ОЗУ.

from azure.ai.ml.entities import AmlCompute

# Name assigned to the compute cluster
cpu_compute_target = "cpu-cluster"

try:
    # let's see if the compute target already exists
    cpu_cluster = ml_client.compute.get(cpu_compute_target)
    print(
        f"You already have a cluster named {cpu_compute_target}, we'll reuse it as is."
    )

except Exception:
    print("Creating a new cpu compute target...")

    # Let's create the Azure Machine Learning compute object with the intended parameters
    # if you run into an out of quota error, change the size to a comparable VM that is available.\
    # Learn more on https://azure.microsoft.com/en-us/pricing/details/machine-learning/.
    cpu_cluster = AmlCompute(
        name=cpu_compute_target,
        # Azure Machine Learning Compute is the on-demand VM service
        type="amlcompute",
        # VM Family
        size="STANDARD_DS3_V2",
        # Minimum running nodes when there is no job running
        min_instances=0,
        # Nodes in cluster
        max_instances=4,
        # How many seconds will the node running after the job termination
        idle_time_before_scale_down=180,
        # Dedicated or LowPriority. The latter is cheaper but there is a chance of job termination
        tier="Dedicated",
    )
    print(
        f"AMLCompute with name {cpu_cluster.name} will be created, with compute size {cpu_cluster.size}"
    )
    # Now, we pass the object to MLClient's create_or_update method
    cpu_cluster = ml_client.compute.begin_create_or_update(cpu_cluster)

Настройка команды

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

Здесь вы создадите входные переменные, чтобы указать входные данные, коэффициент разделения, скорость обучения и имя зарегистрированной модели. Сценарий команды:

  • Используйте вычислительный кластер для выполнения команды.
  • Используйте среду , которая определяет библиотеки программного обеспечения и среды выполнения, необходимые для сценария обучения. Машинное обучение Azure предоставляет множество курируемых или готовых сред, которые полезны для распространенных сценариев обучения и вывода. Здесь вы будете использовать одну из этих сред. В руководстве по обучению модели вы узнаете, как создать настраиваемую среду.
  • В данном случае настройте само действие командной python main.py строки. Входные и выходные данные доступны в команде через ${{ ... }} нотацию .
  • В этом примере мы будем обращаться к данным из файла в Интернете.

Примечание

Чтобы использовать бессерверные вычисления (предварительная версия), удалите compute="cpu-cluster" в этом коде.

from azure.ai.ml import command
from azure.ai.ml import Input

registered_model_name = "credit_defaults_model"

job = command(
    inputs=dict(
        data=Input(
            type="uri_file",
            path="https://azuremlexamples.blob.core.windows.net/datasets/credit_card/default_of_credit_card_clients.csv",
        ),
        test_train_ratio=0.2,
        learning_rate=0.25,
        registered_model_name=registered_model_name,
    ),
    code="./src/",  # location of source code
    command="python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}",
    environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest",
    compute="cpu-cluster", #delete this line to use serverless compute
    display_name="credit_default_prediction",
)

отправить задание.

Пришло время отправить задание для выполнения в Машинном обучении Azure. На этот раз вы будете использовать метод create_or_update в ml_client.

ml_client.create_or_update(job)

Просмотр выходных данных задания и ожидание завершения задания

Просмотрите задание в Студия машинного обучения Azure, щелкнув ссылку в выходных данных предыдущей ячейки.

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

Снимок экрана: страница обзора для задания.

Важно!

Дождитесь завершения состояния задания, прежде чем вернуться к этой записной книжке, чтобы продолжить. Выполнение задания займет от 2 до 3 минут. Это может занять больше времени (до 10 минут), если вычислительный кластер был масштабирован до нуля узлов и настраиваемая среда по-прежнему создается.

Развертывание модели в качестве подключенной конечной точки

Теперь разверните модель машинного обучения в качестве веб-службы в облаке Azure (online endpoint).

Для развертывания службы машинного обучения используется зарегистрированная модель.

Создание подключенной конечной точки

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

import uuid

# Creating a unique name for the endpoint
online_endpoint_name = "credit-endpoint-" + str(uuid.uuid4())[:8]

Создание конечной точки:

# Expect the endpoint creation to take a few minutes
from azure.ai.ml.entities import (
    ManagedOnlineEndpoint,
    ManagedOnlineDeployment,
    Model,
    Environment,
)

# create an online endpoint
endpoint = ManagedOnlineEndpoint(
    name=online_endpoint_name,
    description="this is an online endpoint",
    auth_mode="key",
    tags={
        "training_dataset": "credit_defaults",
        "model_type": "sklearn.GradientBoostingClassifier",
    },
)

endpoint = ml_client.online_endpoints.begin_create_or_update(endpoint).result()

print(f"Endpoint {endpoint.name} provisioning state: {endpoint.provisioning_state}")

Примечание

Ожидается, что создание конечной точки займет несколько минут.

После создания конечной точки ее можно получить, как показано ниже.

endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)

print(
    f'Endpoint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)

Развертывание модели в конечной точке

После создания конечной точки разверните модель с помощью сценария входа. Каждая конечная точка может иметь несколько развертываний. Прямой трафик к этим развертываниям можно указать с помощью правил. Здесь вы создадите одно развертывание, которое обрабатывает 100 % входящего трафика. Мы выбрали произвольное цветовое имя для развертывания, например, синее, зеленое или красное развертывание.

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

# Let's pick the latest version of the model
latest_model_version = max(
    [int(m.version) for m in ml_client.models.list(name=registered_model_name)]
)
print(f'Latest model is version "{latest_model_version}" ')

Разверните последнюю версию модели.

# picking the model to deploy. Here we use the latest version of our registered model
model = ml_client.models.get(name=registered_model_name, version=latest_model_version)

# Expect this deployment to take approximately 6 to 8 minutes.
# create an online deployment.
# if you run into an out of quota error, change the instance_type to a comparable VM that is available.\
# Learn more on https://azure.microsoft.com/en-us/pricing/details/machine-learning/.

blue_deployment = ManagedOnlineDeployment(
    name="blue",
    endpoint_name=online_endpoint_name,
    model=model,
    instance_type="Standard_DS3_v2",
    instance_count=1,
)

blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()

Примечание

Ожидается, что развертывание займет около 6–8 минут.

После завершения развертывания его можно протестировать.

Тестирование с использованием примера запроса

После развертывания модели в конечной точке можно выполнить вывод с ее помощью.

Создайте пример файла запроса в соответствии с ожидаемой архитектурой в методе запуска сценария оценки.

deploy_dir = "./deploy"
os.makedirs(deploy_dir, exist_ok=True)
%%writefile {deploy_dir}/sample-request.json
{
  "input_data": {
    "columns": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],
    "index": [0, 1],
    "data": [
            [20000,2,2,1,24,2,2,-1,-1,-2,-2,3913,3102,689,0,0,0,0,689,0,0,0,0],
            [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 8]
        ]
  }
}
# test the blue deployment with some sample data
ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    request_file="./deploy/sample-request.json",
    deployment_name="blue",
)

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

Если вы не собираетесь использовать конечную точку, удалите ее, чтобы остановить использование ресурса. Перед удалением убедитесь, что другие развертывания не используют эту конечную точку.

Примечание

Ожидается, что полное удаление займет около 20 минут.

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

Остановка вычислительного экземпляра

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

  1. В студии в области навигации слева выберите Вычисления.
  2. На верхней вкладке выберите Вычислительные экземпляры.
  3. Выберите вычислительный экземпляр в списке.
  4. На верхней панели инструментов щелкните Остановить.

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

Важно!

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

Если вы не планируете использовать созданные вами ресурсы, удалите их, чтобы с вас не взималась плата:

  1. На портале Azure выберите Группы ресурсов в левой части окна.

  2. Выберите созданную группу ресурсов из списка.

  3. Выберите Удалить группу ресурсов.

    Снимок экрана с выбранными параметрами для удаления группы ресурсов на портале Azure.

  4. Введите имя группы ресурсов. Теперь щелкните Удалить.

Дальнейшие действия

Теперь, когда у вас есть представление о том, что участвует в обучении и развертывании модели, ознакомьтесь с этим процессом в следующих руководствах:

Учебник Описание
Отправка, доступ к данным и их изучение в Машинном обучении Azure Хранение больших данных в облаке и их извлечение из записных книжек и скриптов
Разработка моделей на облачной рабочей станции Начало создания прототипов и разработки моделей машинного обучения
Обучение модели в Машинном обучении Azure Подробные сведения о обучении модели
Развертывание модели в качестве сетевой конечной точки Подробные сведения о развертывании модели
Создание рабочих конвейеров машинного обучения Разделение полной задачи машинного обучения на многоэтапный рабочий процесс.