Что собой представляет пакет SDK службы "Машинное обучение Azure"для Python?

Используя пакет Python SDK для службы "Машинное обучение Azure", специалисты по обработке и анализу данных и разработчики ИИ создают и запускают рабочие процессы машинного обучения с помощью службы "Машинное обучение Azure". Вы можете взаимодействовать со службой в любой среде Python, в том числе в Jupyter Notebook, Visual Studio Code или предпочитаемой среде IDE Python.

Основные области применения пакета SDK:

  • Исследование, подготовка и контроль жизненного цикла для наборов данных, используемых в экспериментах машинного обучения.
  • Управление облачными ресурсами для мониторинга, ведения журналов и организации экспериментов машинного обучения.
  • Обучение моделей локально или с помощью облачных ресурсов, включая ускоренное обучение модели с использованием GPU.
  • Использование автоматизированного машинного обучения, которое принимает параметры конфигурации и обучающие данные. Этот механизм автоматически перебирает алгоритмы и гиперпараметры, выбирая оптимальную модель для прогнозирования.
  • Развертывание веб-служб для преобразования обученных моделей в службы RESTful, которые можно использовать в любом приложении.

Пошаговые инструкции по началу работы см. в этом руководстве.

В следующих разделах описано несколько наиболее важных классов из пакета SDK и распространенные конструктивные шаблоны для их использования. Чтобы получить пакет SDK, обратитесь к руководству по установке.

Рабочая область

Пространство имен: azureml.core.workspace.Workspace

Класс Workspace — основной облачный ресурс для экспериментов, обучения и развертывания моделей машинного обучения. Он связывает подписку и группу ресурсов Azure с легко используемым объектом.

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

from azureml.core import Workspace
ws = Workspace.create(name='myworkspace',
                      subscription_id='<azure-subscription-id>',
                      resource_group='myresourcegroup',
                      create_resource_group=True,
                      location='eastus2'
                     )

Чтобы использовать одну рабочую область в нескольких средах, предварительно запишите ее в JSON-файл конфигурации. Это действие позволяет сохранить данные о подписке, ресурсе и имени рабочей области.

ws.write_config(path="./file-path", file_name="ws_config.json")

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

from azureml.core import Workspace
ws_other_environment = Workspace.from_config(path="./file-path/ws_config.json")

Кроме того, можно использовать статический метод get() для загрузки существующей рабочей области без использования файлов конфигурации.

from azureml.core import Workspace
ws = Workspace.get(name="myworkspace", subscription_id='<azure-subscription-id>', resource_group='myresourcegroup')

В следующих примерах кода переменная ws представляет объект Workspace.

Эксперимент

Пространство имен: azureml.core.experiment.Experiment

Класс Experiment представляет следующий базовый облачный ресурс, который состоит из коллекции попыток (отдельных запусков модели). Следующий код позволяет извлечь объект Experiment из Workspace по имени или создать новый объект Experiment, если объекта с нужным именем нет.

from azureml.core.experiment import Experiment
experiment = Experiment(workspace=ws, name='test-experiment')

Выполните следующий код, чтобы получить список всех объектов Experiment, содержащихся в Workspace.

list_experiments = Experiment.list(ws)

Используйте функцию get_runs для получения списка объектов Run (попыток) из Experiment. Следующий код извлекает сведения о запусках и выводит идентификатор каждого из них.

list_runs = experiment.get_runs()
for run in list_runs:
    print(run.id)

Запустить эксперименты можно двумя способами. Если вы выполняете интерактивное экспериментирование в записной книжке Jupyter, используйте функцию start_logging. Если вы отправляете эксперимент из стандартной среды Python, используйте функцию submit. Обе эти функции возвращают объект Run. В следующих примерах кода переменная experiment представляет объект Experiment.

Run (Запустить)

Пространство имен: azureml.core.run.Run

Запуск представляет одну попытку выполнения эксперимента. Объект Run используется для мониторинга асинхронного выполнения попытки, сохранения выходных данных этой попытки, анализа результатов и доступа к созданным артефактам. Run внутри кода эксперимента позволяет сохранять метрики и артефакты в службе журнала выполнения. Он поддерживает следующие функции:

  • хранение и получение метрик и данных;
  • применение тегов и иерархии дочерних элементов для простого поиска выполненных запусков;
  • регистрация сохраненных файлов моделей для развертывания;
  • сохранение, изменение и получение свойств запуска.

