Модельное обучение в облаке

Максимально эффективное использование ресурсов графического процессора - обучение модели в службах машинного обучения Azure с помощью трех строк кода

Узнайте, как просто обучать модели в облаке Azure без особых усилий, но за пару долларов

С Новым годом, ребята!

Пару недель назад я прочитал статью« На пути к науке о данных , в которой сравниваются (в пересчете на доллары США) разные облачные провайдеры по задаче обучения модели глубокого обучения с использованием вычислительной цели на базе графического процессора».

Однако я был удивлен, прочитав, что, даже будучи вторым по величине поставщиком облачных услуг с точки зрения принятия, Azure не выдержала конкуренции, потому что эту службу было сложно использовать. Речь идет о Службах машинного обучения Azure, решении Microsoft для обучения пользовательских моделей машинного обучения в облаке. Хотя я считаю, что сервис относительно прост, я соглашусь и признаю, что сегодняшняя документация о том, как работает сервис, не самая лучшая из возможных (вероятно, из-за недавних (больших) изменений, внесенных в сентябре 2018 года). Такие изменения оставили смесь старой и новой документации, из-за чего трудно определить, какая из них правильная. Надеюсь, мы скоро это исправим.

А пока я здесь, чтобы показать, насколько легко было бы реализовать ту же проблему, что и в исходной публикации, но с использованием служб машинного обучения Azure (теперь AML, поскольку я ленивый человек). Чтобы доказать вам, что это легко, я обещаю использовать всего 3 строки кода (плюс немного импорта Python, не будь таким резким).

Конкурс

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

Цель

Автор предлагает решить задачу классификации популярных соревнований Kaggle« Кошки против собак » путем обучения сверточной нейронной сети в сочетании с трансферным обучением. Выбранный фреймворк - PyTorch. Я буду использовать большую часть кода автора, чтобы сравнение было как можно более справедливым, но мне пришлось изменить некоторые строки, так как API, который он использовал (fast.ai), изменился.

Тип проблемы: Классификация
Количество классов: 2 (кошки, собаки)
Исходные данные: изображения (25 000–50 % кошек, 50% собак)
Предлагаемая модель: сверточная нейронная сеть
Базовая модель: ResNet50
Структура: PyTorch + fast.ai

Исходный код для обучения модели можно найти здесь, а модифицированную версию для последней версии fast.ai можно найти здесь.

О AML

У Microsoft есть множество сервисов, предназначенных для машинного обучения и искусственного интеллекта, однако, безусловно, наиболее подходящим для этого разговора является AML. Он предоставляет облачную среду, которую вы можете использовать для разработки, обучения, тестирования, развертывания, управления и отслеживания моделей машинного обучения. Текущая версия AML использует подход «сначала код» с Python, что означает, что весь процесс управляется с помощью этого языка. Его можно запустить из записной книжки или из IDE по вашему выбору.

Чтобы сделать этот пост более запоминающимся, я сначала покажу, как решить проблему, но я подробно объяснил каждую из частей в этом посте. Мы можем добиться этого менее чем за 20 минут, создав два скрипта (на самом деле 1, потому что один из них у нас уже есть):

  1. Скрипт Python под названием train.py, содержащий всю логику для обучения модели. Это точно такой же сценарий, который вы использовали бы в любом другом облачном провайдере или даже на своей собственной машине для обучения модели, поэтому нам не нужно создавать его. Тот, который я использую, находится здесь (PyTorch + fast.ai), что является обновленной версией того, что использовалось в исходном сообщении.
  2. Скрипт Python под названием run.py, содержащий всю логику контроллера для создания и отправки эксперимента машинного обучения в AML. Этот сценарий специфичен для AML.

Подготовьте свое окружение

Как я уже говорил, AML использует подход, ориентированный на код, для создания, управления и публикации экспериментов с машинным обучением. Поэтому вам нужно будет установить некоторые библиотеки в своей среде. Ваша среда может быть вашим локальным компьютером, использующим PyCharm, Spider, VS Code или любой другой IDE по вашему выбору, или это может быть ноутбук, работающий в облаке или локально. Вам необходимо установить две библиотеки: Azure и Azure ML SDK.

!pip install azure
!pip install -upgrade azureml-sdk[notebooks,automl]

Скрипт run.py

