Обучение моделей TensorFlow в большом масштабе с помощью Машинного обучения Azure
ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python azure-ai-ml версии 2 (current)
Из этой статьи вы узнаете, как выполнять скрипты обучения TensorFlow в большом масштабе с помощью Машинное обучение Azure пакета SDK для Python версии 2.
Пример кода в этой статье обучает модель TensorFlow для классификации рукописных цифр с помощью глубокой нейронной сети (DNN); регистрация модели; и разверните его в интернет-конечную точку.
Независимо от того, разрабатываете ли вы модель TensorFlow с нуля или вы приносите существующую модель в облако, вы можете использовать Машинное обучение Azure для масштабирования заданий обучения с открытым исходным кодом с помощью эластичных облачных вычислительных ресурсов. Вы можете создавать, развертывать, версионировать и отслеживать модели производственного уровня с помощью Машинного обучения Azure.
Необходимые компоненты
Чтобы воспользоваться этой статьей, необходимо:
- Доступ к подписке Azure. Если у вас еще нет учетной записи, создайте бесплатную учетную запись.
- Запустите код в этой статье с помощью Машинное обучение Azure вычислительного экземпляра или собственной записной книжки Jupyter.
- Машинное обучение Azure вычислительный экземпляр — не требуется скачивание или установка
- Выполните инструкции по созданию ресурсов, чтобы приступить к работе, чтобы создать выделенный сервер записной книжки, предварительно загруженный с помощью пакета SDK и примера репозитория.
- В папке глубокого обучения на сервере записных книжек найдите завершенную и развернутую записную книжку, перейдя к этому каталогу: задания python версии 2 > с > одним шагом > tensorflow > train-hyperparameter-tune-deploy-with-tensorflow.> >
- Сервер записной книжки Jupyter
- Машинное обучение Azure вычислительный экземпляр — не требуется скачивание или установка
- Скачайте следующие файлы:
- tf_mnist.py скрипта обучения
- скрипт оценки score.py
- пример файла запроса sample-request.json
Вы также можете найти завершенную версию Jupyter Notebook этого руководства на странице примеров GitHub.
Перед запуском кода в этой статье для создания кластера GPU необходимо запросить увеличение квоты для рабочей области.
Настройка задания
Этот раздел настраивает задание для обучения, загружая необходимые пакеты Python, подключаясь к рабочей области, создавая вычислительный ресурс для выполнения задания команды и создавая среду для запуска задания.
Подключение к рабочей области
Сначала необходимо подключиться к рабочей области Машинное обучение Azure. Рабочая область Машинного обучения Azure — это ресурс верхнего уровня данной службы. Он предоставляет централизованное место для работы со всеми артефактами, создаваемыми при использовании Машинное обучение Azure.
Мы используем DefaultAzureCredential
для получения доступа к рабочей области. Эти учетные данные должны быть способны обрабатывать большинство сценариев проверки подлинности пакета SDK Для Azure.
Если DefaultAzureCredential
вы не работаете, ознакомьтесь azure-identity reference documentation
с дополнительными доступными учетными данными.Set up authentication
# Handle to the workspace
from azure.ai.ml import MLClient
# Authentication package
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
Если вы предпочитаете использовать браузер для входа и проверки подлинности, следует раскомментировать следующий код и использовать его.
# Handle to the workspace
# from azure.ai.ml import MLClient
# Authentication package
# from azure.identity import InteractiveBrowserCredential
# credential = InteractiveBrowserCredential()
Затем получите дескриптор рабочей области, указав идентификатор подписки, имя группы ресурсов и имя рабочей области. Чтобы найти следующие параметры, выполните следующие действия.
- Найдите имя рабочей области в правом верхнем углу панели инструментов Студия машинного обучения 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>",
)
Результатом выполнения этого скрипта является дескриптор рабочей области, используемый для управления другими ресурсами и заданиями.
Примечание.
- Создание
MLClient
не приведет к подключению клиента к рабочей области. Инициализация клиента отложена и ожидает первого вызова. В этой статье это произойдет во время создания вычислений.
Создание вычислительного ресурса
Машинное обучение Azure требуется вычислительный ресурс для запуска задания. Этот ресурс может быть одним или несколькими узлами с ОС Linux или Windows или определенной вычислительной структурой, такой как Spark.
В следующем примере скрипта мы подготавливаем Linux compute cluster
. Вы увидите страницу Azure Machine Learning pricing
полного списка размеров и цен на виртуальные машины. Так как для этого примера требуется кластер GPU, давайте выберите модель STANDARD_NC6 и создадим Машинное обучение Azure вычисления.
from azure.ai.ml.entities import AmlCompute
gpu_compute_target = "gpu-cluster"
try:
# let's see if the compute target already exists
gpu_cluster = ml_client.compute.get(gpu_compute_target)
print(
f"You already have a cluster named {gpu_compute_target}, we'll reuse it as is."
)
except Exception:
print("Creating a new gpu compute target...")
# Let's create the Azure ML compute object with the intended parameters
gpu_cluster = AmlCompute(
# Name assigned to the compute cluster
name="gpu-cluster",
# Azure ML Compute is the on-demand VM service
type="amlcompute",
# VM Family
size="STANDARD_NC6s_v3",
# 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",
)
# Now, we pass the object to MLClient's create_or_update method
gpu_cluster = ml_client.begin_create_or_update(gpu_cluster).result()
print(
f"AMLCompute with name {gpu_cluster.name} is created, the compute size is {gpu_cluster.size}"
)
Создание среды задания
Чтобы запустить задание Машинное обучение Azure, требуется среда. Среда Машинное обучение Azure инкапсулирует зависимости (такие как среда выполнения программного обеспечения и библиотеки), необходимые для запуска скрипта обучения машинного обучения на вычислительном ресурсе. Эта среда похожа на среду Python на локальном компьютере.
Машинное обучение Azure позволяет использовать курированную (или готовую) среду, полезную для распространенных сценариев обучения и вывода, или создать пользовательскую среду с помощью образа Docker или конфигурации Conda.
В этой статье вы повторно используете курированную среду Машинное обучение AzureAzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu
. Последняя версия этой среды используется с помощью директивы @latest
.
curated_env_name = "AzureML-tensorflow-2.12-cuda11@latest"
Настройка и отправка задания обучения
В этом разделе мы начнем с представления данных для обучения. Затем мы рассмотрим, как запустить задание обучения с помощью предоставленного скрипта обучения. Вы узнаете, как создать задание обучения, настроив команду для запуска скрипта обучения. Затем вы отправляете задание обучения для выполнения в Машинное обучение Azure.
Получение обучающих данных
Вы будете использовать данные из базы данных Измененного национального института стандартов и технологий (MNIST) рукописных цифр. Эти данные из веб-сайта Yan LeCun хранятся в учетной записи хранения Azure.
web_path = "wasbs://datasets@azuremlexamples.blob.core.windows.net/mnist/"
Дополнительные сведения о наборе данных MNIST см . на веб-сайте Yan LeCun.
Подготовка скрипта обучения
В этой статье мы предоставили скрипт обучения tf_mnist.py. На практике вы можете использовать любой настраиваемый скрипт обучения как есть и запустить его с помощью Машинное обучение Azure без необходимости изменять код.
Указанный сценарий обучения выполняет следующие действия.
- обрабатывает предварительную обработку данных, разбивая данные на тестовые и обучающие данные;
- обучает модель с помощью данных; и
- возвращает выходную модель.
Во время выполнения конвейера для регистрации параметров и метрик используется MLFlow. Сведения о включении отслеживания MLFlow см. в статье "Отслеживание экспериментов и моделей машинного обучения" с помощью MLflow.
В сценарии tf_mnist.py
обучения мы создадим простую глубокую нейронную сеть (DNN). Этот DNN имеет следующее:
- Входной слой с 28 * 28 = 784 нейронов. Каждый нейрон представляет пиксель изображения.
- Два скрытых слоя. Первый скрытый слой имеет 300 нейронов, а второй скрытый слой имеет 100 нейронов.
- Выходной слой с 10 нейронами. Каждый нейрон представляет целевую метку от 0 до 9.
Создание задания обучения
Теперь, когда у вас есть все ресурсы, необходимые для выполнения задания, пришло время создать его с помощью пакета SDK для Python версии 2 Машинное обучение Azure. В этом примере мы создадим command
.
Машинное обучение Azure command
— это ресурс, который указывает все сведения, необходимые для выполнения кода обучения в облаке. Эти сведения включают входные и выходные данные, тип оборудования для использования, программное обеспечение для установки и запуск кода. Содержит command
сведения для выполнения одной команды.
Настройка команды
Вы используете общую цель command
для запуска скрипта обучения и выполнения нужных задач. Command
Создайте объект, чтобы указать сведения о конфигурации задания обучения.
from azure.ai.ml import command
from azure.ai.ml import UserIdentityConfiguration
from azure.ai.ml import Input
web_path = "wasbs://datasets@azuremlexamples.blob.core.windows.net/mnist/"
job = command(
inputs=dict(
data_folder=Input(type="uri_folder", path=web_path),
batch_size=64,
first_layer_neurons=256,
second_layer_neurons=128,
learning_rate=0.01,
),
compute=gpu_compute_target,
environment=curated_env_name,
code="./src/",
command="python tf_mnist.py --data-folder ${{inputs.data_folder}} --batch-size ${{inputs.batch_size}} --first-layer-neurons ${{inputs.first_layer_neurons}} --second-layer-neurons ${{inputs.second_layer_neurons}} --learning-rate ${{inputs.learning_rate}}",
experiment_name="tf-dnn-image-classify",
display_name="tensorflow-classify-mnist-digit-images-with-dnn",
)
Входные данные для этой команды включают расположение данных, размер пакета, количество нейронов в первом и втором слоях, а также скорость обучения. Обратите внимание, что мы передали веб-путь непосредственно в качестве входных данных.
Для значений параметров:
- укажите вычислительный кластер
gpu_compute_target = "gpu-cluster"
, созданный для выполнения этой команды; - укажите курированную среду
curated_env_name
, объявленную ранее; - настройте само действие командной строки — в данном случае — это
python tf_mnist.py
команда. Доступ к входным и выходным данным в команде можно получить с помощью${{ ... }}
нотации; и - настройте метаданные, такие как отображаемое имя и имя эксперимента; где эксперимент — это контейнер для всех итерации, которые выполняется в определенном проекте. Все задания, отправленные под тем же именем эксперимента, будут перечислены рядом друг с другом в Студия машинного обучения Azure.
- укажите вычислительный кластер
В этом примере вы будете
UserIdentity
использовать команду. Использование удостоверения пользователя означает, что команда будет использовать удостоверение для запуска задания и доступа к данным из большого двоичного объекта.
отправить задание.
Теперь пришло время отправить задание для выполнения в Машинное обучение Azure. На этот раз вы будете использовать create_or_update
ml_client.jobs
.
ml_client.jobs.create_or_update(job)
После завершения задание зарегистрирует модель в рабочей области (в результате обучения) и выводит ссылку для просмотра задания в Студия машинного обучения Azure.
Предупреждение
Машинное обучение Azure запускает сценарии обучения, копируя весь исходный каталог. Если у вас есть конфиденциальные данные, которые вы не хотите отправлять, используйте файл .ignore или не включайте их в исходный каталог.
Что происходит во время выполнения задания
По мере выполнения задания он проходит через следующие этапы:
Подготовка. Создается образ Docker в соответствии с определенной средой. Образ отправляется в реестр контейнеров рабочей области и кэшируется для последующего выполнения. Журналы также передаются в журнал заданий и можно просматривать для мониторинга хода выполнения. Если указана курированная среда, будет использоваться кэшированный образ, который будет использоваться курированной средой.
Масштабирование: кластер пытается увеличить масштаб, если для выполнения выполнения запуска требуется больше узлов, чем сейчас доступно.
Выполняется: все скрипты в папке скрипта передаются в целевой объект вычислений, хранилища данных подключены или копируются, а скрипт выполняется. Выходные данные из stdout и папки ./logs передаются в журнал заданий и могут использоваться для мониторинга задания.
Настройка гиперпараметров модели
Теперь, когда вы узнали, как выполнить обучение TensorFlow с помощью пакета SDK, давайте посмотрим, можно ли улучшить точность модели. Вы можете настраивать и оптимизировать гиперпараметры модели с помощью возможностей Машинное обучение Azuresweep
.
Чтобы настроить гиперпараметры модели, определите пространство параметров, в котором выполняется поиск во время обучения. Это можно сделать, заменив некоторые параметры (batch_size
, , first_layer_neurons
second_layer_neurons
иlearning_rate
) переданы в задание обучения специальными входными данными из azure.ml.sweep
пакета.
from azure.ai.ml.sweep import Choice, LogUniform
# we will reuse the command_job created before. we call it as a function so that we can apply inputs
# we do not apply the 'iris_csv' input again -- we will just use what was already defined earlier
job_for_sweep = job(
batch_size=Choice(values=[32, 64, 128]),
first_layer_neurons=Choice(values=[16, 64, 128, 256, 512]),
second_layer_neurons=Choice(values=[16, 64, 256, 512]),
learning_rate=LogUniform(min_value=-6, max_value=-1),
)
Затем вы настроите очистку в задании команды с помощью некоторых параметров, таких как основная метрика для просмотра и алгоритма выборки для использования.
В следующем коде мы используем случайную выборку, чтобы попробовать различные наборы конфигураций гиперпараметров в попытке максимизировать основную метрику validation_acc
.
Мы также определяем политику раннего завершения —BanditPolicy
Эта политика работает путем проверки задания каждые две итерации. Если основная метрика, validation_acc
выходит за пределы верхнего диапазона 10 процентов, Машинное обучение Azure завершает задание. Это позволяет модели продолжать изучать гиперпараметры, которые не обещают помочь достичь целевой метрики.
from azure.ai.ml.sweep import BanditPolicy
sweep_job = job_for_sweep.sweep(
compute=gpu_compute_target,
sampling_algorithm="random",
primary_metric="validation_acc",
goal="Maximize",
max_total_trials=8,
max_concurrent_trials=4,
early_termination_policy=BanditPolicy(slack_factor=0.1, evaluation_interval=2),
)
Теперь вы можете отправить это задание, как и раньше. На этот раз вы будете выполнять задание очистки, которое переметает задание обучения.
returned_sweep_job = ml_client.create_or_update(sweep_job)
# stream the output and wait until the job is finished
ml_client.jobs.stream(returned_sweep_job.name)
# refresh the latest status of the job after streaming
returned_sweep_job = ml_client.jobs.get(name=returned_sweep_job.name)
Вы можете отслеживать задание с помощью ссылки пользовательского интерфейса студии, представленной во время выполнения задания.
Поиск и регистрация лучшей модели
После завершения всех запусков можно найти запуск, создающий модель с максимальной точностью.
from azure.ai.ml.entities import Model
if returned_sweep_job.status == "Completed":
# First let us get the run which gave us the best result
best_run = returned_sweep_job.properties["best_child_run_id"]
# lets get the model from this run
model = Model(
# the script stores the model as "model"
path="azureml://jobs/{}/outputs/artifacts/paths/outputs/model/".format(
best_run
),
name="run-model-example",
description="Model created from run.",
type="custom_model",
)
else:
print(
"Sweep job status: {}. Please wait until it completes".format(
returned_sweep_job.status
)
)
Затем эту модель можно зарегистрировать.
registered_model = ml_client.models.create_or_update(model=model)
Развертывание модели в качестве подключенной конечной точки
После регистрации модели ее можно развернуть в качестве сетевой конечной точки, то есть в качестве веб-службы в облаке Azure.
Для развертывания службы машинного обучения обычно требуется:
- Ресурсы модели, которые требуется развернуть. К этим ресурсам относятся файл и метаданные модели, которые вы уже зарегистрировали в задании обучения.
- Некоторый код для запуска в качестве службы. Код выполняет модель в заданном входном запросе (скрипт записи). Этот скрипт записи получает данные, отправленные в развернутую веб-службу, и передает его модели. После обработки данных скрипт возвращает клиенту ответ модели. Скрипт зависит от модели и должен понимать данные, ожидаемые и возвращаемые моделью. При использовании модели MLFlow Машинное обучение Azure автоматически создает этот скрипт.
Дополнительные сведения о развертывании см. в статье "Развертывание и оценка модели машинного обучения с управляемой веб-конечной точкой с помощью пакета SDK для Python версии 2".
Создание подключенной конечной точки
В качестве первого шага по развертыванию модели необходимо создать конечную точку в Сети. Имя конечной точки должно быть уникальным в целом регионе Azure. В этой статье вы создадите уникальное имя с помощью универсального уникального идентификатора (UUID).
import uuid
# Creating a unique name for the endpoint
online_endpoint_name = "tff-dnn-endpoint-" + str(uuid.uuid4())[:8]
from azure.ai.ml.entities import (
ManagedOnlineEndpoint,
ManagedOnlineDeployment,
Model,
Environment,
)
# create an online endpoint
endpoint = ManagedOnlineEndpoint(
name=online_endpoint_name,
description="Classify handwritten digits using a deep neural network (DNN) using TensorFlow",
auth_mode="key",
)
endpoint = ml_client.begin_create_or_update(endpoint).result()
print(f"Endpint {endpoint.name} provisioning state: {endpoint.provisioning_state}")
После создания конечной точки его можно получить следующим образом:
endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)
print(
f'Endpint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)
Развертывание модели в конечной точке
После создания конечной точки можно развернуть модель с помощью скрипта записи. Конечная точка может иметь несколько развертываний. С помощью правил конечная точка может направлять трафик к этим развертываниям.
В следующем коде создается одно развертывание, которое обрабатывает 100 % входящего трафика. Для развертывания используется произвольное имя цвета (tff-blue). Вы также можете использовать любое другое имя, например tff-green или tff-red для развертывания. Код для развертывания модели в конечной точке выполняет следующие действия:
- развертывает лучшую версию модели, зарегистрированной ранее;
- оценивает модель, используя
score.py
файл; и - использует ту же курированную среду (которую вы объявили ранее) для выполнения вывода.
model = registered_model
from azure.ai.ml.entities import CodeConfiguration
# create an online deployment.
blue_deployment = ManagedOnlineDeployment(
name="tff-blue",
endpoint_name=online_endpoint_name,
model=model,
code_configuration=CodeConfiguration(code="./src", scoring_script="score.py"),
environment=curated_env_name,
instance_type="Standard_DS3_v2",
instance_count=1,
)
blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()
Примечание.
Ожидается, что это развертывание займет некоторое время.
Тестирование развертывания с помощью примера запроса
После развертывания модели в конечной точке можно спрогнозировать выходные данные развернутой модели с помощью invoke
метода в конечной точке. Чтобы выполнить вывод, используйте пример файла sample-request.json
запроса из папки запроса .
# # predict using the deployed model
result = ml_client.online_endpoints.invoke(
endpoint_name=online_endpoint_name,
request_file="./request/sample-request.json",
deployment_name="tff-blue",
)
Затем можно распечатать возвращаемые прогнозы и отобразить их вместе с входными изображениями. Используйте красный цвет шрифта и инвертированное изображение (белое на черном) для выделения неправильно классифицированных примеров.
# compare actual value vs. the predicted values:
import matplotlib.pyplot as plt
i = 0
plt.figure(figsize=(20, 1))
for s in sample_indices:
plt.subplot(1, n, i + 1)
plt.axhline("")
plt.axvline("")
# use different color for misclassified sample
font_color = "red" if y_test[s] != result[i] else "black"
clr_map = plt.cm.gray if y_test[s] != result[i] else plt.cm.Greys
plt.text(x=10, y=-10, s=result[i], fontsize=18, color=font_color)
plt.imshow(X_test[s].reshape(28, 28), cmap=clr_map)
i = i + 1
plt.show()
Примечание.
Так как точность модели высока, может потребоваться несколько раз запустить ячейку, прежде чем видеть неправильно классифицированный пример.
Очистка ресурсов
Если вы не будете использовать конечную точку, удалите ее, чтобы остановить использование ресурса. Прежде чем удалить его, убедитесь, что другие развертывания не используют конечную точку.
ml_client.online_endpoints.begin_delete(name=online_endpoint_name)
Примечание.
Ожидайте, что эта очистка займет немного времени.
Следующие шаги
В этой статье вы обучили и зарегистрировали модель TensorFlow. Вы также развернули модель в сетевой конечной точке. Подробные сведения о Машинном обучении Azure см. в следующих статьях.