Учебник. Обучение и развертывание модели классификации изображений с помощью примера Jupyter Notebook

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python azureml версии 1

В этом руководстве необходимо обучить модель машинного обучения на удаленных вычислительных ресурсах. Вы будете использовать рабочий процесс обучения и развертывания для Машинного обучения Azure в Jupyter Notebook для Python. Затем можно использовать записную книжку как шаблон для обучения собственной модели машинного обучения со своими данными.

В руководстве показано, как обучить простую модель регрессии для функции логистики с помощью набора данных MNIST и Scikit-learn в Машинном обучении Azure. MNIST — это популярный набор данных, состоящий из 70 000 изображений в оттенках серого. Каждое изображение содержит рукописную цифру размером 28 x 28 пикселей, то есть числа от нуля до девяти. Целью является создание многоклассового классификатора для идентификации цифры, которую отображает данное изображение.

Узнайте, как выполнять следующие действия:

  • Скачайте набор данных и просмотрите данные.
  • Обучите модель классификации изображений и регистрируйте метрики с помощью MLflow.
  • Разверните модель для вывода в режиме реального времени.

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

Запуск записной книжки из рабочей области

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

Клонирование папки записной книжки

Выполните следующие действия по настройке эксперимента и выполните шаги в Студии машинного обучения. Этот объединенный интерфейс включает в себя средства машинного обучения для выполнения сценариев обработки и анализа данных для специалистов по анализу с любым уровнем квалификации.

  1. Войдите в Студию машинного обучения Azure.

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

  3. Выберите Записные книжки слева.

  4. В верхней части экрана перейдите на вкладку Примеры.

  5. Откройте папку SDK версии 1 .

  6. Нажмите кнопку ... справа от папки Учебники, а затем выберите Клонировать.

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

  7. В списке папок отображается каждый пользователь, обращающийся к рабочей области. Выберите свою папку для клонирования папки Учебники.

Открытие клонированной записной книжки

  1. Откройте папку Учебники, которую вы клонировали в разделе Файлы пользователей.

  2. Выберите файл quickstart-azureml-in-10mins.ipynb в папке tutorials/compute-instance-quickstarts/quickstart-azureml-in-10mins.

    Снимок экрана: папка

Установка пакетов

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

  1. Добавьте ячейку кода в верхней части записной книжки. Снимок экрана: добавление ячейки кода для записной книжки.

  2. В ячейку добавьте приведенную ниже команду, а затем выполните ячейку с помощью инструмента Выполнить или с помощью клавиш SHIFT+ВВОД.

    %pip install scikit-learn==0.22.1
    %pip install scipy==1.5.2
    

Может появиться несколько предупреждений об установке. Эти сообщения можно спокойно проигнорировать.

Запустите записную книжку

Это руководство и дополняющий его файл utils.py также доступны на сайте GitHub, если вы хотите использовать их в собственной локальной среде. Если вы не используете вычислительный экземпляр, добавьте %pip install azureml-sdk[notebooks] azureml-opendatasets matplotlib в указанную выше установку.

Важно!

Оставшаяся часть этой статьи содержит то же содержимое, что и записная книжка.

Перейдите в записную книжку Jupyter Notebook, если вы хотите выполнять код во время его просмотра. Чтобы выполнить одну ячейку кода в записной книжке, щелкните эту ячейку и нажмите клавиши SHIFT+ВВОД. Или запустите всю записную книжку, выбрав Запустить все в верхней части панели инструментов.

Импорт данных

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

  • Скачивание набора данных MNIST
  • Отображение некоторых примеров изображений

Вы будете использовать Открытые наборы данных Azure для получения необработанных файлов данных MNIST. Открытые наборы данных Azure — это проверенные общедоступные наборы данных, которые можно использовать для добавления функций конкретных сценариев в решения машинного обучения для создания более эффективных моделей. Каждый набор данных использует соответствующий класс (в данном случае — MNIST) для получения данных различными способами.

import os
from azureml.opendatasets import MNIST

data_folder = os.path.join(os.getcwd(), "/tmp/qs_data")
os.makedirs(data_folder, exist_ok=True)

mnist_file_dataset = MNIST.get_file_dataset()
mnist_file_dataset.download(data_folder, overwrite=True)

Рассмотрим данные

Загрузите сжатые файлы в массивы numpy. Затем с помощью matplotlib постройте график 30 случайных изображений из набора данных с подписями над ними.

Учтите, что на этом шаге требуется функция load_data, которая содержится в файле utils.py. Этот файл находится в той же папке, что и эта записная книжка. Функция load_data выполняет анализ сжатых файлов, преобразовывая их в массивы numpy.

from utils import load_data
import matplotlib.pyplot as plt
import numpy as np
import glob


# note we also shrink the intensity values (X) from 0-255 to 0-1. This helps the model converge faster.
X_train = (
    load_data(
        glob.glob(
            os.path.join(data_folder, "**/train-images-idx3-ubyte.gz"), recursive=True
        )[0],
        False,
    )
    / 255.0
)
X_test = (
    load_data(
        glob.glob(
            os.path.join(data_folder, "**/t10k-images-idx3-ubyte.gz"), recursive=True
        )[0],
        False,
    )
    / 255.0
)
y_train = load_data(
    glob.glob(
        os.path.join(data_folder, "**/train-labels-idx1-ubyte.gz"), recursive=True
    )[0],
    True,
).reshape(-1)
y_test = load_data(
    glob.glob(
        os.path.join(data_folder, "**/t10k-labels-idx1-ubyte.gz"), recursive=True
    )[0],
    True,
).reshape(-1)


