Неделю назад Я написал в блоге сообщение об обучении модели глубокого обучения в облаке с использованием графического процессора. Я показал, как добиться этого с помощью служб машинного обучения Azure (с этого момента AML), используя всего 3 строки кода + некоторый импорт. Однако узнать, что это за 3 строки кода, - непростая задача.

Если вы сторонник AML, встаньте в очередь на свое чудо, потому что вы скоро узнаете, как работает эта технология, и напишите свои собственные 3 строки кода. Сообщение получилось длинноватым, но я обещаю рассказать обо всех деталях.

Об этой серии

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

  • Часть 1. Обучите тренера в облаке с помощью AML. Я покажу вам, как создать скрипт run.py, чтобы начать обучение ваших моделей в облаке с помощью пары строк кода и без изменений. единственная строчка вашего тренировочного распорядка. ← этот пост!
  • Часть 2: Повышение интеллекта вашего тренера для борьбы с отмыванием денег. Я покажу вам здесь, как вы можете изменить свой сценарий тренировки с некоторыми специфическими строками кода AML, чтобы обеспечить отладку, отслеживание, мониторинг и управление выходными данными. Если вы знакомы с MLFlow, то найдете эти возможности немного похожими. [Ссылка]
  • Часть 3: Продвижение вашей модели в производство. Я покажу вам, как вы можете создать свою модель с помощью AML, чтобы сделать ее готовой для использования конечными пользователями, использующими веб-службы. [Ссылка]

Перед тем, как вы начнете: в текущей версии AML в Python используется принцип сначала код, что означает, что весь процесс управляется с использованием этого языка. Его можно запустить из записной книжки или из IDE по вашему выбору. Возьмите IDE Python по вашему выбору и идентификатор подписки Azure и продолжайте читать. Если у вас еще нет подписки Azure, вы можете получить бесплатную здесь с кредитами в 200 долларов США.

Чтобы установить библиотеки AML, вам необходимо:

pip install azureml-sdk[notebooks]

[Январь 2019] Если вы столкнулись с ошибкой «Невозможно удалить PyYAML», то есть способ решения этой проблемы:

pip install azure-cli-core==2.0.54
pip install azureml-sdk[notebooks] --ignore-installed

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

Рабочее пространство

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

import azureml.core
from azureml.core.workspace import Workspace
ws = Workspace.create(
     name = workspace_name,
     subscription_id = subscription_id,
     resource_group = resource_group,
     location = workspace_region,
     exist_ok = True)

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

О названии рабочего пространства: Похоже, что ограничение на длину имени рабочего пространства недостаточно задокументировано. Он не может быть длиннее 26 символов. Если вы попробуете это сделать, ваше рабочее пространство будет создано правильно, но вы можете столкнуться с некоторыми странными ошибками при отправке учебных заданий. Я отслеживаю это с группой продуктов в Microsoft, чтобы зафиксировать это.

Эксперимент

Эксперимент - это логический контейнер для предлагаемого вами решения проблемы, которую вы хотите смоделировать. В рабочем пространстве может одновременно выполняться несколько экспериментов. Они не только служат контейнером для вашего решения, но также позволяют отслеживать ваш прогресс в отношении того, насколько хорошо ваше решение работает. Такой прогресс отслеживается с помощью показателей, которые вы можете определить. Если ваша проблема связана с классификацией, возможно, вы захотите отследить точность или MAP, которую получает ваша модель. В каждом эксперименте можно отслеживать несколько показателей.

Ваш эксперимент будет связан с папкой на вашем локальном компьютере. Такая папка содержит все ресурсы (файлы кода, активы, данные и т. Д.), Необходимые для решения проблемы. Папка обычно связана с репозиторием кода. Это не обязательно, но это позволит вам сотрудничать между разными специалистами по данным в одном эксперименте. Репозиторий может быть размещен в любой службе, от GitHub до Azure DevOps.

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

from azureml.core import Experiment
experiment = Experiment(workspace=ws, name=experiment_name)

