Обучение моделей TensorFlow в большом масштабе с помощью Машинного обучения Azure

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

Из этой статьи вы узнаете, как выполнять скрипты обучения TensorFlow в большом масштабе с помощью Машинное обучение Azure пакета SDK для Python версии 2.

Пример кода в этой статье обучает модель TensorFlow для классификации рукописных цифр с помощью глубокой нейронной сети (DNN); регистрация модели; и разверните его в интернет-конечную точку.

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

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

Чтобы воспользоваться этой статьей, необходимо:

Вы также можете найти завершенную версию 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()

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

  1. Найдите имя рабочей области в правом верхнем углу панели инструментов Студия машинного обучения Azure.
  2. Выберите имя рабочей области, чтобы отобразить идентификатор группы ресурсов и подписки.
  3. Скопируйте значения для группы ресурсов и идентификатора подписки в код.
# 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.7-ubuntu20.04-py38-cuda11-gpu@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.

Схема с глубокой нейронной сетью с 784 нейронами на входном слое, двумя скрытыми слоями и 10 нейронами на выходном слое.

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

Теперь, когда у вас есть все ресурсы, необходимые для выполнения задания, пришло время создать его с помощью пакета 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_updateml_client.jobs.

ml_client.jobs.create_or_update(job)

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

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

Машинное обучение Azure запускает сценарии обучения, копируя весь исходный каталог. Если у вас есть конфиденциальные данные, которые вы не хотите отправлять, используйте файл .ignore или не включайте их в исходный каталог.

Что происходит во время выполнения задания

По мере выполнения задания он проходит через следующие этапы:

  • Подготовка. Создается образ Docker в соответствии с определенной средой. Образ отправляется в реестр контейнеров рабочей области и кэшируется для последующего выполнения. Журналы также передаются в журнал заданий и можно просматривать для мониторинга хода выполнения. Если указана курированная среда, будет использоваться кэшированный образ, который будет использоваться курированной средой.

  • Масштабирование: кластер пытается увеличить масштаб, если для выполнения выполнения запуска требуется больше узлов, чем сейчас доступно.

  • Выполняется: все скрипты в папке скрипта передаются в целевой объект вычислений, хранилища данных подключены или копируются, а скрипт выполняется. Выходные данные из stdout и папки ./logs передаются в журнал заданий и могут использоваться для мониторинга задания.

Настройка гиперпараметров модели

Теперь, когда вы узнали, как выполнить обучение TensorFlow с помощью пакета SDK, давайте посмотрим, можно ли улучшить точность модели. Вы можете настраивать и оптимизировать гиперпараметры модели с помощью возможностей Машинное обучение Azuresweep.

Чтобы настроить гиперпараметры модели, определите пространство параметров, в котором выполняется поиск во время обучения. Это можно сделать, заменив некоторые параметры (batch_size, , first_layer_neuronssecond_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 см. в следующих статьях.