Создайте объект Run, отправив объект Experiment с помощью объекта конфигурации запуска. Используйте параметр tags, чтобы присоединить к запускам пользовательские категории и метки. Вы можете легко найти их и получить позже из Experiment.

tags = {"prod": "phase-1-model-tests"}
run = experiment.submit(config=your_config_object, tags=tags)

Используйте статическую функцию list, чтобы получить список всех объектов Run из Experiment. Укажите параметр tags для фильтрации по ранее созданному тегу.

from azureml.core.run import Run
filtered_list_runs = Run.list(experiment, tags=tags)

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

run_details = run.get_details()

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

  • Run ID
  • Состояние
  • время начала и окончания;
  • целевой объект вычислений (локальный или облачный);
  • зависимости и версии, которые использовались при запуске;
  • данные, относящиеся к обучению (различаются в зависимости от типа модели).

Дополнительные примеры настройки и мониторинга запусков см. в этом практическом руководстве.

Модель

Пространство имен: azureml.core.model.Model

Класс Model используется для работы с облачными представлениями моделей машинного обучения. Его методы позволяют передавать модели между локальными средами разработки и объектом Workspace в облаке.

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

В следующем примере показано, как создать простую локальную модель классификации на основе scikit-learn, зарегистрировать эту модель в Workspace и скачать модель из облака.

Создайте простой классификатор clf для прогнозирования оттока клиентов на основе их возраста. Затем сохраните модель в файле .pkl в том же каталоге.

from sklearn import svm
import joblib
import numpy as np

# customer ages
X_train = np.array([50, 17, 35, 23, 28, 40, 31, 29, 19, 62])
X_train = X_train.reshape(-1, 1)
# churn y/n
y_train = ["yes", "no", "no", "no", "yes", "yes", "yes", "no", "no", "yes"]

clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(X_train, y_train)

joblib.dump(value=clf, filename="churn-model.pkl")

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

from azureml.core.model import Model

model = Model.register(workspace=ws, model_path="churn-model.pkl", model_name="churn-model-test")

Теперь, когда модель зарегистрирована в рабочей области, модели можно легко контролировать, скачивать и упорядочивать. Чтобы получить из Workspace объект модели (например, из другой среды), вызовите конструктор класса и укажите имя модели, а также любые необязательные параметры. Затем используйте функцию download, чтобы скачать модель со всей структурой облачных папок.

from azureml.core.model import Model
import os

model = Model(workspace=ws, name="churn-model-test")
model.download(target_dir=os.getcwd())

Используйте функцию delete, чтобы удалить модель из Workspace.

model.delete()

После регистрации модели ее будет просто развернуть в качестве веб-службы. Для этого вам нужно создать и зарегистрировать образ. На этом шаге настраивается среда Python и ее зависимости, а также скрипт для определения форматов запросов и ответов веб-службы. После создания образа нужно создать конфигурацию развертывания, в которой настраиваются такие параметры, как ядра ЦП и объем памяти для целевого объекта вычислений. Затем нужно подключить образ.

ComputeTarget, RunConfiguration и ScriptRunConfig

Пространство имен: azureml.core.compute.ComputeTarget
Пространство имен: azureml.core.runconfig.RunConfiguration
Пространство имен: azureml.core.script_run_config.ScriptRunConfig

Класс ComputeTarget — абстрактный родительский класс для создания целевых объектов вычислений и управления ими. Целевой объект вычислений представляет несколько ресурсов, с помощью которых вы можете обучать модели машинного обучения. Целевой объект вычислений может быть локальным или облачным ресурсом, таким как Вычислительная среда Машинного обучения Azure, Azure HDInsight или удаленная виртуальная машина.

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

В следующем коде показан простой пример настройки целевого объекта AmlCompute (это дочерний класс класса ComputeTarget). Этот целевой объект позволяет создать ресурс удаленной среды вычислений в объекте Workspace. Этот ресурс автоматически масштабируется при отправке задания. После выполнения он автоматически удаляется.

Повторно примените простую модель оттока клиентов scikit-learn и создайте для нее отдельный файл train.py в текущем каталоге. В конце этого файла создайте новый каталог с именем outputs. На этом шаге в облаке создается каталог (ваша рабочая область) для хранения обученной модели, сериализованной joblib.dump().

