Průvodce trénováním distribuovaného GPU (SDK v2)

PLATÍ PRO: Python SDK azure-ai-ml v2 (aktuální)

Tento článek popisuje, jak používat distribuovaný trénovací kód GPU ve službě Azure Machine Learning. Zjistíte, jak spustit existující kód s tipy a příklady pro PyTorch, DeepSpeed a TensorFlow. Dozvíte se také o urychlení distribuovaného trénování GPU pomocí InfiniBandu.

Návod

Více než 90% času byste jako typ distribuovaného paralelismu měli použít distribuovaný datový paralelismus .

Předpoklad

PyTorch

Azure Machine Learning podporuje spouštění distribuovaných úloh pomocí nativních funkcí distribuovaného trénování PyTorch. torch.distributed

V případě datového paralelismu oficiální pokyny společnosti PyTorch doporučují používat DistributedDataParallel (DDP) místo DataParallel pro distribuovaný trénink jak pro jednouzlové, tak víciuzlové prostředí. PyTorch také doporučuje používat DistributedDataParallel přes balíček multiprocessingu. Proto se dokumentace a příklady služby Azure Machine Learning zaměřují na trénování DistributedDataParallel.

Inicializace skupiny procesů

Páteří každého distribuovaného trénování je skupina procesů, které mezi sebou rozpoznávají a můžou vzájemně komunikovat pomocí back-endu. Pro PyTorch vytvoříte skupinu procesů voláním torch.distributed.init_process_group ve všech distribuovaných procesech, které společně tvoří skupinu procesů.

torch.distributed.init_process_group(backend='nccl', init_method='env://', ...)

Nejběžnějšími back-endy komunikace jsou mpi, nccla gloo. Pro trénování založené na GPU použijte nccl pro nejlepší výkon.

Pokud chcete spustit distribuovaný PyTorch ve službě Azure Machine Learning, použijte parametr v trénovacím init_method kódu. Tento parametr určuje, jak každý proces zjistí ostatní procesy a jak inicializuje a ověří skupinu procesů pomocí back-endu komunikace. Ve výchozím nastavení, pokud nezadáte init_method, PyTorch použije metodu inicializace proměnných prostředí env://.

PyTorch hledá následující proměnné prostředí pro inicializaci:

  • MASTER_ADDR: IP adresa počítače, který je hostitelem procesu s pořadím 0.
  • MASTER_PORT: Volný port na počítači, který hostuje proces s pořadím 0.
  • WORLD_SIZE: Celkový počet procesů. Měl by se rovnat celkovému počtu zařízení GPU používaných k distribuovanému trénování.
  • RANK: Globální pořadí aktuálního procesu. Možné hodnoty jsou od 0 do (<world size> - 1).

Další informace o inicializaci skupin procesů najdete v dokumentaci k PyTorch.

Proměnné prostředí

