Elosztott GPU betanítási útmutató (SDK v2)
A KÖVETKEZŐKRE VONATKOZIK: Python SDK azure-ai-ml v2 (aktuális)
További információ az elosztott GPU-betanítási kód Azure Machine Learningben való használatáról. Ez a cikk segítséget nyújt a meglévő elosztott betanítási kód futtatásában, és tippeket és példákat kínál az egyes keretrendszerek követéséhez:
- PyTorch
- TensorFlow
- GPU-betanítás felgyorsítása az InfiniBand használatával
Előfeltételek
Tekintse át az elosztott GPU-betanítás alapfogalmait, például az adat-párhuzamosságot, az elosztott adat-párhuzamosságot és a modell-párhuzamosságot.
Tipp.
Ha nem tudja, hogy milyen típusú párhuzamosságot használjon, az idő több mint 90%-ában elosztott adat-párhuzamosságot kell használnia.
PyTorch
Az Azure Machine Learning támogatja az elosztott feladatok futtatását a PyTorch natív elosztott betanítási képességeivel (torch.distributed
).
Tipp.
Az adat-párhuzamossághoz a PyTorch hivatalos útmutatója az DistributedDataParallel (DDP) használata DataParallel-en keresztül az egycsomópontos és a többcsomópontos elosztott betanításhoz. A PyTorch az DistributedDataParallel használatát is javasolja a többprocesszoros csomagon keresztül. Az Azure Machine Learning dokumentációja és példái ezért az DistributedDataParallel betanítására összpontosítanak.
Folyamatcsoport inicializálása
Az elosztott képzések gerince olyan folyamatokon alapul, amelyek ismerik egymást, és egy háttérrendszer használatával kommunikálhatnak egymással. A PyTorch esetében a folyamatcsoport úgy jön létre, hogy meghívja torch.distributed.init_process_group az összes elosztott folyamatból, hogy együttesen alakítsanak ki egy folyamatcsoportot.
torch.distributed.init_process_group(backend='nccl', init_method='env://', ...)
A leggyakrabban használt kommunikációs háttérrendszerek a következők mpi
: , nccl
és gloo
. GPU-alapú betanítás esetén a legjobb teljesítmény érdekében ajánlott, nccl
és lehetőség szerint érdemes használni.
init_method
ismerteti, hogy az egyes folyamatok hogyan deríthetik fel egymást, hogyan inicializálják és ellenőrzik a folyamatcsoportot a kommunikációs háttérrendszer használatával. Ha nincs megadva, init_method
a PyTorch alapértelmezés szerint a környezeti változó inicializálási metódusát (env://
) használja. init_method
Az ajánlott inicializálási módszer, amelyet a betanítási kódban az elosztott PyTorch Azure Machine Learningen való futtatásához érdemes használni. A PyTorch a következő környezeti változókat keresi az inicializáláshoz:
MASTER_ADDR
: A folyamatot 0. ranggal üzemeltető gép IP-címeMASTER_PORT
: Egy ingyenes port a gépen, amely a folyamatot a 0. ranggal üzemeltetiWORLD_SIZE
: A folyamatok teljes száma. Egyenlőnek kell lennie az elosztott betanításhoz használt eszközök (GPU) teljes számávalRANK
: Az aktuális folyamat (globális) rangja. A lehetséges értékek 0 és (világméret – 1)
A folyamatcsoportok inicializálásával kapcsolatos további információkért tekintse meg a PyTorch dokumentációját.
Számos alkalmazásnak a következő környezeti változókra is szüksége van:
LOCAL_RANK
: A csomóponton belüli folyamat helyi (relatív) rangja. A lehetséges értékek 0 és (a csomóponton lévő folyamatok száma – 1). Ez az információ azért hasznos, mert sok műveletet, például az adatelőkészítést csomópontonként csak egyszer kell végrehajtani, általában local_rank = 0 értéken.NODE_RANK
: A csomópont rangja a többcsomópontos betanításhoz. A lehetséges értékek 0 és (csomópontok teljes száma – 1).
Nem kell olyan indító segédprogramot használnia, mint a torch.distributed.launch
. Elosztott PyTorch-feladat futtatása:
- Adja meg a betanítási szkriptet és az argumentumokat.
- Hozzon létre egy értéket
command
, és adja meg a paraméter típusát ésprocess_count_per_instance
distribution
típusátPyTorch
. Ezprocess_count_per_instance
a feladathoz futtatni kívánt folyamatok teljes számának felel meg.process_count_per_instance
általában egyenlőnek kell lennie.# of GPUs per node
Haprocess_count_per_instance
nincs megadva, az Azure Machine Learning alapértelmezés szerint csomópontonként egy folyamatot indít el.
Az Azure Machine Learning beállítja az egyes csomópontokon a MASTER_ADDR
, MASTER_PORT
, WORLD_SIZE
és NODE_RANK
környezeti változókat, és beállítja a folyamatszintű RANK
és LOCAL_RANK
a környezeti változókat.
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-példa
- A Pytorch-példa futtatásához a teljes jegyzetfüzethez tekintse meg az azureml-példákat: Elosztott betanítás a PyTorch-tal a CIFAR-10-en.
DeepSpeed
Az Azure Machine Learning első osztályú polgárként támogatja a DeepSpeedet az elosztott feladatok közel lineáris skálázhatóságával való futtatásához a következők tekintetében:
- A modell méretének növelése
- GPU-k számának növekedése
A DeepSpeed pytorch-disztribúció vagy MPI használatával engedélyezhető elosztott betanítás futtatásához. Az Azure Machine Learning támogatja a DeepSpeed-indítót az elosztott betanítás elindításához és az automatikustuninghoz az optimális ds
konfiguráció érdekében.
Válogatott környezeteket használhat a környezeten kívüli környezetekhez a legújabb korszerű technológiákkal, például a DeepSpeed, az ORT, az MSSCCL és a Pytorch használatával a DeepSpeed betanítási feladataihoz.
DeepSpeed-példa
- A DeepSpeed-betanítási és automatikustuning-példákért tekintse meg ezeket a mappákat.
TensorFlow
Ha natív elosztott TensorFlow-t használ a betanítási kódban, például a TensorFlow 2.x API-jábantf.distribute.Strategy
, az elosztott feladatot az Azure Machine Learningen keresztül indíthatja el paraméterek vagy az TensorFlowDistribution
objektum használatávaldistribution
.
# 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)
Ha a betanítási szkript a paraméterkiszolgáló-stratégiát használja az elosztott betanításhoz, például az örökölt TensorFlow 1.x-hez, meg kell adnia a feladatban használandó paraméterkiszolgálók számát is a distribution
command
paraméter paraméterén belül. A fentiekben például és "parameter_server_count" : 1
"worker_count": 2
.
TF_CONFIG
A TensorFlow-ban a TF_CONFIG
környezeti változóra több gépen való betanításhoz van szükség. TensorFlow-feladatok esetén az Azure Machine Learning az egyes feldolgozókhoz megfelelően konfigurálja és állítja be a TF_CONFIG
változót a betanítási szkript végrehajtása előtt.
A betanítási szkriptből a következő esetekben férhet hozzá TF_CONFIG
: os.environ['TF_CONFIG']
.
Példa TF_CONFIG
egy fő feldolgozó csomóponton:
TF_CONFIG='{
"cluster": {
"worker": ["host0:2222", "host1:2222"]
},
"task": {"type": "worker", "index": 0},
"environment": "cloud"
}'
TensorFlow-példa
- A TensorFlow-példa futtatásához a teljes jegyzetfüzethez tekintse meg az azureml-példákat: Alapszintű neurális hálózat betanítása elosztott MPI-vel az MNIST-adatkészleten a Tensorflow és a Horovod használatával.
Elosztott GPU-betanítás felgyorsítása az InfiniBand használatával
A modellek betanításának számának növekedésével a modell betanításához szükséges időnek csökkennie kell. Az idő csökkenésének ideális esetben lineárisan arányosnak kell lennie a betanítási virtuális gépek számával. Ha például egy modell betanítása egy virtuális gépen 100 másodpercet vesz igénybe, akkor ugyanazon modell betanítása két virtuális gépen ideális esetben 50 másodpercet vesz igénybe. A modell betanítása négy virtuális gépen 25 másodpercet vesz igénybe, és így tovább.
Az InfiniBand fontos tényező lehet ennek a lineáris skálázásnak a elérésében. Az InfiniBand alacsony késleltetésű, GPU–GPU kommunikációt tesz lehetővé a fürt csomópontjai között. Az InfiniBand használatához speciális hardver szükséges. Egyes Azure-beli virtuálisgép-sorozatok, különösen az NC, az ND és a H sorozat mostantól RDMA-kompatibilis virtuális gépekkel rendelkeznek SR-IOV és InfiniBand támogatással. Ezek a virtuális gépek alacsony késéssel és nagy sávszélességű InfiniBand-hálózaton keresztül kommunikálnak, ami sokkal teljesítményesebb, mint az Ethernet-alapú kapcsolat. Az InfiniBandhez készült SR-IOV szinte bármilyen MPI-kódtár esetében lehetővé teszi az operációs rendszer nélküli teljesítményt (az MPI-t számos elosztott betanítási keretrendszer és eszköz, köztük az NVIDIA NCCL-szoftvere használja.) Ezek a termékváltozatok a számításigényes, GPU-gyorsított gépi tanulási számítási feladatok igényeinek kielégítésére szolgálnak. További információ: Az elosztott képzés felgyorsítása az Azure Machine Learningben az SR-IOV használatával.
A nevükben "r" betűvel ellátott virtuálisgép-termékváltozatok általában tartalmazzák a szükséges InfiniBand-hardvert, és az "r" nélküli virtuálisgép-termékváltozatok általában nem. Az "r" az RDMA-ra való hivatkozás, amely a közvetlen távoli memóriahozzáférést jelenti.) A virtuálisgép-termékváltozat Standard_NC24rs_v3
például InfiniBand-kompatibilis, de a termékváltozat Standard_NC24s_v3
nem. Az InfiniBand képességein kívül a két termékváltozat specifikációi nagyrészt megegyeznek. Mindkettő 24 maggal, 448 GB RAM-mal, 4 GPU-val rendelkezik ugyanahhoz a termékváltozathoz stb. További információ az RDMA- és InfiniBand-kompatibilis gépi termékváltozatokról.
Figyelmeztetés
A régebbi generációs gép termékváltozata Standard_NC24r
RDMA-kompatibilis, de nem tartalmaz az InfiniBandhoz szükséges SR-IOV hardvert.
Ha egy ilyen RDMA-kompatibilis, InfiniBand-kompatibilis méretű fürtöt hoz létre AmlCompute
, az operációs rendszer képe tartalmazza az InfiniBand előtelepített és előre konfigurált infiniBand engedélyezéséhez szükséges Mellanox OFED illesztőprogramot.