Вы также можете проверить все эксперименты в рабочей области на портале Azure, но не можете создать там новый.

Бежит

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

Вы создаете запуск своего эксперимента, выполняя метод submit объекта эксперимента.

run = experiment.submit(script_run_configuration)
run.wait_for_completion(show_output = True)

Как видите, вам нужно указать конфигурацию. Мы увидим это через минуту. Как только запуск будет отправлен, начнется тренировочный процесс для вашего эксперимента. Метод асинхронный, это означает, что он не будет ждать, пока он будет выполнен. Обычно вам нужно подождать. wait_for_completion сделает это за вас. show_output = true указывает, что вы хотите видеть вывод процесса в консоли. Результатом будет прямая трансляция, чтобы вы могли точно видеть, что происходит. Вроде классно!

Вы также можете проверить ход выполнения на портале Azure, открыв эксперимент, который вы используете:

Что-то другое? Да, итерации

В свою очередь, каждый запуск может иметь несколько итераций (также называемых дочерними запусками). В частности, это касается Azure Automated ML, технологии для автоматизации настройки гиперпараметров и выбора модели (если вам это интересно: У меня есть сообщение по этой теме, в котором сравниваются Google AutoML, AutoKeras, Azure Automated ML и auto-sklean) ). Каждая итерация будет попыткой настройки модели. Не будем сейчас на этом останавливаться, я обещаю рассказать об этом более подробно в другом посте.

Что, где и как проводить обучение

Конфигурация запуска сценария и оценщики

Вы помните, что для отправки Run вам нужно указать параметр конфигурации? Хорошо, поприветствуем Конфигурация запуска сценария. Этот объект будет указывать эксперименту что, где и как выполнять.

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

Вы создаете оценщик следующим образом:

from azureml.train.dnn import Estimator
exec_environment = Estimator(source_directory=working_dir,
                             entry_script='train.py',              
                             script_params=script_params,
                             compute_target=compute_target,
                             pip_packages=['scikit-learn']
                             conda_packages=['scikit-learn'])

Посмотрим его параметры:

Что (выполнить)

Оценщик должен указать AML, какую работу он должен выполнять. Вы укажете это, указав два параметра (или три): source_directory, который указывает папку, в которой все ваши ресурсы расположены локально в вашей среде. Вы должны убедиться, что все, что вам нужно, можно получить из этого каталога, каждый скрипт, актив или что-то еще, что должно быть здесь. Почему? Поскольку эта папка будет скопирована в целевой объект вычислений, который вы будете использовать для обучения. Чтобы представить себе это, предположим, что вы хотите обучить свою модель в контейнере Docker на виртуальной машине в облаке. Эта папка будет скопирована внутри контейнера докеров.

Конечно, внутри этого каталога может быть много файлов Python. Вот почему вам также необходимо указать параметр entry_script. Это относительный путь к исходному каталогу для сценария, который будет вызываться при запуске задания по обучению. Если вашему сценарию требуются некоторые параметры, просто используйте аргумент script_params, который представляет собой простой словарь.

script_params = {
     '--regularization': 0.8 
}

Важно: размер каталога. Эта папка не может быть больше 300 МБ по состоянию на январь 2019 года. Причина в том, что для копирования больших файлов потребуется время и задержка выполнения. Вы получите сообщение об ошибке, если попробуете что-то большее. Вы можете спросить… а как же мой набор данных! Легко, у вас есть несколько вариантов: один - загрузить данные из Интернета как часть сценария тренировки. Другой вариант - использовать прикрепленное хранилище BLOB-объектов, которое поставляется с вашей рабочей областью. У каждого рабочего пространства AML есть один. Вы можете загрузить нужные данные в это хранилище, а затем получить к ним доступ из сценария обучения. Я покажу вам, как Часть 2.