# train.py

from sklearn import svm
import numpy as np
import joblib
import os

# customer ages
X_train = np.array([50, 17, 35, 23, 28, 40, 31, 29, 19, 62])
X_train = X_train.reshape(-1, 1)
# churn y/n
y_train = ["yes", "no", "no", "no", "yes", "yes", "yes", "no", "no", "yes"]

clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(X_train, y_train)

os.makedirs("outputs", exist_ok=True)
joblib.dump(value=clf, filename="outputs/churn-model.pkl")

Затем создайте целевую платформу вычислений, создав экземпляр объекта RunConfiguration и задав его тип и размер. В нашем примере используется минимальный размер ресурса (1 ядро ЦП, 3,5 ГБ памяти). Переменная list_vms содержит список поддерживаемых виртуальных машин и их размеры.

from azureml.core.runconfig import RunConfiguration
from azureml.core.compute import AmlCompute
list_vms = AmlCompute.supported_vmsizes(workspace=ws)

compute_config = RunConfiguration()
compute_config.target = "amlcompute"
compute_config.amlcompute.vm_size = "STANDARD_D1_V2"

Создайте зависимости для среды Python на удаленном ресурсе вычислений с помощью класса CondaDependencies. Файл train.py использует scikit-learn и numpy, которые необходимо установить в среде. Кроме того, можно указать версии зависимостей. Примените объект dependencies, чтобы настроить среду в compute_config.

from azureml.core.conda_dependencies import CondaDependencies

dependencies = CondaDependencies()
dependencies.add_pip_package("scikit-learn")
dependencies.add_pip_package("numpy==1.15.4")
compute_config.environment.python.conda_dependencies = dependencies

Теперь все готово к отправке эксперимента. Используйте класс ScriptRunConfig, чтобы присоединить конфигурацию целевого объекта вычислений и указать путь (или файл) для скрипта обучения train.py. Отправьте эксперимент, указав параметр config в функции submit(). Вызовите wait_for_completion для результирующего запуска, чтобы просматривать выходные данные асинхронных запусков по мере инициализации среды и обучения модели.

from azureml.core.experiment import Experiment
from azureml.core import ScriptRunConfig

script_run_config = ScriptRunConfig(source_directory=os.getcwd(), script="train.py", run_config=compute_config)
experiment = Experiment(workspace=ws, name="compute_target_test")
run = experiment.submit(config=script_run_config)
run.wait_for_completion(show_output=True)

Когда запуск завершится, в рабочей области появится файл обученной модели churn-model.pkl.

Среда

Пространство имен: azureml.core.environment

Среды Машинного обучения Azure определяют пакеты Python, переменные среды и настройки программного обеспечения, связанные с вашими сценариями обучения и оценок. Помимо Python, для сред можно также настроить PySpark, Docker и R. На внутреннем уровне среды приводят к образам Docker, которые используются для выполнения процессов обучения и оценки на целевом объекте вычислений. Среда представляет собой управляемые и версионные сущности в рабочей области Машинного обучения Azure, которые обеспечивают воспроизводимые и переносимые рабочие процессы машинного обучения, поддерживающие аудит, в различных целевых объектах вычислений и вычислительных типах.

Объект Environment можно использовать для:

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

Следующий код импортирует класс Environment из пакета SDK и создает экземпляр объекта среды.

from azureml.core.environment import Environment
Environment(name="myenv")

Добавьте пакеты в среду с помощью Conda, PIP или частных файлов wheel. Укажите зависимость каждого пакета с помощью класса CondaDependency, чтобы добавить его в PythonSection среды.

Далее пример добавления в среду. С его помощью добавляется версия 1.17.0 numpy. При этом также добавляется пакет pillow в среду myenv. В примере используется метод add_conda_package() и соответственно метод add_pip_package().

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies

myenv = Environment(name="myenv")
conda_dep = CondaDependencies()

# Installs numpy version 1.17.0 conda package
conda_dep.add_conda_package("numpy==1.17.0")

# Installs pillow package
conda_dep.add_pip_package("pillow")

# Adds dependencies to PythonSection of myenv
myenv.python.conda_dependencies=conda_dep

