Udostępnij przez


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

Szkieletem każdego trenowania rozproszonego jest grupa procesów, które znają się nawzajem i mogą komunikować się ze sobą przy użyciu zaplecza. W przypadku usługi PyTorch należy utworzyć grupę procesów, wywołując torch.distributed.init_process_group we wszystkich procesach rozproszonych , aby utworzyć grupę procesów.

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

Najbardziej typowe zaplecza komunikacji to mpi, nccli gloo. W przypadku trenowania opartego na procesorze GPU należy użyć nccl w celu uzyskania najlepszej wydajności.

Parametr init_method określa, jak każdy proces odnajduje inne procesy i jak inicjuje i weryfikuje grupę procesów przy użyciu zaplecza komunikacji. Domyślnie, jeśli nie określisz init_method, PyTorch używa metody inicjowania zmiennej środowiskowej (env://). Użyj init_method w swoim kodzie do trenowania, aby uruchomić rozproszony PyTorch na platformie Azure Machine Learning. PyTorch szuka następujących zmiennych środowiskowych do inicjowania:

  • MASTER_ADDR: adres IP maszyny, która hostuje proces o klasyfikacji 0
  • MASTER_PORT: wolny port na maszynie, która hostuje proces o godzinie 0
  • WORLD_SIZE: całkowita liczba procesów. Powinna być równa całkowitej liczbie urządzeń (GPU) używanych do trenowania rozproszonego
  • RANK: (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, musi 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:

  1. Określ skrypt trenowania i argumenty.
  2. Utwórz element command i określ typ jako PyTorch i process_count_per_instance w parametrze distribution . Odpowiada process_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śli nie określisz process_count_per_instance, usługa Azure Machine Learning domyślnie uruchamia jeden proces na węzeł.

Usługa Azure Machine Learning ustawia zmienne środowiskowe MASTER_ADDR, MASTER_PORT, WORLD_SIZE i NODE_RANK w każdym węźle. Ustawia na poziomie procesu zmienne środowiskowe RANK i LOCAL_RANK.

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

Przykład PyTorch

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 natywnie rozproszonego TensorFlow w swoim kodzie trenowania, takim jak interfejs API TensorFlow 2.x tf.distribute.Strategy, możesz uruchomić zadanie rozproszone za pomocą usługi Azure Machine Learning, używając parametrów distribution lub obiektu 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)

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 poprzednim przykładzie należy określić wartości "parameter_server_count" : 1 i "worker_count": 2.

TF_CONFIG

W systemie TensorFlow potrzebna jest zmienna TF_CONFIG środowiskowa do trenowania na wielu maszynach. W przypadku zadań TensorFlow usługa Azure Machine Learning ustawia zmienną TF_CONFIG poprawnie dla każdego pracownika przed uruchomieniem skryptu uczącego.

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

Przyspieszanie trenowania rozproszonego procesora GPU za pomocą rozwiązania InfiniBand

W miarę zwiększania liczby maszyn wirtualnych używanych do szkolenia modelu czas potrzebny na szkolenie tego modelu powinien się zmniejszać. Skrócenie czasu powinno być liniowo proporcjonalne do liczby trenowanych maszyn wirtualnych. 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 pomóc w osiągnięciu tego skalowania liniowego. 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 wersja SKU Standard_NC24rs_v3 maszyny wirtualnej obsługuje InfiniBand, ale wersja SKU Standard_NC24s_v3 nie. 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 i tak dalej. 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.

Następne kroki