Во-первых, мы собираемся создать рабочее пространство в AML для работы. Рабочая область - это облачный ресурс, который вы будете использовать для создания, управления и публикации экспериментов с машинным обучением. Чтобы создать рабочую область, вам понадобится идентификатор подписки, которую вы собираетесь использовать, имя рабочей области и место для развертывания ресурса. Параметр location важен, поскольку он определяет, какое вычислительное оборудование будет доступно для вашей учебной работы. Я использую к востоку от США.

import azureml.core
from azureml.core import Workspace
ws = Workspace.create(
    name = "aa-ml-aml-workspace",
    subscription_id = "1a2b3c4d-5a7b-5a7b-9a0b1c2d3e5f6g6>"
    resource_group = "AdvanceAnalytics.ML",
    location = 'eastus',
    exist_ok = True)

Затем мы собираемся создать среду выполнения для PyTorch. Среда выполнения - это конфигурация оборудования и программного обеспечения, которую вы собираетесь использовать для обучения модели. AML имеет несколько предварительно настроенных сред выполнения для TensorFlow и PyTorch (в AML они называются оценщиками, но мне не нравится это название, поскольку в Data Science оценщик имеет другое значение. Надеюсь, мы скоро его изменим):

from azureml.train.dnn import PyTorch
src = PyTorch(
      source_directory = r'.\fastai',
      compute_target='amlcompute', 
      vm_size='Standard_NC6', 
      entry_script = 'train.py', 
      use_gpu = True, 
      pip_packages = ['fastai'])

Этот метод создаст среду выполнения PyTorch. Параметры:

  • souce_directory: все файлы в souce_directory будут скопированы в целевой объект выполнения (обычно это корневой каталог вашего проекта).
  • В compute_target указано, где вы собираетесь выполнять это задание. Значение «amlcompute» сигнализирует, что мы хотим, чтобы Azure подготовила виртуальную машину для этого конкретного задания. Машина будет создана, и как только работа будет выполнена, она будет уничтожена. Довольно крутая функция. Доступны и другие типы, включая (Databricks, HDInsight (Spark), настраиваемые виртуальные машины, локальный компьютер)
  • vm_size указывает тип используемого оборудования. В данном случае Standard_NC6 работает на NVIDIA Tesla K80 с 8 ГиБ, 6 виртуальных ЦП и 56 ГиБ ОЗУ.
  • В entry_script указан обучающий сценарий, который вы хотите выполнить. Этот файл должен находиться внутри source_directory.
  • use_gpu указывает, что нам нужны библиотеки с поддержкой графического процессора.
  • pip_packages позволяет указать, какие дополнительные пакеты вам нужны в среде выполнения. В этом случае, поскольку среда выполнения PyTorch имеет все необходимое для PyTorch, отсутствует единственный пакет - fast.ai.

Наконец, мы создаем эксперимент, указывая используемое рабочее пространство и имя, и запускаем его:

from azureml.core.run import Run
from azureml.core.experiment import Experiment
experiment = Experiment(workspace=ws, name="azureml-benchmark")
run = experiment.submit(src)

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

Вы можете проверить прогресс на портале Azure или в Python:

run.wait_for_completion(show_output = True)

С show_output = true вы подключитесь к потоку вывода, так что это будет похоже на подключение консоли к виртуальной машине:

Что еще? Ничего такого!

Это все. Разве это не круто? Мы подготовили полный стек аппаратного и программного обеспечения с 3 строками кода! Весь скрипт доступен на GitHub

Результаты, достижения

Тренировочный процесс занял 7,21 минуты. Стоимость часа использования ВМ Standard_NC6 на 2 января 2019 года составляет 1,56 доллара США в час. Таким образом, обучение модели стоит 0,19 доллара США (*)

(*) Раскрытие

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

Тем не менее, я бы поставил под сомнение правильность этого подхода для измерения стоимости процесса обучения, поскольку время на подготовку виртуальной машины также повлечет за собой определенные затраты. Например, в моем случае потребовалось около 7 минут, чтобы развернуть все, установить зависимости, подготовить среду и т. Д. (Столько же времени, сколько и на обучение). На стоимость также повлияет то, насколько быстро вы сможете вставить свой код в подготовленное оборудование. Для правильной оценки затрат также необходимо учитывать ресурсы хранения, сети и другие ресурсы, потребляемые обучающей виртуальной машиной. Кроме того, выбор фреймворка больше не является тривиальной задачей. Если вы используете определенные сервисы у некоторых облачных провайдеров, включая AWS, Azure и GCP, они оптимизировали аппаратное ускорение, когда код например, написано на TensorFlow. Вы должны быть осторожны с этим.

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

Если вам интересно узнать, как работает Машинное обучение Azure, проверьте