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

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

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

В этом примере производится обучение и регистрация модели TensorFlow для классификации рукописных цифр с помощью глубокой нейронной сети (DNN).

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

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

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

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

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

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

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

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

import os
import urllib
import shutil
import azureml

from azureml.core import Experiment
from azureml.core import Workspace, Run
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()

Создание файлового набора данных

Объект FileDataset ссылается на один или несколько файлов в хранилище данных рабочей области или общедоступных URL-адресов. Это могут быть файлы любого формата, и с помощью этого класса вы сможете скачивать их или подключать к вычислительной среде. Создавая FileDataset, вы одновременно создаете ссылку на расположение источника данных. Любые преобразования, примененные к такому набору данных, будут сохранены и в исходном наборе данных. Данные хранятся только в исходном расположении, а значит не потребуется лишних расходов на хранение. Дополнительные сведения о пакете Dataset см. в статье о создании и регистрации наборов данных.

from azureml.core.dataset import Dataset

web_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 = web_paths)

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

dataset = dataset.register(workspace=ws,
                           name='mnist-dataset',
                           description='training and test dataset',
                           create_new_version=True)

# list the files referenced by dataset
dataset.to_path()

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

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

Важно!

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

cluster_name = "gpu-cluster"

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)

    compute_target = ComputeTarget.create(ws, cluster_name, compute_config)

    compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

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

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

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

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

Машинное обучение Azure предоставляет предварительно созданные, курируемые среды, если вы не хотите определять собственную среду. Машинное обучение Azure имеет несколько курируемых сред ЦП и GPU для TensorFlow, соответствующих различным версиям TensorFlow. Последнюю версию этой среды можно использовать с помощью директивы @latest . Дополнительные сведения см. в разделе Машинное обучение Azure Курированные среды.

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

curated_env_name = 'AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu'
tf_env = Environment.get(workspace=ws, name=curated_env_name)

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


tf_env.save_to_directory(path=curated_env_name)

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


tf_env = Environment.from_conda_specification(name='AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu', file_path='./conda_dependencies.yml')

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


tf_env = tf_env.clone(new_name='my-AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu')

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

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

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

channels:
- conda-forge
dependencies:
- python=3.7
- pip:
  - azureml-defaults
  - tensorflow-gpu==2.2.0

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

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

tf_env = Environment.from_conda_specification(name='AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu', file_path='./conda_dependencies.yml')

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

Совет

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

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

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

Создание ScriptRunConfig

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

from azureml.core import ScriptRunConfig

args = ['--data-folder', dataset.as_mount(),
        '--batch-size', 64,
        '--first-layer-neurons', 256,
        '--second-layer-neurons', 128,
        '--learning-rate', 0.01]

src = ScriptRunConfig(source_directory=script_folder,
                      script='tf_mnist.py',
                      arguments=args,
                      compute_target=compute_target,
                      environment=tf_env)

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

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

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

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

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

Отправка запроса на выполнение

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

run = Experiment(workspace=ws, name='Tutorial-TF-Mnist').submit(src)
run.wait_for_completion(show_output=True)

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

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

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

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

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

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

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

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

Необязательно: если указать параметры model_framework, model_framework_version и resource_configuration, станет возможным развертывание модели без кода. Это позволяет напрямую развернуть модель в качестве веб-службы из зарегистрированной модели, и объект ResourceConfiguration определяет вычислительный ресурс для этой веб-службы.

from azureml.core import Model
from azureml.core.resource_configuration import ResourceConfiguration

model = run.register_model(model_name='tf-mnist', 
                           model_path='outputs/model',
                           model_framework=Model.Framework.TENSORFLOW,
                           model_framework_version='2.0',
                           resource_configuration=ResourceConfiguration(cpu=1, memory_in_gb=0.5))

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

# Create a model folder in the current directory
os.makedirs('./model', exist_ok=True)
run.download_files(prefix='outputs/model', output_directory='./model', append_prefix=False)

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

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

Машинное обучение Azure поддерживает выполнение распределенных заданий TensorFlow с встроенным API обучения Horovod и TensorFlow.

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

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

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

(Предварительная версия) Развертывание модели без кода

Важно!

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

Дополнительные сведения см. в статье Дополнительные условия использования Предварительных версий Microsoft Azure.

Вместо традиционного маршрута развертывания можно также использовать для TensorFlow функцию развертывания без кода (предварительная версия). Зарегистрировав модель, как показано выше, с помощью параметров model_framework, model_framework_version и resource_configuration, можно использовать для развертывания этой модели статическую функцию deploy().

service = Model.deploy(ws, "tensorflow-web-service", [model])

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

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

В этой статье вы обучили и зарегистрировали модель TensorFlow и узнали о разных вариантах развертывания. Подробные сведения о Машинном обучении Azure см. в следующих статьях.