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