Где (выполнить)

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

  • Локальный: ваш локальный компьютер или облачная виртуальная машина (ВМ), которую вы используете в качестве среды разработки и экспериментов. Почему вам нужно использовать AML в вашей локальной среде? Есть ли в этом смысл? Да, на самом деле два: во-первых, вы можете сначала попробовать свой код на локальном компьютере, чтобы проверить, работает ли он. Во-вторых, вам может быть неинтересно обучение в облаке, но вы хотите использовать облако для отслеживания процесса обучения, сбора показателей, журналов и т. Д. Если вы слышали о MlFlow, вы можете думать о AML как о том же.
  • Управляемые вычисления: это вычислительный ресурс, управляемый AML. У вас есть два типа управляемых вычислений: на основе выполнения и на основе постоянного. На основе выполнения. На основе выполнения - это оборудование, которого хватит только на время выполнения цикла. Вы отправляете задание, оборудование готово и настраивается, задание выполняется и, наконец, оборудование освобождается. Конец истории. Вы получаете плату только за время работы оборудования. Постоянный, с другой стороны, означает, что вы хотите, чтобы вычислительное оборудование было выделено для вашей рабочей области для всех запусков. Это позволяет более эффективно контролировать расходы, поскольку вы можете установить, сколько оборудования можно использовать и в каком объеме оно должно масштабироваться. В таком случае Persistent обычно представляет собой кластер машин и позволяет вам указать минимальное и максимальное количество узлов, которые вы хотите выделить, как они должны масштабироваться, когда они должны уменьшаться и т. Д. Масштабирование происходит автоматически.
  • Прикрепленные вычислительные ресурсы. Вы также можете использовать свои собственные облачные вычисления Azure и присоединить их к Машинному обучению Azure. Это может быть кластер DataBricks, кластер HDInsight или виртуальная машина Docker.

Возможные значения для этого:

  • local: значение по умолчанию. Это означает, что он будет работать на вашем собственном компьютере.
  • amlcompute: указывает, что вы хотите использовать управляемые вычисления AML.
  • удаленный: указывает на то, что вы хотите использовать удаленный вычислительный ресурс, управляемый вне AML.

Пример: запуск amlcompute

exec_environment = Estimator(source_directory=working_dir,
                             entry_script='train.py',              
                             script_params=script_params,
                             compute_target='amlcompute',
                             vm_size = 'Standard_NC6'
                             pip_packages=['scikit-learn']
                             conda_packages=['scikit-learn'])

Пример: постоянный amlcompute

# Check if the compute already exists. If not, it creates it
if 'amlcompute_gpu' in ws.compute_targets:
    my_compute_target = ws.compute_targets[compute_name]
else:
    provisioning_config = AmlCompute.provisioning_configuration(
                         vm_size = 'Standard_NC6',
                         min_nodes = 1, 
                         max_nodes = 3)
    my_compute_target = ComputeTarget.create(ws, 
                                             "amlcompute_gpu",
                                             provisioning_config)
exec_environment = Estimator(source_directory=working_dir,
                             entry_script='train.py',              
                             script_params=script_params,
                             compute_target=my_compute_target,
                             pip_packages=['scikit-learn']
                             conda_packages=['scikit-learn'])

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

Пример: удаленная виртуальная машина

attach_config = RemoteCompute.attach_configuration(
    address = "0.0.0.0",
    ssh_port=22,
    username='<username>',
    password="<password>")
attach_compute = ComputeTarget.attach(ws, "attachvm", attach_config)
exec_environment = Estimator(source_directory=working_dir,
                             entry_script='train.py',              
                             script_params=script_params,
                             compute_target=attach_compute,
                             pip_packages=['scikit-learn']
                             conda_packages=['scikit-learn'])

Ограничения: AML поддерживает только виртуальные машины под управлением Ubuntu. Вы можете использовать системную среду conda, существующую среду Python или контейнер Docker. Когда вы выполняете с помощью контейнера Docker, на виртуальной машине должен быть запущен Docker Engine. На вашей виртуальной машине или образе докера должен быть установлен conda. Продолжайте читать, чтобы узнать почему.

