Руководство по обучению распределенного GPU (пакет SDK версии 2)
ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python azure-ai-ml версии 2 (current)
Дополнительные сведения об использовании распределенного кода обучения GPU см. в Машинное обучение Azure. Эта статья поможет вам запустить существующий код распределенного обучения, а также предлагает советы и примеры для каждой платформы:
- PyTorch
- TensorFlow
- Ускорение обучения с поддержкой GPU с помощью InfiniBand.
Необходимые компоненты
Ознакомьтесь с основными понятиями распределенного обучения GPU, такими как параллелизм данных, параллелизм распределенных данных и параллелизм моделей.
Совет
Если вы не знаете, какой тип параллелизма следует использовать, более 90 % времени, в течение которого следует использовать параллелизм распределенных данных.
PyTorch
Машинное обучение Azure поддерживает выполнение распределенных заданий с помощью собственных возможностей распределенного обучения PyTorch (torch.distributed
).
Совет
Для параллельной обработки данных в официальном руководстве по PyTorch предписывается использовать DistributedDataParallel (DDP) и DataParallel для распределенного обучения как с одним узлом, так и с несколькими узлами. PyTorch также рекомендует использовать DistributedDataParallel в пакете многопроцессной обработки. Машинное обучение Azure документации и примеры, поэтому основное внимание уделяется обучению DistributedDataParallel.
инициализация группы процессов;
Основа любого распределенного обучения — это группа процессов, которые связаны и могут взаимодействовать друг с другом, используя внутренний сервер. Для PyTorch группа процессов создается путем вызова torch.distributed.init_process_group во всех распределенных процессах для формирования группы процессов.
torch.distributed.init_process_group(backend='nccl', init_method='env://', ...)
Наиболее распространенные внутренние серверы подключений: mpi
, nccl
и gloo
. Для обучения nccl
на основе GPU рекомендуется повысить производительность и по возможности использовать их.
init_method
указывает, как процессы могут обнаружить друг друга, как они инициализируются и проверяют группу процессов, используя внутренний сервер подключений. По умолчанию, если init_method
он не указан, PyTorch использует метод инициализации переменной среды (env://
). init_method
— рекомендуемый метод инициализации для использования в коде обучения для запуска распределенного PyTorch на Машинное обучение Azure. PyTorch ищет следующие переменные среды для инициализации:
MASTER_ADDR
: IP-адрес компьютера, на котором размещен процесс с рангом 0MASTER_PORT
: бесплатный порт на компьютере, на котором размещен процесс с рангом 0WORLD_SIZE
: общее количество процессов. Должно быть равно общему количеству устройств (GPU), используемым для распределенного обученияRANK
: (глобальный) ранг текущего процесса. Возможные значения равны 0 (размер мира — 1)
Дополнительные сведения об инициализации группы процессов см. в документации по PyTorch.
Многие приложения также нуждаются в следующих переменных среды:
LOCAL_RANK
: локальный (относительный) ранг процесса в узле. Возможные значения: от 0 до (число процессов на узле — 1). Эта информация полезна, так как многие операции, такие как подготовка данных, должны выполняться только один раз на узел, обычно на local_rank = 0.NODE_RANK
: ранг узла для обучения с несколькими узлами. Возможные значения: от 0 до (общее число узлов — 1).
Не нужно использовать служебную программу запуска, например torch.distributed.launch
. Чтобы отправить распределенное задание PyTorch, сделайте следующее.
- Укажите скрипт обучения и аргументы.
command
Создайте и укажите тип какPyTorch
иprocess_count_per_instance
в параметреdistribution
.process_count_per_instance
соответствует общему количеству процессов, которые вы хотите выполнить для задания.process_count_per_instance
обычно должно быть равно# of GPUs per node
. Еслиprocess_count_per_instance
не указано, Машинное обучение Azure по умолчанию запускает один процесс на узел.
Машинное обучение Azure задает MASTER_ADDR
переменные среды и MASTER_PORT
NODE_RANK
WORLD_SIZE
переменные среды на каждом узле и задает переменные уровня RANK
процесса и LOCAL_RANK
среды.
from azure.ai.ml import command
from azure.ai.ml.entities import Data
from azure.ai.ml import Input
from azure.ai.ml import Output
from azure.ai.ml.constants import AssetTypes
# === Note on path ===
# can be can be a local path or a cloud path. AzureML supports https://`, `abfss://`, `wasbs://` and `azureml://` URIs.
# Local paths are automatically uploaded to the default datastore in the cloud.
# More details on supported paths: https://docs.microsoft.com/azure/machine-learning/how-to-read-write-data-v2#supported-paths
inputs = {
"cifar": Input(
type=AssetTypes.URI_FOLDER, path=returned_job.outputs.cifar.path
), # path="azureml:azureml_stoic_cartoon_wgb3lgvgky_output_data_cifar:1"), #path="azureml://datastores/workspaceblobstore/paths/azureml/stoic_cartoon_wgb3lgvgky/cifar/"),
"epoch": 10,
"batchsize": 64,
"workers": 2,
"lr": 0.01,
"momen": 0.9,
"prtfreq": 200,
"output": "./outputs",
}
from azure.ai.ml.entities import ResourceConfiguration
job = command(
code="./src", # local path where the code is stored
command="python train.py --data-dir ${{inputs.cifar}} --epochs ${{inputs.epoch}} --batch-size ${{inputs.batchsize}} --workers ${{inputs.workers}} --learning-rate ${{inputs.lr}} --momentum ${{inputs.momen}} --print-freq ${{inputs.prtfreq}} --model-dir ${{inputs.output}}",
inputs=inputs,
environment="azureml:AzureML-acpt-pytorch-2.2-cuda12.1@latest",
instance_count=2, # In this, only 2 node cluster was created.
distribution={
"type": "PyTorch",
# set process count to the number of gpus per node
# NC6s_v3 has only 1 GPU
"process_count_per_instance": 1,
},
)
job.resources = ResourceConfiguration(
instance_type="Standard_NC6s_v3", instance_count=2
) # Serverless compute resources
Пример Pytorch
- Полный набор записных книжек для запуска примера Pytorch см . в примерах azureml: распределенное обучение с помощью PyTorch на CIFAR-10.
DeepSpeed
поддерживается Машинное обучение AzureDeepSpeed как гражданин первого класса для запуска распределенных заданий с почти линейной масштабируемостью с точки зрения:
- Увеличение размера модели
- Увеличение числа gpu
DeepSpeed можно включить с помощью дистрибутива Pytorch или MPI для выполнения распределенного обучения. Машинное обучение Azure поддерживает средство запуска DeepSpeed для запуска распределенного обучения, а также автоматического настройки для получения оптимальной ds
конфигурации.
Вы можете использовать курированную среду для вне коробки с новейшими технологиями искусства, включая DeepSpeed, ORT, MSSCCL и Pytorch для заданий обучения DeepSpeed.
Пример DeepSpeed
- Примеры обучения и автонастройки DeepSpeed см . в этих папках.
TensorFlow
Если вы используете собственный распределенный TensorFlow в коде обучения, например API TensorFlow 2.xtf.distribute.Strategy
, можно запустить распределенное задание с помощью Машинное обучение Azure с помощью distribution
параметров или TensorFlowDistribution
объекта.
# create the command
job = command(
code="./src", # local path where the code is stored
command="python main.py --epochs ${{inputs.epochs}} --model-dir ${{inputs.model_dir}}",
inputs={"epochs": 1, "model_dir": "outputs/keras-model"},
environment="AzureML-tensorflow-2.16-cuda12@latest",
compute="cpu-cluster",
instance_count=2,
# distribution = {"type": "mpi", "process_count_per_instance": 1},
# distribution={
# "type": "tensorflow",
# "parameter_server_count": 1, # for legacy TensorFlow 1.x
# "worker_count": 2,
# "added_property": 7,
# },
# distribution = {
# "type": "pytorch",
# "process_count_per_instance": 4,
# "additional_prop": {"nested_prop": 3},
# },
display_name="tensorflow-mnist-distributed-example"
# experiment_name: tensorflow-mnist-distributed-example
# description: Train a basic neural network with TensorFlow on the MNIST dataset, distributed via TensorFlow.
)
# can also set the distribution in a separate step and using the typed objects instead of a dict
job.distribution = TensorFlowDistribution(worker_count=2)
Если в скрипте обучения используется стратегия сервера параметров для распределенного обучения, например для устаревшего TensorFlow 1.x, необходимо также указать количество серверов параметров, используемых в задании, внутри distribution
параметра.command
Например, в приведенном выше примере "parameter_server_count" : 1
и "worker_count": 2
.
TF_CONFIG
В TensorFlow для обучения на нескольких компьютерах требуется переменная среды TF_CONFIG
. Для заданий TensorFlow Машинное обучение Azure настраивает и задает TF_CONFIG
переменную соответствующим образом для каждой рабочей роли перед выполнением скрипта обучения.
Вы можете получить доступ TF_CONFIG
из скрипта обучения, если вам нужно: os.environ['TF_CONFIG']
Пример TF_CONFIG
, заданный на главном рабочем узле:
TF_CONFIG='{
"cluster": {
"worker": ["host0:2222", "host1:2222"]
},
"task": {"type": "worker", "index": 0},
"environment": "cloud"
}'
Пример TensorFlow
- Полные записные книжки для запуска примера TensorFlow см . в примерах azureml: обучение базовой нейронной сети с распределенным MPI в наборе данных MNIST с помощью Tensorflow с Horovod.
Ускорение распределенного обучения с поддержкой GPU с помощью InfiniBand
По мере увеличения количества виртуальных машин, обучающих модель, время, необходимое для обучения модели, должно уменьшаться. Уменьшение времени в идеальном случае должно быть пропорционально количеству обучающих виртуальных машин. Например, если обучение модели на одной виртуальной машине занимает 100 секунд, то при обучении той же модели на двух виртуальных машинах в идеале потребуется 50 секунд. Обучение модели на четырех виртуальных машинах займет 25 секунд и т. д.
InfiniBand может играть важную роль в обеспечении такого линейного масштабирования. InfiniBand обеспечивает связь на уровне GPU между узлами в кластере с низкой задержкой. Для работы с InfiniBand требуется специализированное оборудование. Некоторые серии виртуальных машин Azure, в частности серии NC, ND и H, теперь поддерживают виртуальные машины RDMA с поддержкой SR-IOV и InfiniBand. Эти виртуальные машины обмениваются данными по сети InfiniBand с низкой задержкой и высокой пропускной способностью, которая гораздо быстрее, чем сеть Ethernet. SR-IOV для InfiniBand обеспечивает почти производительность без операционной системы для любой библиотеки MPI (MPI используется многими распределенными платформами обучения и инструментами, включая программное обеспечение NCCL NVIDIA).) Эти номера SKU предназначены для удовлетворения потребностей вычислительных ресурсов с ускорением GPU в машинном обучении. Дополнительные сведения см. в разделе Accelerating Distributed Training in Azure Machine Learning with SR-IOV (Ускорение распределенного обучения в Машинном обучении Azure с помощью SR-IOV).
Как правило, номера SKU виртуальных машин с именем "r" содержат требуемое оборудование InfiniBand, и они без "r" обычно не выполняются. ("r" — это ссылка на RDMA, которая обозначает удаленный прямой доступ к памяти.) Например, номер SKU Standard_NC24rs_v3
виртуальной машины включен с поддержкой InfiniBand, но номер SKU Standard_NC24s_v3
не является. Помимо возможностей InfiniBand, спецификации между этими двумя номерами SKU в значительной степени одинаковы. Оба имеют 24 ядра, 448 ГБ ОЗУ, 4 GPU одного номера SKU и т. д. Дополнительные сведения об RDMA и о номерах SKU виртуальных машин, поддерживающих InfiniBand.
Предупреждение
Номер SKU Standard_NC24r
компьютера старшего поколения включен с поддержкой RDMA, но он не содержит аппаратного обеспечения SR-IOV, необходимого для InfiniBand.
При создании AmlCompute
кластера одного из этих размеров RDMA с поддержкой InfiniBand образ ОС поставляется с драйвером Mellanox OFED, необходимым для включения предварительно установленного и предварительно настроенного InfiniBand.