Обучение моделей PyTorch в большом масштабе с помощью пакета SDK для Машинного обучения Azure (версия 1)

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

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

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

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

Необходимые компоненты

Запускайте этот код в любой из указанных ниже сред.

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

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

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

Импорт пакетов

Сначала импортируйте необходимые библиотеки Python.

import os
import shutil

from azureml.core.workspace import Workspace
from azureml.core import Experiment
from azureml.core import Environment

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

Инициализация рабочей области

Рабочая область Машинного обучения Azure — это ресурс верхнего уровня данной службы. Она предоставляет централизованное расположение для работы со всеми создаваемыми артефактами. В пакете SDK для Python можно получить доступ к артефактам рабочей области, создав объект workspace.

Создайте объект рабочей области из файла config.json, созданного при выполнении инструкций в разделе Предварительные требования.

ws = Workspace.from_config()

Получение данных

Набор данных состоит из примерно 120 учебных изображений кур и индюков со 100 проверочными изображениями для каждого класса. Мы загрузим и извлечем этот набор данных в рамках нашего обучающего сценария pytorch_train.py. Изображения являются подмножеством набора данных Open Images V5. Дополнительные шаги по созданию JSONL для обучения на основе собственных данных см. в этой записной книжке Jupyter.

Подготовка сценария обучения

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

Создайте папку для сценариев обучения.

project_folder = './pytorch-birds'
os.makedirs(project_folder, exist_ok=True)
shutil.copy('pytorch_train.py', project_folder)

Создание целевого объекта вычислений

Создайте целевой объект вычислений для выполнения задания PyTorch. В этом примере создайте вычислительный кластер Машинного обучения Azure с поддержкой GPU.

Важно!

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


# Choose a name for your CPU cluster
cluster_name = "gpu-cluster"

# Verify that cluster does not exist already
try:
    compute_target = ComputeTarget(workspace=ws, name=cluster_name)
    print('Found existing compute target')
except ComputeTargetException:
    print('Creating a new compute target...')
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_NC6', 
                                                           max_nodes=4)

    # Create the cluster with the specified name and configuration
    compute_target = ComputeTarget.create(ws, cluster_name, compute_config)

    # Wait for the cluster to complete, show the output log
    compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

Если вместо этого требуется создать кластер ЦП, укажите другой размер виртуальной машины для параметра vm_size, например STANDARD_D2_V2.

Дополнительные сведения о целевых объектах вычислений см. в статье, объясняющей, что такое целевой объект вычислений.

Определение среды

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

Использование курированной среды

Машинное обучение Azure предоставляет предварительно созданные, курируемые среды, если вы не хотите определять собственную среду. Есть несколько курированных сред ЦП и GPU для PyTorch, соответствующих разным версиям PyTorch.

Если вы хотите использовать курированную среду, можно выполнить следующую команду:

curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)

Чтобы просмотреть пакеты, включенные в курированную среду, запишите зависимости conda на диск:

pytorch_env.save_to_directory(path=curated_env_name)

Убедитесь, что курированная среда включает все зависимости, необходимые для вашего сценария обучения. В противном случае вам придется изменить среду и включить недостающие зависимости. При изменении среды вы должны будете присвоить ей новое имя, так как префикс AzureML зарезервирован для курированных сред. Если вы изменили файл YAML зависимостей conda, можно создать из него новую среду с новым именем. Например:

pytorch_env = Environment.from_conda_specification(name='pytorch-1.6-gpu', file_path='./conda_dependencies.yml')

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

pytorch_env = pytorch_env.clone(new_name='pytorch-1.6-gpu')

Создание пользовательской среды

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

Сначала определите зависимости conda в файле YAML; в данном примере этот файл называется conda_dependencies.yml.

channels:
- conda-forge
dependencies:
- python=3.7
- pip=21.3.1
- pip:
  - azureml-defaults
  - torch==1.6.0
  - torchvision==0.7.0
  - future==0.17.1
  - pillow

Создайте среду Машинное обучение Azure из этой спецификации среды conda. Среда будет упакована в контейнер Docker во время выполнения.

По умолчанию, если базовый образ не указан, Машинное обучение Azure будет использовать образ azureml.core.environment.DEFAULT_CPU_IMAGE ЦП в качестве базового образа. Так как в этом примере обучение выполняется в кластере GPU, необходимо указать базовый образ GPU с необходимыми драйверами и зависимостями GPU. Машинное обучение Azure поддерживает набор базовых образов, опубликованных в реестре контейнеров Майкрософт (MCR), которые можно использовать. Дополнительные сведения см. в репозитории GitHub AzureML-Containers.

