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

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

Přečtěte si další informace o používání distribuovaného trénovacího kódu GPU ve službě Azure Machine Learning. Tento článek vám pomůže spustit stávající distribuovaný trénovací kód a nabízí tipy a příklady, které můžete sledovat pro každou architekturu:

  • PyTorch
  • TensorFlow
  • Zrychlení trénování GPU pomocí InfiniBandu

Požadavky

Projděte si základní koncepty distribuovaného trénování GPU, jako je datový paralelismus, distribuovaný datový paralelismus a paralelismus modelu.

Tip

Pokud nevíte, jaký typ paralelismu použít, měli byste použít distribuovaný datový paralelismus více než 90 % času.

PyTorch

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

Tip

V případě datového paralelismu je oficiální pokyny PyTorchu použít DistributedDataParallel (DDP) přes DataParallel pro distribuované trénování s jedním uzlem i více uzly. PyTorch také doporučuje používat DistributedDataParallel přes balíček multiprocessingu. Dokumentace ke službě Azure Machine Learning a příklady se proto zaměřují na trénování DistributedDataParallel.

Inicializace skupiny procesů

Páteř všech distribuovaných trénování je založená na skupině procesů, které navzájem znají a můžou mezi sebou komunikovat pomocí back-endu. Pro PyTorch se skupina procesů vytvoří voláním torch.distributed.init_process_group ve všech distribuovaných procesech , aby souhrnně vytvořily skupinu procesů.

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

Nejběžnějšími používanými back-endy komunikace jsou mpi, nccla gloo. Pro trénování nccl na základě GPU se doporučuje nejlepší výkon a měl by se použít, kdykoli je to možné.

init_method informuje, jak se jednotlivé procesy můžou navzájem zjišťovat, jak inicializují a ověřují skupinu procesů pomocí back-endu komunikace. Pokud není zadáno, init_method PyTorch ve výchozím nastavení používá metodu inicializace proměnné prostředí (env://). init_method je doporučená inicializační metoda, která se použije v trénovacím kódu ke spuštění distribuovaného PyTorchu ve službě Azure Machine Learning. PyTorch hledá následující proměnné prostředí pro inicializaci:

  • MASTER_ADDR: IP adresa počítače, který hostuje proces s pořadím 0
  • MASTER_PORT: Bezplatný port na počítači, který je hostitelem procesu 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 0 až (velikost světa - 1)

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

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

  • LOCAL_RANK: Místní (relativní) pořadí procesu v rámci uzlu. Možné hodnoty jsou 0 až (počet procesů na uzlu – 1). Tyto informace jsou užitečné, protože mnoho operací, jako je příprava dat, by se mělo provádět 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 0 až (celkový počet uzlů – 1).

Nemusíte používat spouštěcí nástroj, jako je torch.distributed.launch. Spuštění distribuované úlohy PyTorch:

  1. Zadejte trénovací skript a argumenty.
  2. Vytvořte command a zadejte typ 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. process_count_per_instance by měla být obvykle rovna # of GPUs per node. Pokud process_count_per_instance není zadaný, Azure Machine Learning ve výchozím nastavení spustí jeden proces na uzel.

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

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

Příklad Pytorchu

DeepSpeed

Azure Machine Learning podporuje DeepSpeed jako prvotřídního občana pro spouštění distribuovaných úloh s téměř lineární škálovatelností z hlediska:

  • Zvětšení velikosti modelu
  • Zvýšení počtu grafických procesorů

DeepSpeed je možné povolit pomocí distribuce Pytorch nebo MPI pro spouštění distribuovaného trénování. 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 pro zastaralé prostředí s nejnovějšími špičkovými technologiemi, včetně DeepSpeed, ORT, MSSCCL a Pytorch pro vaše trénovací úlohy DeepSpeed.

Příklad DeepSpeed

  • Příklady trénování a automatického ladění DeepSpeed najdete v těchto složkách.

TensorFlow

Pokud ve svém trénovacím kódu, jako je například rozhraní API TensorFlow 2.xtf.distribute.Strategy, použijete nativní distribuovanou úlohu 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 váš trénovací skript používá strategii serveru parametrů pro distribuované trénování, například pro starší verzi TensorFlow 1.x, musíte také zadat počet serverů parametrů, které se mají použít v úloze, uvnitř distribution parametru command. Ve výše uvedeném příkladu a "parameter_server_count" : 1 "worker_count": 2.

TF_CONFIG

V TensorFlow TF_CONFIG se proměnná prostředí vyžaduje pro trénování na více počítačích. Pro úlohy TensorFlow azure Machine Learning nakonfiguruje a nastaví TF_CONFIG proměnnou odpovídajícím způsobem pro každý pracovní proces před spuštěním trénovacího skriptu.

Přístup z TF_CONFIG trénovacího skriptu získáte v případě, že potřebujete: os.environ['TF_CONFIG'].

Příklad TF_CONFIG nastavení na hlavním pracovním uzlu:

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

Příklad TensorFlow

Zrychlení distribuovaného trénování GPU pomocí InfiniBandu

S rostoucím počtem virtuálních počítačů trénování modelu by se měl zkrátit čas potřebný k trénování tohoto modelu. V ideálním případě by mělo být snížení času lineární úměrné 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 v ideálním případě trvat 50 sekund. Trénování modelu na čtyřech virtuálních počítačích by mělo trvat 25 sekund atd.

InfiniBand může být důležitým faktorem při dosažení tohoto lineárního měřítka. InfiniBand umožňuje komunikaci s GPU na GPU mezi uzly v clusteru s nízkou latencí. InfiniBand vyžaduje specializovaný hardware pro provoz. Některé řady virtuálních počítačů Azure, konkrétně nc, ND a H-series, teď mají virtuální počítače podporující RDMA s podporou SR-IOV a InfiniBand. Tyto virtuální počítače komunikují přes nízkou latenci a síť InfiniBand s velkou šířkou pásma, což je mnohem výkonnější než připojení založené na ethernetu. SR-IOV pro InfiniBand umožňuje téměř holý výkon pro libovolnou knihovnu MPI (MPI používá mnoho distribuovaných trénovacích architektur a nástrojů, včetně softwaru NCCL NVIDIA.) Tyto skladové položky jsou určené ke splnění potřeb výpočetních úloh s akcelerovanými 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 názvu obvykle obsahují požadovaný hardware InfiniBand a ty bez r obvykle ne. ("r" je odkaz na RDMA, což je zkratka pro přímý přístup do paměti vzdáleného přístupu.) Skladová položka virtuálního počítače Standard_NC24rs_v3 je například povolená pro InfiniBand, ale skladová Standard_NC24s_v3 položka není. Kromě možností InfiniBand jsou specifikace mezi těmito dvěma skladovými jednotkami z velké části stejné. Oba mají 24 jader, 448 GB RAM, 4 GPU stejné skladové položky atd. Přečtěte si další informace o SKU počítačů s podporou RDMA a InfiniBand.

Upozorňující

Skladová položka Standard_NC24r počítače starší generace je povolená SDMA, ale neobsahuje hardware SR-IOV vyžadovaný pro InfiniBand.

Pokud vytvoříte AmlCompute cluster s jednou z těchto velikostí podporujících RDMA, dodává se image operačního systému s ovladačem Mellanox OFED vyžadovaným k povolení předinstalovaného a předkonfigurovaného infiniBandu.

Další kroky