Mnoho aplikací také potřebuje následující proměnné prostředí:

  • LOCAL_RANK: Místní relativní pořadí procesu v uzlu. Možné hodnoty jsou od 0 až do (<# of processes on the node> - 1). Tyto informace jsou užitečné, protože mnoho operací, jako je příprava dat, stačí provést pouze jednou na uzel, obvykle na local_rank = 0.
  • NODE_RANK: Pořadí uzlu pro trénování s více uzly. Možné hodnoty jsou od 0 do (<total # of nodes> - 1).

Spuštění distribuované úlohy PyTorch

Ke spuštění distribuované úlohy PyTorch nemusíte používat spouštěcí nástroj torch.distributed.launch . Můžete:

  1. Zadejte trénovací skript a argumenty.

  2. Vytvořte command, a zadejte type jako PyTorch a process_count_per_instance v parametru distribution.

    Odpovídá process_count_per_instance celkovému počtu procesů, které chcete pro úlohu spustit, a obvykle by se měl rovnat počtu GPU na uzel. Pokud nezadáte process_count_per_instance, Azure Machine Learning ve výchozím nastavení spustí jeden proces na uzel.

Azure Machine Learning nastaví na každém uzlu proměnné prostředí MASTER_ADDR, MASTER_PORT, WORLD_SIZE a NODE_RANK a na úrovni procesu nastaví proměnné prostředí RANK a LOCAL_RANK.

Příklad PyTorchu

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

Úplný poznámkový blok pro spuštění příkladu PyTorch najdete v tématu azureml-examples: Distribuované trénování pomocí PyTorchu na CIFAR-10.

DeepSpeed

Azure Machine Learning podporuje DeepSpeed jako funkci nejvyšší úrovně pro spouštění distribuovaných úloh s téměř lineární škálovatelností pro větší velikost modelu a zvýšená čísla GPU.

DeepSpeed můžete povolit pro spouštění distribuovaného trénování pomocí distribuce PyTorch nebo rozhraní MPI (Message Passing Interface). Azure Machine Learning podporuje spouštěč DeepSpeed ke spuštění distribuovaného trénování a automatické ladění pro zajištění optimální ds konfigurace.

Kurátorované prostředí můžete použít s nejmodernějšími technologiemi, včetně DeepSpeed, ONNX (Open Neural Network Exchange) Runtime (ORT), knihovny Microsoft Collective Communication Library (MSSCCL) a PyTorch pro DeepSpeed trénovací úlohy.

Příklad DeepSpeed

Příklady trénování a automatického ladění DeepSpeed najdete v tématu https://github.com/Azure/azureml-examples/cli/jobs/deepspeed.

TensorFlow

Pokud v trénovacím kódu, jako je například rozhraní API TensorFlow 2.x, použijete tf.distribute.Strategy úlohu spustit prostřednictvím služby Azure Machine Learning pomocí distribution parametrů nebo objektuTensorFlowDistribution.

# 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)

Pokud trénovací skript používá pro distribuované trénování strategii serveru parametrů, například pro starší verzi TensorFlow 1.x, musíte také zadat počet serverů parametrů, které se mají v úloze použít. V předchozím příkladu zadáte "parameter_server_count" : 1 a "worker_count": 2 uvnitř distribution parametru command.

TF_CONFIG

Pokud chcete trénovat na více počítačích v TensorFlow, použijte proměnnou TF_CONFIG prostředí. Pro úlohy TensorFlow Azure Machine Learning nastaví TF_CONFIG proměnnou správně pro každou pracovní jednotku před spuštěním trénovacího skriptu.

K TF_CONFIG máte přístup ze svého tréninkového skriptu, pokud to potřebujete, pomocí os.environ['TF_CONFIG'].

Následující příklad nastaví TF_CONFIG na hlavním pracovním uzlu:

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

Příklad TensorFlow

Úplný poznámkový blok pro spuštění příkladu TensorFlow najdete v příkladu tensorflow-mnist-distributed-example.

InfiniBand

Při zvyšování počtu virtuálních počítačů, které model trénují, by se doba potřebná k trénování tohoto modelu měla snížit lineární podíl na počtu trénovacích virtuálních počítačů. Pokud například trénování modelu na jednom virtuálním počítači trvá 100 sekund, trénování stejného modelu na dvou virtuálních počítačích by mělo trvat 50 sekund, trénování modelu na čtyřech virtuálních počítačích by mělo trvat 25 sekund atd.

InfiniBand vám může pomoct dosáhnout tohoto lineárního škálování povolením komunikace s nízkou latencí a GPU mezi uzly v clusteru. InfiniBand vyžaduje specializovaný hardware pro provoz, jako je virtuální počítač Azure řady NC-, ND- nebo H. Tyto virtuální počítače disponují schopností vzdáleného přímého přístupu do paměti (RDMA) a podporují virtualizaci vstupně-výstupních operací s jedním kořenem (SR-IOV) a také InfiniBand.

Tyto virtuální počítače komunikují přes síť InfiniBand s nízkou latencí a velkou šířkou pásma, která funguje lépe než připojení založené na síti Ethernet. SR-IOV pro InfiniBand umožňuje téměř výkon na úrovni fyzického hardwaru pro jakoukoli knihovnu MPI, jaká se používá v mnoha rámci pro distribuované školení a nástroje, jako je knihovna NVIDIA Collective Communications Library (NCCL).

Tyto skladové jednotky (SKU) jsou určené ke splnění potřeb výpočetně náročných úloh strojového učení akcelerovaných pomocí GPU. Další informace najdete v tématu Urychlení distribuovaného trénování ve službě Azure Machine Learning pomocí SR-IOV.

Skladové položky virtuálních počítačů s r v jejich názvech obvykle obsahují požadovaný hardware InfiniBand, který odkazuje na RDMA. Položka VM SKU Standard_NC24rs_v3 například podporuje InfiniBand, ale Standard_NC24s_v3 nikoliv. Specifikace těchto dvou skladových položek jsou z velké části stejné s výjimkou funkcí InfiniBand. Obě zákaznické jednotky mají 24 jader, 448 GB RAM, 4 GPU stejné zákaznické jednotky a podobně. Další informace o SKU počítačů s podporou RDMA a InfiniBand najdete v tématu Vysokovýkonné výpočetní prostředky.

Poznámka:

Stroj starší generace Standard_NC24r je vybaven RDMA, ale neobsahuje hardwarové zařízení SR-IOV požadované pro InfiniBand.

Pokud vytvoříte AmlCompute cluster s použitím jedné z těchto velikostí podporujících RDMA a InfiniBand, operační systém bude obsahovat předinstalovaný a předkonfigurovaný ovladač Mellanox OpenFabrics Enterprise Distribution (OFED), který je nutný k povolení InfiniBandu.