Поделиться через


Руководство по обучению распределенного GPU (пакет SDK версии 2)

ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python azure-ai-ml версии 2 (current)

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

Совет

Более 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. Для обучения на основе 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. Вы можете:

  1. Укажите скрипт обучения и аргументы.

  2. Создайте объект 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.