# now let's show some randomly chosen images from the traininng set.
count = 0
sample_size = 30
plt.figure(figsize=(16, 6))
for i in np.random.permutation(X_train.shape[0])[:sample_size]:
    count = count + 1
    plt.subplot(1, sample_size, count)
    plt.axhline("")
    plt.axvline("")
    plt.text(x=10, y=-10, s=y_train[i], fontsize=18)
    plt.imshow(X_train[i].reshape(28, 28), cmap=plt.cm.Greys)
plt.show()

Приведенный выше код отображает произвольный набор изображений с их метками, как показано ниже:

Примеры изображений с метками.

Обучайте модель и регистрируйте метрики с помощью MLflow

Модель будет обучена с помощью приведенного ниже кода. Обратите внимание, что для отслеживания метрик и регистрации артефактов модели используется автоматическое ведение журнала MLflow

Для классификации данных вы будете использовать классификатор LogisticRegression из платформы SciKit Learn.

Примечание

Для обучения модели требуется около 2 минут.**

# create the model
import mlflow
import numpy as np
from sklearn.linear_model import LogisticRegression
from azureml.core import Workspace

# connect to your workspace
ws = Workspace.from_config()

# create experiment and start logging to a new run in the experiment
experiment_name = "azure-ml-in10-mins-tutorial"

# set up MLflow to track the metrics
mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())
mlflow.set_experiment(experiment_name)
mlflow.autolog()

# set up the Logistic regression model
reg = 0.5
clf = LogisticRegression(
    C=1.0 / reg, solver="liblinear", multi_class="auto", random_state=42
)

# train the model
with mlflow.start_run() as run:
    clf.fit(X_train, y_train)

Просмотр эксперимента

В меню слева в Студии машинного обучения Azure выберите Задания, а затем выберите свое задание (azure-ml-in10-mins-tutorial). Задание представляет собой совокупность нескольких запусков указанного скрипта или фрагмента кода. Несколько заданий можно сгруппировать в один эксперимент.

Сведения о запуске хранятся в соответствующем задании. Если при отправке задания имя не существует, то при выборе запуска увидите различные вкладки, содержащие метрики, журналы, объяснения и т. д.

Управляйте версиями моделей с помощью реестра моделей

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

# register the model
model_uri = "runs:/{}/model".format(run.info.run_id)
model = mlflow.register_model(model_uri, "sklearn_mnist_model")

Развертывание модели для вывода в режиме реального времени

В этом разделе вы узнаете, как развернуть модель, чтобы приложение могло использовать (выводить) модель через REST.

Создание конфигурации развертывания

Ячейка кода получает курируемую среду, в которой указаны все зависимости, необходимые для размещения модели (например, такие пакеты, как scikit-learn). Кроме того, вы создаете конфигурацию развертывания, в которой указывается объем вычислительных ресурсов, необходимых для размещения модели. В этом случае вычислительная среда будет иметь 1 ЦП и 1 ГБ памяти.

# create environment for the deploy
from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.webservice import AciWebservice

# get a curated environment
env = Environment.get(
    workspace=ws, 
    name="AzureML-sklearn-0.24.1-ubuntu18.04-py37-cpu-inference",
    version=1
)
env.inferencing_stack_version='latest'

# create deployment config i.e. compute resources
aciconfig = AciWebservice.deploy_configuration(
    cpu_cores=1,
    memory_gb=1,
    tags={"data": "MNIST", "method": "sklearn"},
    description="Predict MNIST with sklearn",
)

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

Следующая ячейка кода развертывает модель в экземпляре контейнера Azure.

Примечание

Развертывание занимает около 3 минут.**

%%time
import uuid
from azureml.core.model import InferenceConfig
from azureml.core.environment import Environment
from azureml.core.model import Model

# get the registered model
model = Model(ws, "sklearn_mnist_model")

# create an inference config i.e. the scoring script and environment
inference_config = InferenceConfig(entry_script="score.py", environment=env)

# deploy the service
service_name = "sklearn-mnist-svc-" + str(uuid.uuid4())[:4]
service = Model.deploy(
    workspace=ws,
    name=service_name,
    models=[model],
    inference_config=inference_config,
    deployment_config=aciconfig,
)

service.wait_for_deployment(show_output=True)

Файл скрипта оценки, указанный в приведенном выше коде, можно найти в той же папке, что и эта записная книжка, и он имеет две функции.

  1. Функция init, которая выполняется один раз при запуске службы. В этой функции вы обычно получаете модель из реестра и устанавливаете глобальные переменные
  2. Функция run(data), которая выполняется каждый раз при вызове службы. В этой функции обычно выполняется форматирование входных данных, выполнение прогноза и вывод прогнозируемого результата.

Просмотр конечной точки

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

Тестирование службы модели

Вы можете протестировать модель, отправив необработанный HTTP-запрос для тестирования веб-службы.

# send raw HTTP request to test the web service.
import requests

# send a random row from the test set to score
random_index = np.random.randint(0, len(X_test) - 1)
input_data = '{"data": [' + str(list(X_test[random_index])) + "]}"

headers = {"Content-Type": "application/json"}

resp = requests.post(service.scoring_uri, input_data, headers=headers)

print("POST to url", service.scoring_uri)
print("label:", y_test[random_index])
print("prediction:", resp.text)

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

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

# if you want to keep workspace and only delete endpoint (it will incur cost while running)
service.delete()

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

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

Выполните следующие действия, чтобы удалить рабочую область Машинного обучения Azure и все вычислительные ресурсы.

Важно!

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

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

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

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

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

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

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

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