Руководство. Машинное обучение Azure за один день
ОБЛАСТЬ ПРИМЕНЕНИЯ: пакет SDK для Python azure-ai-ml версии 2 (текущая версия)
Узнайте, как специалист по обработке и анализу данных использует Машинное обучение Azure для обучения модели, а затем использовать модель для прогнозирования. Это руководство поможет вам ознакомиться с основными понятиями Машинного обучения Azure и их наиболее распространенным использованием.
Вы узнаете, как отправить задание команды для выполнения скрипта обучения в указанном вычислительном ресурсе, настроенном с помощью среды задания , необходимой для выполнения скрипта.
Скрипт обучения обрабатывает подготовку данных, а затем обучает и регистрирует модель. Получив модель, вы развернете ее в качестве конечной точки, а затем вызовите конечную точку для вывода.
Ниже приведены шаги, которые вы предстоит выполнить.
- Подключение к рабочей области Машинного обучения Azure
- Создание вычислительного ресурса и среды заданий
- Создать сценарий обучения
- Создайте и запустите командное задание для запуска сценария обучения в вычислительном ресурсе, настроенном с использованием соответствующей среды задания.
- Просмотр выходных данных сценария обучения
- развертывание новой обученной модели в качестве конечной точки;
- Вызов конечной точки Машинного обучения Azure для вывода
Предварительные требования
Чтобы выполнить Краткое руководство. Начало работы со службой Машинного обучения Azure, необходимо:
- Создайте рабочую область.
- Создать облачный вычислительный экземпляр для использования в среде разработки.
Создайте новую записную книжку или скопируйте ее.
- Выполните инструкции из краткого руководства. Запуск записной книжки Juypter в Студия машинного обучения Azure инструкции по созданию записной книжки.
- Или выполните действия из краткого руководства, чтобы клонировать папку tutorials версии 2, а затем откройте записную книжку из папки tutorials/azureml-in-a-day/azureml-in-a-day.ipynb в разделе Файл .
Выполнение записной книжки
На верхней панели выберите вычислительный экземпляр, созданный в рамках учебника Краткое руководство. Начало работы со службой машинного обучения Azure, чтобы использовать его для запуска записной книжки.
Убедитесь, что ядро, найденное в правом верхнем углу, имеет значение
Python 3.10 - SDK v2
. В противном случае используйте раскрывающийся список, чтобы выбрать это ядро.
Важно!
Остальная часть этого руководства содержит ячейки записной книжки. Скопируйте или вставьте их в новую записную книжку или переключитесь на записную книжку, если вы клонировали ее.
Чтобы выполнить одну ячейку кода в записной книжке, щелкните эту ячейку и нажмите клавиши SHIFT+ВВОД. Или запустите всю записную книжку, выбрав Запустить все в верхней части панели инструментов.
Подключение к рабочей области
Перед изучением кода необходимо подключиться к рабочей области Машинного обучения Azure. Рабочая область — это ресурс верхнего уровня для Машинного обучения Azure, который обеспечивает централизованное расположение для работы со всеми артефактами, созданными в Машинном обучении Azure.
Мы используем DefaultAzureCredential
для получения доступа к рабочей области.
DefaultAzureCredential
используется для обработки большинства сценариев проверки подлинности пакета Azure SDK.
# Handle to the workspace
from azure.ai.ml import MLClient
# Authentication package
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
В следующей ячейке введите идентификатор подписки, имя группы ресурсов и имя рабочей области. Вот как найти эти значения:
- На панели инструментов в правом верхнем углу Студии машинного обучения Azure выберите имя рабочей области.
- Скопируйте значение рабочей области, группы ресурсов и идентификатора подписки в код.
- Вам потребуется скопировать одно значение, закрыть область и вставить его, а затем вернуться к следующему.
# 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 не будет выполняться подключение к рабочей области. Инициализация клиента отложена, он будет ожидать первого вызова (в записной книжке ниже это произойдет во время создания вычислительных ресурсов).
Создание вычислительного ресурса для выполнения задания
Для выполнения задания потребуется вычислительный ресурс. Это могут быть компьютеры с одним или несколькими узлами с ОС Linux или Windows или определенная структура вычислений, например Spark.
Вы подготовите вычислительный кластер Linux. См. полный список по размерам виртуальных машин и ценам на них.
В этом примере требуется только базовый кластер, поэтому вы будете использовать модель Standard_DS3_v2 с 2 ядрами виртуальных ЦП, 7 ГБ ОЗУ и создадим вычислительную среду Машинного обучения Azure.
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 ML compute object with the intended parameters
cpu_cluster = AmlCompute(
name=cpu_compute_target,
# Azure ML 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 на локальном компьютере.
Машинное обучение Azure предоставляет множество курируемых или готовых сред, которые полезны для распространенных сценариев обучения и вывода. Вы также можете создать собственные пользовательские среды с помощью образа Docker или конфигурации Conda.
В этом примере вы создадите настраиваемую среду conda для заданий с помощью файла YAML conda.
Сначала создайте каталог для хранения файла.
import os
dependencies_dir = "./dependencies"
os.makedirs(dependencies_dir, exist_ok=True)
Затем создайте файл в каталоге зависимостей. В приведенной ниже ячейке используется магическая команда IPython для записи файла в только что созданный каталог.
%%writefile {dependencies_dir}/conda.yml
name: model-env
channels:
- conda-forge
dependencies:
- python=3.8
- numpy=1.21.2
- pip=21.2.4
- scikit-learn=0.24.2
- scipy=1.7.1
- pandas>=1.1,<1.2
- pip:
- inference-schema[numpy-support]==1.3.0
- xlrd==2.0.1
- mlflow== 1.26.1
- azureml-mlflow==1.42.0
- psutil>=5.8,<5.9
- tqdm>=4.59,<4.60
- ipykernel~=6.0
- matplotlib
Спецификация содержит некоторые обычные пакеты, которые будут использоваться в задании (numpy, pip).
Укажите этот файл YAML , чтобы создать и зарегистрировать эту настраиваемую среду в рабочей области:
from azure.ai.ml.entities import Environment
custom_env_name = "aml-scikit-learn"
pipeline_job_env = Environment(
name=custom_env_name,
description="Custom environment for Credit Card Defaults pipeline",
tags={"scikit-learn": "0.24.2"},
conda_file=os.path.join(dependencies_dir, "conda.yml"),
image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest",
)
pipeline_job_env = ml_client.environments.create_or_update(pipeline_job_env)
print(
f"Environment with name {pipeline_job_env.name} is registered to workspace, the environment version is {pipeline_job_env.version}"
)
Что такое задание команды?
Вы создадите задание команды Машинного обучения Azure, чтобы обучить модель прогнозированию по умолчанию. Задание команды используется для запуска сценария обучения в указанной среде на указанном вычислительном ресурсе. Вы уже создали среду и вычислительный ресурс. Далее вы создадите скрипт обучения.
Скрипт обучения обрабатывает подготовку, обучение и регистрацию обученной модели. В этом руководстве вы создадите скрипт обучения Python.
Командные задания можно выполнять из интерфейса командной строки, пакета SDK для Python или из интерфейса студии. В этом руководстве вы будете использовать пакет SDK Python версии 2 для Машинного обучения Azure для создания и выполнения задания команды.
После выполнения задания обучения вы развернете модель, а затем используйте ее для создания прогноза.
Создание сценария обучения
Начнем с создания сценария обучения — main.py файла Python.
Сначала создайте исходную папку для скрипта:
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_excel(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()
Как видно из этого скрипта, после обучения модели файл модели сохраняется и регистрируется в рабочей области. Теперь вы можете использовать зарегистрированную модель в конечных точках вывода.
Настройка команды
Теперь, когда у вас есть скрипт, который может выполнять нужные задачи, вы будете использовать команду общего назначения, которая может выполнять действия командной строки. Это действие командной строки может быть прямым вызовом системных команд или путем выполнения скрипта.
Здесь вы создадите входные переменные, чтобы указать входные данные, коэффициент разделения, скорость обучения и имя зарегистрированной модели. Сценарий команды:
- Для выполнения этой команды используйте вычислительные ресурсы, созданные ранее.
- Используйте среду, созданную ранее. Вы можете использовать
@latest
нотацию, чтобы указать последнюю версию среды при выполнении команды. - Настройте некоторые метаданные, такие как отображаемое имя, имя эксперимента и т. д. Эксперимент — это контейнер для всех итераций, которые вы выполняете в определенном проекте. Все задания, отправленные с одинаковым именем эксперимента, будут перечислены рядом друг с другом в Студия машинного обучения Azure.
- В данном случае настройте само действие командной
python main.py
строки. Входные и выходные данные доступны в команде через${{ ... }}
нотацию .
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://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls",
),
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="aml-scikit-learn@latest",
compute="cpu-cluster",
experiment_name="train_model_credit_default_prediction",
display_name="credit_default_prediction",
)
отправить задание.
Пришло время отправить задание для выполнения в Машинном обучении Azure. На этот раз вы будете использовать метод create_or_update
в ml_client.jobs
.
ml_client.create_or_update(job)
Просмотр выходных данных задания и ожидание завершения задания
Просмотрите задание в Студия машинного обучения Azure, щелкнув ссылку в выходных данных предыдущей ячейки.
Выходные данные этого задания будут выглядеть следующим образом в Студия машинного обучения Azure. Изучите вкладки для получения различных сведений, таких как метрики, выходные данные и т. д. После завершения задание зарегистрирует модель в рабочей области в результате обучения.
Важно!
Дождитесь завершения состояния задания, прежде чем вернуться к этой записной книжке, чтобы продолжить. Выполнение задания займет от 2 до 3 минут. Это может занять больше времени (до 10 минут), если вычислительный кластер был масштабирован до нуля узлов и настраиваемая среда по-прежнему создается.
Развертывание модели в качестве подключенной конечной точки
Теперь разверните модель машинного обучения в качестве веб-службы в облаке Azure (online endpoint
).
Для развертывания службы машинного обучения обычно требуется следующее:
- Ресурсы модели (файл, метаданные), которые требуется развернуть. Вы уже зарегистрировали эти ресурсы в задании обучения.
- Некоторый код для запуска в качестве службы. Код выполняет модель в заданном входном запросе. Этот сценарий записи получает данные, отправленные в развернутую веб-службу, и передает их в модель, а затем возвращает ответ модели клиенту. Этот скрипт относится только к вашей модели. Начальный сценарий оптимизирован для работы с данными, которые получает и возвращает модель. При использовании модели MLFlow, как в этом руководстве, этот скрипт создается автоматически. Примеры скриптов оценки можно найти здесь.
Создание подключенной конечной точки
Теперь когда у вас есть зарегистрированная модель и сценарий вывода, пора создать подключенную конечную точку. Имя конечной точки должно быть уникальным в пределах всего региона Azure. В этом руководстве вы создадите уникальное имя с помощью UUID
.
import uuid
# Creating a unique name for the endpoint
online_endpoint_name = "credit-endpoint-" + str(uuid.uuid4())[:8]
Примечание
Ожидается, что создание конечной точки займет от 6 до 8 минут.
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)]
)
Разверните последнюю версию модели.
Примечание
Ожидается, что развертывание займет около 6–8 минут.
# 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)
# create an online deployment.
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()
Тестирование с использованием примера запроса
Теперь когда модель развернута в конечной точке, можно выполнить вывод с помощью этой модели.
Создайте пример файла запроса в соответствии с ожидаемой архитектурой в методе запуска сценария оценки.
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",
)
Очистка ресурсов
Если вы не собираетесь использовать конечную точку, удалите ее, чтобы остановить использование ресурса. Перед удалением убедитесь, что другие развертывания не используют эту конечную точку.
Примечание
На выполнение этого шага потребуется около 6–8 минут.
ml_client.online_endpoints.begin_delete(name=online_endpoint_name)
Удаление всех ресурсов
Выполните следующие действия, чтобы удалить рабочую область Машинного обучения Azure и все вычислительные ресурсы.
Важно!
Созданные вами ресурсы могут использоваться в качестве необходимых компонентов при работе с другими руководствами по Машинному обучению Azure.
Если вы не планируете использовать созданные вами ресурсы, удалите их, чтобы с вас не взималась плата:
На портале Azure выберите Группы ресурсов в левой части окна.
Выберите созданную группу ресурсов из списка.
Выберите Удалить группу ресурсов.
Введите имя группы ресурсов. Теперь щелкните Удалить.
Дальнейшие действия
- Преобразуйте этот учебник в готовый к работе конвейер с многократно используемыми компонентами.
- Узнайте обо всех вариантах развертывания для Машинного обучения Azure.
- Узнайте, как выполнить проверку подлинности в развернутой модели.