Введение в службу машинного обучения Azure

В сентябре 2018 года Microsoft запустила Службу машинного обучения Azure, которая помогает специалистам по обработке данных и инженерам по машинному обучению создавать сквозные конвейеры машинного обучения в Azure, не беспокоясь о разработчиках, стоящих за обучением, тестированием и развертыванием вашей модели. У Azure есть ряд предложений в этой области, таких как Блокноты Azure, Студия машинного обучения Azure и Пакетный искусственный интеллект Azure. Сравнение предложений доступно здесь.

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

  1. Введение в машинное обучение Azure (с этого момента именуемое AML)
  2. Настройка машинного обучения Azure с помощью VS-кода
  3. Использование конвейера AML на примере

Раздел 1: Введение в AML

Чтобы работать с AML, вам необходимо знать следующие концепции:

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

  • Авторизуйтесь на портале Azure.
  • Поиск рабочих областей службы машинного обучения
  • Добавить новую рабочую область

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

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

Модель: это основа любого процесса машинного обучения. AML предоставляет возможность регистрировать (версии) моделей, созданных во время каждого обучающего прогона. Каждая зарегистрированная модель физически хранится в хранилище, предоставленном при создании рабочего пространства. Это позволяет специалистам по машинному обучению тестировать и развертывать различные модели с поддержкой версий без необходимости хранить их локально. Можно зарегистрировать модели, созданные из любой из библиотек машинного обучения (scikit-learn, TensorFlow, PyTorch и т. Д.).

Изображение: образы Docker, содержащие модель и сценарий прогнозирования (оценки), могут быть созданы после тестирования модели. AML предоставляет возможность создавать эти образы и версировать их, аналогично управлению версиями модели. Это позволяет создавать и развертывать несколько образов Docker с разными версиями модели.

Развертывание. Созданные образы Docker можно развернуть с помощью Экземпляров контейнеров Azure. В этом и заключается истинная сила AML. Автоматическое создание конечной точки HTTP с балансировкой нагрузки, не беспокоясь о базовой инфраструктуре или конфигурации развертывания, помогает специалистам-практикам машинного обучения сосредоточиться на обучении и оценке своей модели. AML помогает собирать аналитические данные о приложениях для отслеживания производительности вашего развертывания.

Раздел 2. Настройка машинного обучения Azure с помощью VS-кода

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

Настройка VS-кода. Моя предпочтительная среда IDE для работы с AML - VS-Code (с этого момента называется VSC). Это мотивировано тем фактом, что в VSC доступно расширение Azure, которое обеспечивает беспрепятственное подключение к рабочему пространству AML, помогая нам получить визуальное представление о наших рабочих пространствах, экспериментах, моделях, изображениях и развертываниях.

Чтобы настроить VSC, выполните следующие действия:

  1. Установить VSC
  2. Загрузите расширения Python, Azure, Машинное обучение Azure и Visual Studio Code Tools для AI через торговую площадку в VSC. Включите расширения, и если они настроены правильно, на левой боковой панели появится значок Azure.
  3. Войдите в свою учетную запись Azure через расширение Azure. Вы можете сделать это, обновив расширение Azure. Появится всплывающее окно входа с инструкциями. После входа в систему он покажет вам все ваши рабочие области.

Форк и клонирование репозитория AML. Чтобы быстро начать работу с AML, я создал репозиторий GitHub с примером, который поможет вам быстро обучить и развернуть простую регрессионную модель sklearn. Пожалуйста, перед продолжением создайте вилку и клонируйте репозиторий.

Настройка среды conda: в репозитории доступен файл среды conda (environment.yml). В качестве хорошей практики я Предлагаем создать новую виртуальную среду с помощью conda. Это изолирует ваши зависимости для конвейера AML без нарушения зависимостей для ваших существующих проектов. Чтобы создать новую среду conda со всеми необходимыми пакетами:

conda env create -f environment.yml

Это создаст новую среду conda с именем myenv. Примечание. Вы можете изменить имя среды, отредактировав файл environment.yml. Теперь вы готовы обучить свою первую модель с помощью конвейера AML.

Раздел 3. Использование конвейера AML с примером

Для настройки конвейера в репо предоставляется конфигурационный файл. Давайте рассмотрим каждый раздел в файле конфигурации и соответствующий ему модуль в конвейере.

Часть 1 - Конфигурация рабочего пространства (ws_config):

parameter data_type Azure name
subscription_id string Azure subscription id
resource_group string Azure resource group
workspace_name string Azure machine learning workspace
view raw ws_config.csv hosted with ❤ by GitHub

