Przewodnik trenowania rozproszonego procesora GPU (zestaw SDK w wersji 2)
DOTYCZY: Zestaw PYTHON SDK azure-ai-ml w wersji 2 (bieżąca)
Dowiedz się więcej o korzystaniu z rozproszonego kodu trenowania procesora GPU w usłudze Azure Machine Learning. Ten artykuł ułatwia uruchamianie istniejącego rozproszonego kodu szkoleniowego oraz oferuje porady i przykłady, które należy wykonać dla każdej platformy:
- PyTorch
- TensorFlow
- Przyspieszanie trenowania procesora GPU za pomocą rozwiązania InfiniBand
Wymagania wstępne
Zapoznaj się z podstawowymi pojęciami dotyczącymi trenowania rozproszonego procesora GPU, takimi jak równoległość danych, równoległość rozproszonych danych i równoległość modelu.
Napiwek
Jeśli nie wiesz, jakiego typu równoległości używać, ponad 90% czasu należy użyć rozproszonego równoległości danych.
PyTorch
Usługa Azure Machine Learning obsługuje uruchamianie rozproszonych zadań przy użyciu natywnych funkcji trenowania rozproszonego PyTorch (torch.distributed
).
Napiwek
W przypadku równoległości danych oficjalna wskazówka PyTorch polega na korzystaniu z metody DistributedDataParallel (DDP) na potrzeby trenowania rozproszonego zarówno w jednym węźle, jak i w wielu węzłach. Firma PyTorch zaleca również używanie elementu DistributedDataParallel w pakiecie wieloprocesorowym. W związku z tym dokumentacja usługi Azure Machine Learning i przykłady koncentrują się na trenowaniu DistributedDataParallel.
Inicjowanie grupy procesów
Szkielet każdego trenowania rozproszonego opiera się na grupie procesów, które znają się nawzajem i mogą komunikować się ze sobą przy użyciu zaplecza. W przypadku usługi PyTorch grupa procesów jest tworzona przez wywołanie torch.distributed.init_process_group we wszystkich procesach rozproszonych w celu utworzenia grupy procesów .
torch.distributed.init_process_group(backend='nccl', init_method='env://', ...)
Najczęściej używane zaplecza komunikacji to mpi
, nccl
i gloo
. W przypadku trenowania nccl
opartego na procesorze GPU zaleca się stosowanie najlepszych wydajności i należy ich używać zawsze, gdy jest to możliwe.
init_method
informuje, jak każdy proces może odnaleźć się nawzajem, jak zainicjować i zweryfikować grupę procesów przy użyciu zaplecza komunikacji. Domyślnie, jeśli init_method
nie zostanie określony, PyTorch używa metody inicjowania zmiennej środowiskowej (env://
). init_method
to zalecana metoda inicjowania używana w kodzie trenowania do uruchamiania rozproszonej biblioteki PyTorch w usłudze Azure Machine Learning. PyTorch szuka następujących zmiennych środowiskowych do inicjowania:
MASTER_ADDR
: adres IP maszyny, która hostuje proces o klasyfikacji 0MASTER_PORT
: wolny port na maszynie, która hostuje proces o godzinie 0WORLD_SIZE
: całkowita liczba procesów. Powinna być równa całkowitej liczbie urządzeń (GPU) używanych do trenowania rozproszonegoRANK
: (globalna) ranga bieżącego procesu. Możliwe wartości to od 0 do (rozmiar świata — 1)
Aby uzyskać więcej informacji na temat inicjowania grupy procesów, zobacz dokumentację PyTorch.
Wiele aplikacji wymaga również następujących zmiennych środowiskowych:
LOCAL_RANK
: lokalna (względna) ranga procesu w węźle. Możliwe wartości to od 0 do (liczba procesów w węźle — 1). Te informacje są przydatne, ponieważ wiele operacji, takich jak przygotowywanie danych, powinno być wykonywanych tylko raz na węzeł, zwykle na local_rank = 0.NODE_RANK
: ranga węzła na potrzeby trenowania wielu węzłów. Możliwe wartości to od 0 do (łączna liczba węzłów — 1).
Nie musisz używać narzędzia uruchamiania, takiego jak torch.distributed.launch
. Aby uruchomić rozproszone zadanie PyTorch:
- Określ skrypt trenowania i argumenty.
- Utwórz element
command
i określ typ jakoPyTorch
iprocess_count_per_instance
w parametrzedistribution
. Odpowiadaprocess_count_per_instance
całkowitej liczbie procesów, które chcesz uruchomić dla zadania.process_count_per_instance
zazwyczaj powinna być równa# of GPUs per node
. Jeśliprocess_count_per_instance
nie zostanie określony, usługa Azure Machine Learning domyślnie uruchomi jeden proces na węzeł.
Usługa Azure Machine Learning ustawia MASTER_ADDR
zmienne środowiskowe , MASTER_PORT
, WORLD_SIZE
i NODE_RANK
w każdym węźle oraz ustawia zmienne środowiskowe i LOCAL_RANK
na poziomie RANK
procesu.
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
Przykład Pytorch
- Pełny notes do uruchomienia przykładu Pytorch można znaleźć w temacie azureml-examples: Distributed training with PyTorch on CIFAR-10 (Trenowanie rozproszone za pomocą narzędzia PyTorch w systemie CIFAR-10).
DeepSpeed
Usługa Azure Machine Learning obsługuje funkcję DeepSpeed jako obywatel pierwszej klasy do uruchamiania zadań rozproszonych z niemal liniową skalowalnością w zakresie:
- Zwiększenie rozmiaru modelu
- Zwiększenie liczby procesorów GPU
DeepSpeed można włączyć przy użyciu dystrybucji Pytorch lub MPI do uruchamiania trenowania rozproszonego. Usługa Azure Machine Learning obsługuje uruchamianie modułu uruchamiania DeepSpeed w celu uruchomienia trenowania rozproszonego, a także automatycznego dostrajania w celu uzyskania optymalnej ds
konfiguracji.
Możesz użyć nadzorowanego środowiska dla gotowego środowiska z najnowszymi technologiami, takimi jak DeepSpeed, ORT, MSSCCL i Pytorch na potrzeby zadań szkoleniowych DeepSpeed.
Przykład deepSpeed
- Aby zapoznać się z przykładami trenowania i automatycznego dostrajania deepspeed, zobacz te foldery.
TensorFlow
Jeśli używasz natywnego rozproszonego biblioteki TensorFlow w kodzie trenowania, takim jak interfejs API tensorFlow 2.x tf.distribute.Strategy
, możesz uruchomić zadanie rozproszone za pośrednictwem usługi Azure Machine Learning przy użyciu distribution
parametrów lub TensorFlowDistribution
obiektu.
# 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)
Jeśli skrypt trenowania używa strategii serwera parametrów do trenowania rozproszonego, takiego jak starsza wersja TensorFlow 1.x, należy również określić liczbę serwerów parametrów do użycia w zadaniu wewnątrz distribution
parametru command
. W powyższych "parameter_server_count" : 1
przykładach i "worker_count": 2
.
TF_CONFIG
W systemie TensorFlow zmienna środowiskowa jest wymagana TF_CONFIG
do trenowania na wielu maszynach. W przypadku zadań TensorFlow usługa Azure Machine Learning konfiguruje i ustawia zmienną TF_CONFIG
odpowiednio dla każdego procesu roboczego przed wykonaniem skryptu szkoleniowego.
Jeśli potrzebujesz: , możesz uzyskać dostęp ze TF_CONFIG
skryptu szkoleniowego: os.environ['TF_CONFIG']
.
Przykład TF_CONFIG
ustawiony w węźle głównego procesu roboczego:
TF_CONFIG='{
"cluster": {
"worker": ["host0:2222", "host1:2222"]
},
"task": {"type": "worker", "index": 0},
"environment": "cloud"
}'
Przykład biblioteki TensorFlow
- Aby uzyskać pełny notes do uruchomienia przykładu tensorFlow, zobacz azureml-examples: Train a basic neuron network with distributed MPI on the MNIST dataset using Tensorflow with Horovod (Trenowanie podstawowej sieci neuronowej za pomocą rozproszonego interfejsu MPI w zestawie danych MNIST przy użyciu biblioteki Tensorflow z platformą Horovod).
Przyspieszanie trenowania rozproszonego procesora GPU za pomocą rozwiązania InfiniBand
Wraz ze wzrostem liczby maszyn wirtualnych trenowania modelu czas wymagany do trenowania tego modelu powinien się zmniejszyć. Skrócenie czasu, najlepiej, powinno być liniowo proporcjonalne do liczby maszyn wirtualnych trenowania. Jeśli na przykład trenowanie modelu na jednej maszynie wirtualnej trwa 100 sekund, trenowanie tego samego modelu na dwóch maszynach wirtualnych powinno potrwać 50 sekund. Trenowanie modelu na czterech maszynach wirtualnych powinno potrwać 25 sekund itd.
InfiniBand może być ważnym czynnikiem umożliwiającym osiągnięcie tego liniowego skalowania. InfiniBand umożliwia komunikację między węzłami w klastrze z małymi opóźnieniami i komunikacją między procesorami GPU. Rozwiązanie InfiniBand wymaga wyspecjalizowanego sprzętu do działania. Niektóre serie maszyn wirtualnych platformy Azure, w szczególności NC, ND i H, mają teraz maszyny wirtualne z funkcją RDMA z obsługą funkcji SR-IOV i InfiniBand. Te maszyny wirtualne komunikują się za pośrednictwem sieci InfiniBand o małym opóźnieniu i wysokiej przepustowości, która jest o wiele bardziej wydajna niż łączność oparta na sieci Ethernet. Sr-IOV dla InfiniBand zapewnia niemal bez systemu operacyjnego wydajność dla dowolnej biblioteki MPI (MPI jest używana przez wiele rozproszonych struktur szkoleniowych i narzędzi, w tym oprogramowania NCCL firmy NVIDIA). Te jednostki SKU mają spełniać potrzeby obciążeń uczenia maszynowego intensywnie korzystających z obliczeń, przyspieszonych przez procesor GPU. Aby uzyskać więcej informacji, zobacz Przyspieszanie trenowania rozproszonego w usłudze Azure Machine Learning przy użyciu funkcji SR-IOV.
Zazwyczaj jednostki SKU maszyn wirtualnych o nazwie "r" zawierają wymagany sprzęt InfiniBand, a te bez "r" zwykle nie. ("r" jest odwołaniem do RDMA, co oznacza zdalny bezpośredni dostęp do pamięci). Na przykład jednostka SKU Standard_NC24rs_v3
maszyny wirtualnej jest włączona w rozwiązaniu InfiniBand, ale jednostka SKU Standard_NC24s_v3
nie jest. Oprócz możliwości InfiniBand specyfikacje między tymi dwoma jednostkami SKU są w dużej mierze takie same. Oba mają 24 rdzenie, 448 GB pamięci RAM, 4 procesory GPU tej samej jednostki SKU itp. Dowiedz się więcej o jednostkach SKU maszyn z obsługą funkcji RDMA i InfiniBand.
Ostrzeżenie
Jednostka SKU Standard_NC24r
starszej generacji maszyny jest włączona przez funkcję RDMA, ale nie zawiera sprzętu SR-IOV wymaganego dla rozwiązania InfiniBand.
Jeśli tworzysz AmlCompute
klaster z jedną z tych funkcji RDMA, rozmiary z włączoną funkcją InfiniBand, obraz systemu operacyjnego jest dostarczany ze sterownikiem Mellanox OFED wymaganym do włączenia wstępnie zainstalowanej i wstępnie skonfigurowanej aplikacji InfiniBand.