Совет. Как и постоянные вычислительные цели, удаленные цели обычно регистрируются на портале Azure.

Мы поддерживаем другие цели вычислений:

Как (выполнить)

Наконец, оценщик позволяет нам указать, как будет выполняться наш код. Это позволит нам сделать пара параметров:

  • use_gpu: по умолчанию - false. Указывает, поддерживает ли оборудование графический процессор. Если это правда, образ, развернутый на виртуальной машине, будет иметь все драйверы и дистрибутивы для поддержки графических процессоров.
  • use_docker: по умолчанию True. Указывает, будет ли задание отправлено как образ Docker в целевой объект вычислений.
  • custom_docker_base_image: позволяет указать настраиваемый образ докера для развертывания в контейнере. Например: «microsoft / cntk». На всех образах должен быть установлен conda, иначе задание завершится ошибкой.
  • pip_packages: позволяет указать, какие дополнительные пакеты Python вы хотите, чтобы AML установил с помощью pip в целевом вычислении. Если вы используете собственный образ докера, то у вас, вероятно, будет все необходимое, но если вы используете образ докера по умолчанию, некоторые пакеты могут отсутствовать.
  • conda_packages: То же, что и pip_packages, но для среды conda. По этой причине в вашем образе должен быть установлен conda (даже если вы не используете его).

Если вы работаете с PyTorch или Tensorflow, у меня для вас хорошие новости. У нас есть предварительно настроенные оценщики, готовые к использованию. Они работают так же, как класс Estimator, но все библиотеки, необходимые для TensorFlow или PyTorch, уже есть.

from azureml.train.dnn import TensorFlow
exec_env = TensorFlow(source_directory=project_folder,
                      compute_target=compute_target,
                      script_params=script_params,
                      entry_script='train.py',
                      use_gpu=True)

Ты все еще со мной? Я знаю много, но угадайте, что… это еще не все: Распределенное обучение

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

estimator= TensorFlow(source_directory=project_folder,
                      compute_target=compute_target,
                      script_params=script_params,
                      entry_script='tf_horovod_word2vec.py',
                      node_count=2,
                      process_count_per_node=1,
                      distributed_backend='mpi',
                      use_gpu=True)

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

Собираем все вместе

Хорошо, теперь вы знакомы со всеми необходимыми частями. Давайте посмотрим на полный пример. Это сценарий: у вас есть сценарий train.py, который использует PyTorch для создания модели глубокого обучения для классификации изображений с помощью Transfer Learning с ResNet. Модель решает проблему Cat vs Dogs Kaggle. В вашей модели используется API от fast.ai, поскольку он обеспечивает высокоуровневую абстракцию. Вы хотите использовать графический процессор, чтобы ускорить обучение. Вы создаете сценарий run.py, который будет выглядеть так:

from azureml.core import Workspace
from azureml.core.run import Run
from azureml.core.experiment import Experiment
from azureml.train.dnn import PyTorch
ws = Workspace.create(name = 'aa-ml-aml-workspace',
                      subscription_id = '1234-12345678-12345678-12',
                      resource_group = 'AA.Aml.Experiments',
                      location = 'eastus',
                      exist_ok = True)
src = PyTorch(source_directory =  r'.\classification-with-resnet',
              compute_target='amlcompute', 
              vm_size='Standard_NC6', 
              entry_script = 'train.py', 
              use_gpu = True, 
              pip_packages = ['fastai'])
experiment = Experiment(workspace=ws, name='classify-with-resnet')
run = experiment.submit(src)
run.wait_for_completion(show_output = True)

Это все! Вы можете отслеживать прогресс в консоли, как мы уже говорили:

Вы можете найти репозиторий, в котором это реализовано, в моем репозитории GitHub.

Выводы

Как видите, AML - действительно мощный сервис для управления всем жизненным циклом тренировочного процесса. В следующем посте я покажу вам, как можно изменить сценарий обучения, чтобы AML отслеживал производительность, вывод модели и возможности отладки. Будьте на связи!