Чтобы настроить рабочее пространство, создается отдельный файл конфигурации в папке aml_config / config.json. Это можно сделать, введя указанные выше параметры в раздел ws_config файла ml-config.ini и запустив его (Примечание: вы можете запустить это через VSC, но сначала обязательно активируйте среду conda)

(myenv)python generate_wsconfig.py

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

Часть 2 - Обучение (тренировка):

parameter data_type explanation
experiment_name string Name of the experiment to place the current training run under (new experiment is created if no previous experiment with the same name is found)
compute_target_name string Name of VM where training will be done (new compute name is created if no previous compute of the same name is found)
vm_size string Ability to choose from various available VM configurations (e.g. Standard_D5_v2)
data_folder string Name of the folder in the Azure storage is store your training data.
local_directory string Path to the training data's local directory
conda_packages list List of conda packages required to train your model
script string Name of the training script (placed in the current working directory)
model_name string Name of trained model to be registered under in the workspace.
view raw train.csv hosted with ❤ by GitHub

Например, мой файл конфигурации выглядит так:

train.py будет содержать ваш обучающий код, а в репозитории представлен пример обучения простой регрессионной модели sklearn. main_train.py - это драйвер для обучения. Код хорошо прокомментирован и не требует пояснений, но я рассмотрю ключевые части кода.

# Create an experiment
from azureml.core import Experiment
# NOTE: New experiment is created if one with the following name is not found
experiment_name = config['train']['experiment_name']
exp = Experiment(workspace=ws, name=experiment_name)
# Create a target compute - VM
from azureml.core.compute import DsvmCompute
from azureml.core.compute_target import ComputeTargetException
# NOTE: New compute target is created is one with the following name is not found
compute_target_name = config['train']['compute_target_name']
try:
dsvm_compute = DsvmCompute(workspace=ws, name=compute_target_name)
print('found existing:', dsvm_compute.name)
except ComputeTargetException:
print('creating new.')
dsvm_config = DsvmCompute.provisioning_configuration(vm_size= config['train']['vm_size'])
dsvm_compute = DsvmCompute.create(ws, name=compute_target_name, provisioning_configuration=dsvm_config)
dsvm_compute.wait_for_completion(show_output=True)
view raw main_train_1.py hosted with ❤ by GitHub
  • Мы создаем эксперимент с именем, указанным в файле ml-config.ini, и настраиваем виртуальную машину Azure. Новый вычислительный экземпляр с указанной конфигурацией создается, если не существует предыдущего экземпляра с таким же именем.
# get the default datastore and upload data from local folder to VM
ds = ws.get_default_datastore()
print(ds.name, ds.datastore_type, ds.account_name, ds.container_name)
# Upload data to default data storage
data_folder = config['train']['data_folder']
ds.upload(config['train']['local_directory'],target_path=data_folder,overwrite=True)
print ('Finished Uploading Data.')
view raw main_train_2.py hosted with ❤ by GitHub
  • Загрузите данные из локальной папки в хранилище Azure, предоставленное с рабочей областью. Данные загружаются на обучающую виртуальную машину из этого места хранения.
src = ScriptRunConfig(source_directory='./',
script= config['train']['script'],
run_config=conda_run_config,
# pass the datastore reference as a parameter to the training script
arguments=['--data-folder', str(ds.as_download())]
)
run = exp.submit(config=src)
run.wait_for_completion(show_output=True)
view raw main_train_3.py hosted with ❤ by GitHub
  • Отправьте свой обучающий сценарий на обучающую виртуальную машину Azure. Рекомендуется хранить train.py в корневом каталоге проекта.
# Register the model
print('Registering model...')
model = run.register_model(model_name=config['train']['model_name'], model_path='./outputs/ridge_1.pkl')
print('Done registering model.')
view raw main_train_4.py hosted with ❤ by GitHub
  • run - это объект регистратора, который отслеживает производительность модели. Он может регистрировать различные метрики, такие как потери, точность и т. Д. В сценарии train.py объект run уже создан и может использоваться для записи метрик модели.
  • Зарегистрируйте обученную модель, хранящуюся в «./outputs/ridge_1.pkl». Это то же место, где вы храните свою модель в файле train.py.

Теперь вы можете запустить свое обучение, и оно должно дать следующий результат:

(myenv)python main_train.py

Часть 3 - Создать образ Docker (докер):

parameters data_type explanation
model_version int Version of the trained model (can be located via the VSC IDE)
pip_packages list List of pip packages to be installed
conda_packages list List of conda packages to be installed
conda_env_file string Name of the conda env file
path_scoring_script string Path to prediction script [score.py]
docker_image_name string Name of the docker image
view raw docker.csv hosted with ❤ by GitHub

Например, мой файл конфигурации выглядит так:

Скачанную выше модель можно оценить и использовать для создания образа Docker. Сценарий score.py используется для прогнозирования, и его пример представлен в репозитории. create_docker.py - это драйвер для создания образа докера, который хорошо прокомментирован. Я пройдусь по ключевым частям кода.

# Retrive registered model by version and name
from azureml.core.model import Model
regression_models = Model.list(workspace=ws,name=config['train']['model_name'])
for m in regression_models:
if m.version == int(config['docker']['model_version']):
model = m
  • Получите зарегистрированную модель по имени и версии. Вы можете использовать VSC IDE, чтобы найти имя и версию модели и передать их в файл ml-config.ini.
# Create conda environment for docker image
from azureml.core.conda_dependencies import CondaDependencies
# DEFINE CONDA DEPENDENCIES
myenv = CondaDependencies.create(pip_packages=ast.literal_eval(config['docker']['pip_packages']),conda_packages=ast.literal_eval(config['train']['conda_packages']))
myenv.add_pip_package("pynacl==1.2.1")
# CREATE CONDA ENVIRONMENT FILE
with open(config['docker']['conda_env_file'],"w") as f:
f.write(myenv.serialize_to_string())
  • Определите необходимые пакеты pip и conda в файле конфигурации для выполнения прогнозирования на обученной модели.
# Create docker image
from azureml.core.image import Image, ContainerImage
image_config = ContainerImage.image_configuration(runtime= "python",
execution_script=config['docker']['path_scoring_script'],
conda_file=config['docker']['conda_env_file'],
tags = {'area': "diabetes", 'type': "regression"},
description = "test")
image = Image.create(name = config['docker']['docker_image_name'],
# this is the model object
models = [model],
image_config = image_config,
workspace = ws)
image.wait_for_creation(show_output = True)
  • Создайте образ Docker из модели, сценария прогнозирования (score.py) и необходимых зависимостей. Для образа Docker можно добавлять теги.

Теперь вы можете создать образ докера, запустив,

(myenv)python create_docker.py

Теперь вы можете увидеть образ Docker, создаваемый в разделе Images вашей рабочей области в VSC IDE.

Часть 4 - Создание развертывания (развертывание):

parameters data_type explanation
docker_image_version int Version of the docker image created in the previous step (can be found via the VSC IDE)
cpu_cores int Number of CPU cores for the Docker container
memory int Memory for the Docker container
service_name string Deployment service name
view raw deploy.csv hosted with ❤ by GitHub

Например, мой файл конфигурации выглядит так:

Чтобы развернуть созданный выше образ Docker, запустите:

(myenv)python create_deployment.py

Я рассмотрю важные части скрипта create_deployment.py,

for i in Image.list(workspace = ws,image_name=config['docker']['docker_image_name']):
if i.version == int(config['deploy']['docker_image_version']):
image = i
from azureml.core.webservice import AciWebservice
aciconfig = AciWebservice.deploy_configuration(cpu_cores = int(config['deploy']['cpu_cores']),
memory_gb = int(config['deploy']['memory']),
tags = {'area': "diabetes", 'type': "regression"},
description = "test")
from azureml.core.webservice import Webservice
aci_service_name = config['deploy']['service_name']
print(aci_service_name)
aci_service = Webservice.deploy_from_image(deployment_config = aciconfig,
image = image,
name = aci_service_name,
workspace = ws)
aci_service.wait_for_deployment(True)
  • Выберите образ Docker, указав имя и версию. Вы можете использовать VSC IDE, чтобы найти имя и версию модели и передать их в файл ml-config.ini.
  • Создайте развертывание для заданного количества ядер процессора и памяти. Теги могут быть добавлены для развернутой службы.

Результат будет выглядеть примерно так:

После развертывания службы вы можете получить доступ к конечной точке HTTP из файла развертывания properties.json.

Часть 5 - Тестовое развертывание:

Я использую Почтальон для тестирования службы со следующими данными для созданной выше службы регрессии sklearn.

{
 "data": 
 [
    [1,2,3,4,5,6,7,8,9,10], 
    [10,9,8,7,6,5,4,3,2,1]
]
}

Напомним,

  1. Мы рассмотрели основные концепции AML в Разделе 1.
  2. Настройте VS-Code и среду conda для AML в разделе 2
  3. Мы рассмотрели пошаговый пример обучения, развертывания и тестирования простой регрессионной модели sklearn в Разделе 3.

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

Заявление об ограничении ответственности: мнения, представленные в этой статье, принадлежат автору, а не компании EY Ireland.

Для получения дополнительной информации: https://ey.com/gl/en/issues/business-environment/ey-global-innovation