Чтобы запустить выполнение обучения, необходимо объединить среду, целевой объект вычислений, а также скрипт обучения Python в конфигурацию запуска. Эта конфигурация является программой-оболочкой, используемой для отправки запусков.

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

В следующем примере показано, где можно использовать ScriptRunConfig в качестве объекта программы-оболочки.

from azureml.core import ScriptRunConfig, Experiment
from azureml.core.environment import Environment

exp = Experiment(name="myexp", workspace = ws)
# Instantiate environment
myenv = Environment(name="myenv")

# Add training script to run config
runconfig = ScriptRunConfig(source_directory=".", script="train.py")

# Attach compute target to run config
runconfig.run_config.target = "local"

# Attach environment to run config
runconfig.run_config.environment = myenv

# Submit run 
run = exp.submit(runconfig)

Если вы не укажете среду в конфигурации запуска перед выполнением, будет создана среда по умолчанию.

См. раздел Модель развертывания, чтобы получить сведения об использовании сред для развертывания веб-службы.

Конвейер, PythonScriptStep

Пространство имен: azureml.pipeline.core.pipeline.Pipeline
Пространство имен: azureml.pipeline.steps.python_script_step.PythonScriptStep

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

  • подготовка данных, включая импорт, проверку, очистку, изменение, преобразование, нормализацию и промежуточное хранение;
  • настройка обучения, включая параметризацию аргументов, путей, а также конфигураций ведения журналов и отчетности;
  • эффективные и повторяемые процессы обучения и проверки, которые могут включать настройку подмножеств данных и аппаратных вычислительных ресурсов, распределенную обработку и отслеживание хода выполнения;
  • развертывание, включая управление версиями, масштабирование, подготовку и управление доступом;
  • публикация конвейера в конечной точке RESTful для повторного запуска из любой библиотеки HTTP.

PythonScriptStep — это базовый, встроенный шаг для выполнения скрипта Python на целевом объекте вычислений. Этот шаг принимает имя скрипта и другие необязательные параметры, например аргументы для скрипта, целевого объекта вычислений, входных и выходных данных. Ниже приведен простой пример кода для PythonScriptStep. Пример скрипта train.py вы можете найти в подразделе учебника.

from azureml.pipeline.steps import PythonScriptStep

train_step = PythonScriptStep(
    script_name="train.py",
    arguments=["--input", blob_input_data, "--output", output_data1],
    inputs=[blob_input_data],
    outputs=[output_data1],
    compute_target=compute_target,
    source_directory=project_folder
)

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

from azureml.pipeline.core import Pipeline

pipeline = Pipeline(workspace=ws, steps=[train_step])
pipeline_run = experiment.submit(pipeline)

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

Шаблон для создания и использования конвейеров

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

Типичный шаблон для этапов конвейера выглядит так:

  1. Укажите рабочую область, службу вычислений и службу хранилища.
  2. Настройте входные и выходные данные с помощью следующих объектов:
    1. Dataset предоставляет доступ к существующему хранилищу данных Azure;
    2. PipelineDataset инкапсулирует типизированные табличные данные;
    3. PipelineData используется для промежуточных файлов или данных каталога, которые сохраняются на одном шаге и предназначены для использования на другом.
  3. Определите один или несколько шагов конвейера.
  4. Создайте экземпляр конвейера, указав рабочую область и шаги.
  5. Создайте эксперимент для отправки конвейера.
  6. Отслеживайте результаты эксперимента.

Хорошим примером применения этого шаблона будет эта записная книжка. задание

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

AutoMLConfig

Пространство имен: azureml.train.automl.automlconfig.AutoMLConfig

Используйте класс AutoMLConfig для настройки параметров автоматического обучения машинного обучения. В процессе автоматизированного машинного обучения перебирается множество сочетаний алгоритмов и гиперпараметров, , пока не будет найдена лучшая модель на основе выбранной метрики точности. Конфигурация позволяет указать:

  • тип задачи (классификация, регрессия или прогнозирование);
  • число итераций алгоритма и максимальное время для каждой итерации;
  • метрика точности для оптимизации;
  • алгоритмы блокировок и разрешений;
  • число перекрестных проверок;
  • Целевые объекты вычислений
  • Данные для обучения

Примечание