pytorch_env = Environment.from_conda_specification(name='pytorch-1.6-gpu', file_path='./conda_dependencies.yml')

# Specify a GPU base image
pytorch_env.docker.enabled = True
pytorch_env.docker.base_image = 'mcr.microsoft.com/azureml/openmpi3.1.2-cuda10.1-cudnn7-ubuntu18.04'

Совет

При необходимости можно просто захватить все зависимости непосредственно в пользовательском образе Docker или Dockerfile и создать среду из него. Дополнительные сведения см. в разделе Обучение с помощью пользовательского образа.

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

Настройка и отправка объекта run обучения

Создание ScriptRunConfig

Создайте объект ScriptRunConfig, чтобы указать сведения о конфигурации для вашего задания обучения, в том числе скрипт обучения, используемую среду и целевой объект вычислений, на котором будет выполняться задание. Любые аргументы передаются в сценарий обучения через командную строку, если они указаны в параметре arguments. В следующем коде будет настроено задание PyTorch с одним узлом.

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=project_folder,
                      script='pytorch_train.py',
                      arguments=['--num_epochs', 30, '--output_dir', './outputs'],
                      compute_target=compute_target,
                      environment=pytorch_env)

Предупреждение

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

Дополнительные сведения о настройке заданий с помощью ScriptRunConfig см. в разделе Настройка и отправка объектов run обучения.

Предупреждение

Если вы ранее использовали оценщик PyTorch для настройки заданий обучения PyTorch, обратите внимание, что оценщики не рекомендуются с версии 1.19.0 пакета SDK. С помощью пакета SDK >Машинное обучение Azure = 1.15.0, ScriptRunConfig рекомендуется настроить задания обучения, включая использование платформ глубокого обучения. Распространенные вопросы по миграции см. в разделе Руководство по миграции с оценщика на ScriptRunConfig.

Отправка запуска

Объект run предоставляет интерфейс для журнала выполнения во время выполнения задания и после его завершения.

run = Experiment(ws, name='Tutorial-pytorch-birds').submit(src)
run.wait_for_completion(show_output=True)

Что происходит во время выполнения объекта run

В процессе выполнения объект run проходит следующие этапы.

  • Подготовка. Создается образ Docker в соответствии с определенной средой. Образ отправляется в реестр контейнеров рабочей области и кэшируется для последующего выполнения. Журналы также передаются в журнал выполнения, и их можно просматривать для отслеживания хода выполнения. Если вместо этого указана курированная среда, то будет использоваться кэшированный образ, в котором выполняется резервное копирование курированной среды.

  • Масштабирование. Кластер пытается выполнить вертикальное масштабирование, если кластеру Batch AI требуется больше узлов для выполнения объекта run, чем доступно в настоящее время.

  • Выполнение. Все сценарии в папке сценариев передаются в целевой объект вычислений, хранилища данных подключаются или копируются, и затем выполняется script. Выходные данные из stdout и папки ./logs передаются в журнал выполнения и могут использоваться для мониторинга выполнения.

  • Постобработка. Папка ./outputs объекта run копируется в журнал выполнения.

Регистрация или загрузка модели

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

model = run.register_model(model_name='pytorch-birds', model_path='outputs/model.pt')

Совет

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

Вы также можете скачать локальную копию модели с помощью объекта run. В сценарии обучения pytorch_train.py объект save PyTorch сохраняет модель в локальную папку (локальную для целевого объекта вычислений). Для скачивания копии можно использовать объект run.

# Create a model folder in the current directory
os.makedirs('./model', exist_ok=True)

# Download the model from run history
run.download_file(name='outputs/model.pt', output_file_path='./model/model.pt'), 

Распределенное обучение

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

Машинное обучение Azure поддерживает выполнение распределенных заданий PyTorch с встроенным модулем DistributedDataParallel как Horovod, так и PyTorch.

Дополнительные сведения о распределенном обучении см. в разделе Руководство по распределенному обучению GPU.

Экспорт в формат ONNX

Чтобы оптимизировать вывод с помощью среды выполнения ONNX, преобразуйте обученную модель PyTorch в формат ONNX. Вывод или оценка модели — это этап, в котором развернутая модель используется для прогнозирования, чаще всего на рабочих данных. Пример см. в руководстве по экспорту модели из PyTorch в ONNX.

Следующие шаги

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