Обучение моделей TensorFlow с помощью Службы машинного обучения Azure

Для глубокого обучения нейронных сетей (DNN) с помощью TensorFlow служба «Машинное обучение Azure» предоставляет пользовательский класс TensorFlow средства оценки Estimator. Средство оценки TensorFlow в пакете Azure SDK (не следует путать с классом tf.estimator.Estimator) позволяет легко отправлять задания обучения TensorFlow для одноузловых и распределенных запусков в вычислительных ресурсах Azure.


vcugbv2krcfpaqlxwymazqdloba.jpeg

Одноузловое обучение

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

Чтобы выполнить задание TensorFlow, следует создать объект TensorFlow. У вас уже должен быть создан объект compute_target целевого вычислительного ресурса.

from azureml.train.dnn import TensorFlow

script_params = {
    '--batch-size': 50,
    '--learning-rate': 0.01,
}

tf_est = TensorFlow(source_directory='./my-tf-proj',
                    script_params=script_params,
                    compute_target=compute_target,
                    entry_script='train.py',
                    conda_packages=['scikit-learn'],
                    use_gpu=True)

Укажем следующие параметры в конструкторе TensorFlow.

Параметр ОПИСАНИЕ
source_directory Локальный каталог, который содержит весь код, необходимый для задания обучения. Эта папка копируется с локального компьютера на удаленный вычислительный ресурс.
script_params Словарь, указывающий аргументы командной строки для сценария обучения entry_script в виде пар <аргумент командной строки, значение>.
compute_target Удаленный целевой объект вычислений, на котором будет выполняться сценарий обучения. В нашем случае это кластер Вычислительной среды Машинного обучения Azure (AmlCompute).
entry_script Путь к файлу (относительно source_directory) сценария обучения, который будет выполняться на удаленном вычислительном ресурсе. В этой папке должны быть расположены этот файл и дополнительные файлы, от которых он зависит.
conda_packages Необходимый для сценария обучения список пакетов Python, которые нужно установить с помощью conda. В этом случае сценарий обучения использует sklearnдля загрузки данных, поэтому необходимо указать этот пакет для установки. Параметр pip_packagesконструктора можно использовать для всех необходимых пакетов pip.
use_gpu Присвойте этому флагу значение True, чтобы использовать GPU для обучения. По умолчанию равен False.

Так как вы работаете со средством оценки TensorFlow, контейнер, используемый для обучения, по умолчанию будет содержать пакет TensorFlow и связанные зависимости, необходимые для обучения в ЦП и GPU.

Затем отправьте задание TensorFlow:

run = exp.submit(tf_est)


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

Средство оценки TensorFlow также позволяет обучать модели в кластерах ЦП и GPU виртуальных машин Azure. Распределенное обучение TensorFlow проводится с помощью нескольких вызовов API, при этом служба машинного обучения Azure в фоновом режиме будет управлять инфраструктурой и функциями оркестрации, необходимыми для выполнения этих рабочих нагрузок.

Служба машинного обучения Azure поддерживает два метода распределенного обучения в TensorFlow.


Horovod

Horovod — это поддерживающая алгоритм ring-allreduce платформа на основе открытого исходного кода для распределенного обучения, разработанная Uber.

Чтобы запустить распределенное обучение TensorFlow с помощью платформы Horovod, создайте объект TensorFlow следующим образом:

from azureml.train.dnn import TensorFlow

tf_est = TensorFlow(source_directory='./my-tf-proj',
                    script_params={},
                    compute_target=compute_target,
                    entry_script='train.py',
                    node_count=2,
                    process_count_per_node=1,
                    distributed_backend='mpi',
                    use_gpu=True)

В приведенном выше коде показаны следующие новые параметры в конструкторе TensorFlow.

Параметр ОПИСАНИЕ значение по умолчанию
node_count Количество узлов, которые будут использоваться для задания обучения. 1
process_count_per_node Количество процессов (или рабочих ролей), запускаемых на каждом узле. 1
distributed_backend Серверная часть для запуска распределенного обучения, предлагаемая средством оценки с помощью MPI. Чтобы выполнять параллельное или распределенное обучение (например,  node_count> 1 или process_count_per_node> 1, или оба варианта) с помощью MPI (и Horovod), задайте distributed_backend='mpi'.Служба «Машинное обучение Azure» использует реализацию MPI Open MPI. None

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

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

import tensorflow as tf
import horovod

И, наконец, отправьте задание TensorFlow:

run = exp.submit(tf_est)


Сервер параметров

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

Создайте объект TensorFlow:

from azureml.train.dnn import TensorFlow

tf_est = TensorFlow(source_directory='./my-tf-proj',
                    script_params={},
                    compute_target=compute_target,
                    entry_script='train.py',
                    node_count=2,
                    worker_count=2,
                    parameter_server_count=1,
                    distributed_backend='ps',
                    use_gpu=True)

Обратите внимание на следующие параметры в конструкторе TensorFlow в приведенном выше коде.

Параметр ОПИСАНИЕ значение по умолчанию
worker_count Количество рабочих ролей. 1
parameter_server_count Количество серверов параметров. 1
distributed_backend Серверная часть, которая будет использоваться для распределенного обучения.Чтобы провести распределенное обучение с помощью сервера параметров, задайте значение distributed_backend='ps'. None

Примечания по TF_CONFIG

Вам также потребуются сетевые адреса и порты кластера для tf.train.ClusterSpec, поэтому служба машинного обучения Azure автоматически задает переменную среды TF_CONFIG.

Переменная среды TF_CONFIG представляет собой строку JSON. Ниже приведен пример переменной для сервера параметров.

TF_CONFIG='{
    "cluster": {
        "ps": ["host0:2222", "host1:2222"],
        "worker": ["host2:2222", "host3:2222", "host4:2222"],
    },
    "task": {"type": "ps", "index": 0},
    "environment": "cloud"
}'

Если вы используете высокоуровневый API tf.estimator TensorFlow, TensorFlow проанализирует эту переменную TF_CONFIG и сформирует спецификацию кластера.

Если для обучения вы используете API более низкого уровня, вам необходимо самостоятельно проанализировать переменнуюTF_CONFIG и создать tf.train.ClusterSpec в коде обучения. В этом примере эти действия выполняются в сценарии обучения следующим образом:

import os, json
import tensorflow as tf

tf_config = os.environ.get('TF_CONFIG')
if not tf_config or tf_config == "":
    raise ValueError("TF_CONFIG not found.")
tf_config_json = json.loads(tf_config)
cluster_spec = tf.train.ClusterSpec(cluster)

Завершив написание сценария обучения и создание объекта TensorFlow, отправьте задание обучения:

run = exp.submit(tf_est)


Примеры

Записные книжки по распределенному глубокому обучению см. в репозитории GitHub, раздел

Узнайте, как запускать записные книжки, следуя указаниям из статьи о том, как изучить эту службу с помощью записных книжек Jupyter.


Дополнительная информация


© Habrahabr.ru