Дополнительно используйте automl в установке, чтобы применить автоматизированное машинное обучение.

Подробные инструкции и примеры настройки экспериментов автоматического машинного обучения см. в этом руководстве и этом практическом пособии.

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

from azureml.train.automl import AutoMLConfig

automl_config = AutoMLConfig(task="classification",
                             X=your_training_features,
                             y=your_training_labels,
                             iterations=30,
                             iteration_timeout_minutes=5,
                             primary_metric="AUC_weighted",
                             n_cross_validations=5
                            )

Используйте объект automl_config, чтобы отправить эксперимент.

from azureml.core.experiment import Experiment

experiment = Experiment(ws, "automl_test_experiment")
run = experiment.submit(config=automl_config, show_output=True)

После отправки эксперимента в выходных данных отображаются сведения о точности обучения для каждой итерации по мере ее завершения. После запуска возвращается объект AutoMLRun (расширение класса Run). Получите модель наилучшего соответствия с помощью функции get_output(), которая возвращает объект Model.

best_model = run.get_output()
y_predict = best_model.predict(X_test)

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

Пространство имен: azureml.core.model.InferenceConfig
Пространство имен: azureml.core.webservice.webservice.Webservice

Класс InferenceConfig предназначен для параметров конфигурации, описывающих среду, необходимую для размещения модели и веб-службы.

Webservice — абстрактный родительский класс для создания и развертывания веб-служб для моделей. Подробные инструкции по подготовке к развертыванию моделей и веб-служб см. в этом практическом руководстве.

Среды можно использовать при развертывании модели в качестве веб-службы. Среды обеспечивают воспроизводимый подключенный рабочий процесс, при котором модель можно развернуть с помощью тех же библиотек, что и в вычислении для обучения, и в выводных вычислениях. На внутреннем уровне среды реализуются как образы Docker. Можно использовать либо образы, предоставляемые корпорацией Майкрософт, либо пользовательские образы Docker. Если вы ранее для развертывания использовали класс ContainerImage, ознакомьтесь с классом DockerSection для выполнения аналогичного рабочего процесса со средами.

Чтобы развернуть веб-службу, объедините среду, вычисление для вывода, скрипт оценки и зарегистрированную модель в объекте развертывания deploy().

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

from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import AciWebservice, Webservice

# Register the model to deploy
model = run.register_model(model_name = "mymodel", model_path = "outputs/model.pkl")

# Combine scoring script & environment in Inference configuration
inference_config = InferenceConfig(entry_script="score.py",
                                   environment=myenv)

# Set deployment configuration
deployment_config = AciWebservice.deploy_configuration(cpu_cores = 1,
                                                       memory_gb = 1)

# Define the model, inference, & deployment configuration and web service name and location to deploy
service = Model.deploy(workspace = ws,
                       name = "my_web_service",
                       models = [model],
                       inference_config = inference_config,
                       deployment_config = deployment_config)

В этом примере создается веб-служба Экземпляров контейнеров Azure, которая лучше всего подходит для небольших тестовых систем и быстрого развертывания. Чтобы развернуть модель как рабочую веб-службу, используйте Службу Azure Kubernetes (AKS). Дополнительные сведения см. в описании класса AksCompute.

Dataset

Пространство имен: azureml.core.dataset.Dataset
Пространство имен: azureml.data.file_dataset.FileDataset
Пространство имен: azureml.data.tabular_dataset.TabularDataset

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

  • TabularDataset представляет в табличном формате данные, созданные путем синтаксического анализа файла или списка файлов.
  • FileDataset ссылается на один или несколько файлов, размещенных в хранилищах данных или по общедоступным URL-адресам.

В следующем примере показано, как создать TabularDataset, указывающий на один путь в хранилище данных.

from azureml.core import Dataset

dataset = Dataset.Tabular.from_delimited_files(path = [(datastore, 'train-dataset/tabular/iris.csv')])
dataset.take(3).to_pandas_dataframe()

В приведенном ниже примере показано, как создать FileDataset, указав URL-адреса нескольких файлов.

from azureml.core.dataset import Dataset

url_paths = [
            'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
            ]
dataset = Dataset.File.from_files(path=url_paths)

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

Попробуйте следующие шаги, чтобы узнать, как использовать пакет SDK службы "Машинное обучение Azure" для Python: