Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ:
Пакет SDK для Python azure-ai-ml версии 2 (current)
В этой статье описывается использование распределенного кода обучения GPU в Машинном обучении Azure. Вы узнаете, как запустить существующий код с советами и примерами pyTorch, DeepSpeed и TensorFlow. Вы также узнаете об ускорении распределенного обучения GPU с помощью InfiniBand.
Совет
Более 90% времени следует использовать параллелизм распределенных данных в качестве типа распределенного параллелизма.
Предпосылка
- Основные понятия распределенного обучения GPU, такие как параллелизм данных, параллелизм распределенных данных и параллелизм моделей.
-
Пакет SDK машинного обучения Azure для Python с установленным пакетом
azure-ai-mlверсии 1.5.0 или более поздней.
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. Для обучения на основе GPU используйте nccl для оптимальной производительности.
Чтобы запустить распределенный PyTorch в Azure Machine Learning, используйте параметр init_method в вашем коде обучения. Этот параметр указывает, как каждый процесс обнаруживает другие процессы и как они инициализируют и проверяют группу процессов с помощью серверной части связи. По умолчанию, если не указать init_method, PyTorch использует метод env://инициализации переменной среды.
PyTorch ищет следующие переменные среды для инициализации:
-
MASTER_ADDR: IP-адрес компьютера, на котором размещается процесс с рангом
0. -
MASTER_PORT: бесплатный порт на компьютере, в котором размещается процесс с рангом
0. - WORLD_SIZE: общее количество процессов. Должно быть равно общему количеству устройств GPU, используемых для распределенного обучения.
-
RANK: глобальный ранг текущего процесса. Возможные значения :
0(<world size> - 1)
Дополнительные сведения об инициализации группы процессов см. в документации по PyTorch.
Переменные среды
Многие приложения также нуждаются в следующих переменных среды:
-
LOCAL_RANK: локальный относительный ранг процесса в узле. Возможные значения :
0(<# of processes on the node> - 1)Эта информация полезна, так как многие операции, такие как подготовка данных, требуется выполнять только один раз для каждого узла, обычно наlocal_rank = 0. -
NODE_RANK: ранг узла для обучения с несколькими узлами. Возможные значения :
0(<total # of nodes> - 1)
Выполнение распределенного задания PyTorch
Вам не нужно использовать служебную программу запуска, например torch.distributed.launch для запуска распределенного задания PyTorch. Вы можете:
Укажите скрипт обучения и аргументы.
Создайте объект
commandи укажите егоtypeкакPyTorchиprocess_count_per_instanceв параметреdistribution.Соответствует
process_count_per_instanceобщему количеству процессов, которые необходимо запустить для задания, и обычно должно быть равно количеству GPU на узел. Если не указатьprocess_count_per_instance, Машинное обучение Azure запускает один процесс на узел по умолчанию.
Машинное обучение Azure устанавливает переменные среды MASTER_ADDR, MASTER_PORT, WORLD_SIZE и NODE_RANK на каждом узле, а также задает процессные переменные RANK и LOCAL_RANK.
Пример PyTorch
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.8-cuda12.6@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_NC4AS_T4_V3", instance_count=2
) # Serverless compute resources
Полный набор записных книжек для запуска примера PyTorch см . в примерах azureml: распределенное обучение с помощью PyTorch на CIFAR-10.
DeepSpeed
Машинное обучение Azure поддерживает DeepSpeed в качестве функции верхнего уровня для выполнения распределенных заданий с близкой линейной масштабируемостью для увеличения размера модели и увеличения числа GPU.
Вы можете включить DeepSpeed для выполнения распределенного обучения с помощью дистрибутива PyTorch или интерфейса передачи сообщений (MPI). Машинное обучение Azure поддерживает инструмент запуска DeepSpeed для запуска распределенного обучения и автоматической настройки, чтобы получить оптимальную ds конфигурацию.
Вы можете использовать курированную среду с новейшими технологиями, включая DeepSpeed, ONNX (Open Neural Network Exchange) Runtime (ORT), Microsoft Collective Communication Library (MSSCCL) и PyTorch для заданий обучения DeepSpeed.
Пример DeepSpeed
Примеры обучения и автоматической настройки DeepSpeed см. в разделе https://github.com/Azure/azureml-examples/cli/jobs/deepspeed.
ТензорФлоу
Если вы используете родной для TensorFlow распределенный режим в вашем коде обучения, например, API TensorFlow 2.x tf.distribute.Strategy, вы можете запустить распределённое задание через Azure Machine Learning, используя параметры 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, необходимо также указать количество серверов параметров, используемых в задании. В предыдущем примере указывается "parameter_server_count" : 1 и "worker_count": 2 внутри distribution параметра объекта command.
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 с полной записной книгой, см. пример tensorflow-mnist-distributed-example.
InfiniBand
По мере увеличения числа виртуальных машин, которые обучают модель, время, необходимое для обучения этой модели, должно уменьшаться в линейной пропорции к количеству обучающих виртуальных машин. Например, если обучение модели на одной виртуальной машине занимает 100 секунд, обучение одной и той же модели на двух виртуальных машинах должно занять 50 секунд, обучение модели на четырех виртуальных машинах должно занять 25 секунд и т. д.
InfiniBand поможет вам, позволяя достичь линейного масштабирования, обеспечивая низкую задержку и эффективный обмен данными между графическими процессорами (GPU) в узлах кластера. InfiniBand требует специализированного оборудования для функционирования, например виртуальных машин Azure серий NC-, ND- и H-. Эти виртуальные машины поддерживают удалённый доступ к памяти (RDMA), виртуализацию ввода-вывода единого корня (SR-IOV) и InfiniBand.
Эти виртуальные машины взаимодействуют через сеть InfiniBand с низкой задержкой и высокой пропускной способностью, которая работает лучше, чем подключение на основе Ethernet. SR-IOV для InfiniBand обеспечивает производительность близко к уровню физического оборудования для любой библиотеки MPI, используемой многими распределенными фреймворками обучения и инструментами, такими как библиотека коллективных коммуникаций NVIDIA (NCCL).
Эти товарные единицы учета (SKU) предназначены для удовлетворения потребностей в вычислительных нагрузках, которые являются интенсивными и ускоряются с помощью GPU в задачах машинного обучения. Дополнительные сведения см. в разделе Accelerating Distributed Training in Azure Machine Learning with SR-IOV (Ускорение распределенного обучения в Машинном обучении Azure с помощью SR-IOV).
Как правило, только номера SKU виртуальных машин с R в именах, ссылающиеся на RDMA, содержат необходимое оборудование InfiniBand. Например, у SKU Standard_NC24rs_v3 виртуальной машины есть поддержка InfiniBand, но у Standard_NC24s_v3 нет. Спецификации этих двух номеров SKU в значительной степени одинаковы, за исключением возможностей InfiniBand. Оба SKU имеют 24 ядра, 448 ГБ ОЗУ, 4 GPU одной модели и т.п. Дополнительные сведения о конфигурациях SKU с включённой поддержкой RDMA и InfiniBand см. в разделе "Высокопроизводительные вычисления".
Замечание
SKU Standard_NC24r для машины старшего поколения с поддержкой RDMA, но без оборудования SR-IOV, необходимого для InfiniBand.
Если вы создаете AmlCompute кластер, используя один из размеров с поддержкой RDMA и InfiniBand, образ ОС поставляется с предварительно установленным и настроенным драйвером Mellanox OpenFabrics Enterprise Distribution (OFED), необходимым для включения InfiniBand.