Dağıtılmış GPU eğitim kılavuzu (SDK v2)

ŞUNLAR IÇIN GEÇERLIDIR: Python SDK'sı azure-ai-ml v2 (geçerli)

Azure Machine Learning'de dağıtılmış GPU eğitim kodunu kullanma hakkında daha fazla bilgi edinin. Bu makale, mevcut dağıtılmış eğitim kodunuzu çalıştırmanıza yardımcı olur ve her çerçeve için izlemeniz gereken ipuçları ve örnekler sunar:

  • İleti Geçirme Arabirimi (MPI)
    • Horovod
    • Open MPI'dan ortam değişkenleri
  • PyTorch
  • TensorFlow
  • InfiniBand ile GPU eğitimini hızlandırma

Önkoşullar

Veri paralelliği, dağıtılmış veri paralelliği ve model paralelliği gibi dağıtılmış GPU eğitimiyle ilgili temel kavramları gözden geçirin.

İpucu

Hangi paralellik türünü kullanacağınızı bilmiyorsanız, dağıtılmış veri paralelliğini %90'dan fazla kullanmanız gerekir.

MPI

Azure Machine Learning, her düğümde belirli sayıda işlem başlatmak için bir MPI işi sunar. Azure Machine Learning, arka planda tam MPI başlatma komutunu (mpirun) oluşturur. veya DeepSpeed launchergibi mpirun kendi tam baş düğüm başlatıcı komutlarınızı sağlayamazsınız.

İpucu

Azure Machine Learning MPI işi tarafından kullanılan temel Docker görüntüsünde bir MPI kitaplığının yüklü olması gerekir. Açık MPI, tüm Azure Machine Learning GPU temel görüntülerine dahildir. Özel bir Docker görüntüsü kullandığınızda, görüntünün bir MPI kitaplığı içerdiğinden emin olmak sizin sorumluluğunuzdadır. Açık MPI önerilir, ancak Intel MPI gibi farklı bir MPI uygulaması da kullanabilirsiniz. Azure Machine Learning ayrıca popüler çerçeveler için seçilmiş ortamlar sağlar.

MPI kullanarak dağıtılmış eğitimi çalıştırmak için şu adımları izleyin:

  1. Tercih edilen derin öğrenme çerçevesi ve MPI ile bir Azure Machine Learning ortamı kullanın. Azure Machine Learning, popüler çerçeveler için seçilmiş ortamlar sağlar. Tercih edilen derin öğrenme çerçevesi ve MPI ile özel bir ortam da oluşturabilirsiniz.
  2. ile instance_countbir command tanımlayın. instance_count işlem başına başlatma için düğüm başına GPU sayısına eşit olmalıdır veya kullanıcı betiği düğüm başına işlemleri başlatmaktan sorumluysa düğüm başına başlatma için 1 (varsayılan) olarak ayarlanmalıdır.
  3. distribution için ayarları belirtmek için MpiDistributionparametresini command kullanın.
from azure.ai.ml import command, MpiDistribution

job = command(
    code="./src",  # local path where the code is stored
    command="python train.py --epochs ${{inputs.epochs}}",
    inputs={"epochs": 1},
    environment="AzureML-tensorflow-2.12-cuda11@latest",
    compute="gpu-cluster",
    instance_count=2,
    distribution=MpiDistribution(process_count_per_instance=2),
    display_name="tensorflow-mnist-distributed-horovod-example"
    # experiment_name: tensorflow-mnist-distributed-horovod-example
    # description: Train a basic neural network with TensorFlow on the MNIST dataset, distributed via Horovod.
)

Horovod

Derin öğrenme çerçevesiyle dağıtılmış eğitim için Horovod kullanırken MPI iş yapılandırmasını kullanın.

Kodunuzun şu ipuçlarına uydığından emin olun:

  • Eğitim kodu, Azure Machine Learning bölümlerini eklemeden önce Horovod ile doğru şekilde izlenmiştir.
  • Azure Machine Learning ortamınız Horovod ve MPI içerir. PyTorch ve TensorFlow tarafından seçilen GPU ortamları Horovod ve bağımlılıklarıyla önceden yapılandırılmış olarak gelir.
  • İstediğiniz dağıtımla bir command oluşturun.

Horovod örneği

  • Tam not defterinin Horovod örneğini çalıştırması için bkz . azureml-examples: Horovod kullanarak MNIST veri kümesinde dağıtılmış MPI ile temel bir sinir ağını eğitme.

Open MPI'dan ortam değişkenleri

MPI işlerini Open MPI görüntüleriyle çalıştırırken, başlatılan her işlem için aşağıdaki ortam değişkenlerini kullanabilirsiniz:

  1. OMPI_COMM_WORLD_RANK: İşlemin sırası
  2. OMPI_COMM_WORLD_SIZE: Dünya boyutu
  3. AZ_BATCH_MASTER_NODE: Bağlantı noktası olan birincil adres, MASTER_ADDR:MASTER_PORT
  4. OMPI_COMM_WORLD_LOCAL_RANK: Düğümdeki işlemin yerel sırası
  5. OMPI_COMM_WORLD_LOCAL_SIZE: Düğümdeki işlemlerin sayısı

İpucu

Adına rağmen ortam değişkeni OMPI_COMM_WORLD_NODE_RANK öğesine NODE_RANKkarşılık gelmez. Düğüm başına başlatıcıyı kullanmak için olarak ayarlayın process_count_per_node=1 ve kullanın OMPI_COMM_WORLD_RANKNODE_RANK.

PyTorch

Azure Machine Learning, PyTorch'un yerel dağıtılmış eğitim özelliklerini (torch.distributed ) kullanarak dağıtılmış işlerin çalıştırılmasını destekler.

İpucu

Veri paralelliği için, resmi PyTorch kılavuzu hem tek düğümlü hem de çok düğümlü dağıtılmış eğitim için DataParallel üzerinden DistributedDataParallel (DDP) kullanmaktır. PyTorch, çok işlemli paket üzerinden DistributedDataParallel kullanılmasını da önerir. Bu nedenle Azure Machine Learning belgeleri ve örnekleri DistributedDataParallel eğitimine odaklanır.

İşlem grubu başlatma

Herhangi bir dağıtılmış eğitimin omurgası, birbirini bilen ve arka uç kullanarak birbirleriyle iletişim kurabilen bir grup işleme dayanır. PyTorch için işlem grubu, toplu olarak bir işlem grubu oluşturmak üzere tüm dağıtılmış işlemlerde torch.distributed.init_process_group çağrılarak oluşturulur.

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

Kullanılan en yaygın iletişim arka uçları , ncclve gloo'dirmpi. GPU tabanlı eğitim için, nccl en iyi performans için önerilir ve mümkün olduğunda kullanılmalıdır.

init_method her işlemin birbirini nasıl bulabileceğini, iletişim arka ucu kullanarak işlem grubunu nasıl başlatıp doğruladıklarını bildirir. Varsayılan olarak, belirtilmezse init_method PyTorch ortam değişkeni başlatma yöntemini (env://) kullanır. init_method , Azure Machine Learning'de dağıtılmış PyTorch çalıştırmak için eğitim kodunuzda kullanmanız önerilen başlatma yöntemidir. PyTorch başlatma için aşağıdaki ortam değişkenlerini arar:

  • MASTER_ADDR: 0 derecesine sahip işlemi barındıran makinenin IP adresi
  • MASTER_PORT: 0. dereceye sahip işlemi barındıran makinede ücretsiz bir bağlantı noktası
  • WORLD_SIZE: Toplam işlem sayısı. Dağıtılmış eğitim için kullanılan toplam cihaz sayısına (GPU) eşit olmalıdır
  • RANK: Geçerli işlemin (genel) sırası. Olası değerler 0 ile (dünya boyutu - 1) arasıdır

İşlem grubu başlatma hakkında daha fazla bilgi için PyTorch belgelerine bakın.

Birçok uygulama aşağıdaki ortam değişkenlerine de ihtiyaç duyar:

  • LOCAL_RANK: Düğüm içindeki işlemin yerel (göreli) sırası. Olası değerler 0 ile (düğümdeki işlem sayısı: 1) arasıdır. Bu bilgiler yararlıdır çünkü veri hazırlama gibi birçok işlem genellikle local_rank = 0 üzerinde düğüm başına yalnızca bir kez gerçekleştirilmelidir.
  • NODE_RANK: Çok düğümlü eğitim için düğümün sırası. Olası değerler 0 ile (toplam düğüm sayısı - 1) olur.

gibi torch.distributed.launchbir başlatıcı yardımcı programı kullanmanız gerekmez. Dağıtılmış bir PyTorch işini çalıştırmak için:

  1. Eğitim betiğini ve bağımsız değişkenlerini belirtin.
  2. bir command oluşturun ve parametresinde distribution olarak PyTorch ve process_count_per_instance türünü belirtin. , process_count_per_instance işiniz için çalıştırmak istediğiniz toplam işlem sayısına karşılık gelir. process_count_per_instance genellikle değerine # of GPUs per nodeeşit olmalıdır. Belirtilmezse process_count_per_instance , Azure Machine Learning varsayılan olarak düğüm başına bir işlem başlatır.

Azure Machine Learning her düğümde MASTER_ADDR, MASTER_PORT, WORLD_SIZEve NODE_RANK ortam değişkenlerini ayarlar ve işlem düzeyi RANK ile LOCAL_RANK ortam değişkenlerini ayarlar.

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 örneği

  • Tam not defterinin Pytorch örneğini çalıştırması için bkz . azureml-examples: CIFAR-10 üzerinde PyTorch ile dağıtılmış eğitim.

DeepSpeed

Azure Machine Learning, DeepSpeed'i birinci sınıf vatandaş olarak desteklemektedir ve dağıtılmış işleri aşağıdakiler açısından doğrusal ölçeklenebilirliğe yakın bir şekilde çalıştırabilir:

  • Model boyutunu artırma
  • GPU sayısındaki artış

DeepSpeed, dağıtılmış eğitimi çalıştırmak için Pytorch dağıtımı veya MPI kullanılarak etkinleştirilebilir. Azure Machine Learning, dağıtılmış eğitimi başlatmak için DeepSpeed başlatıcısını ve en iyi ds yapılandırmayı elde etmek için otomatik olarak başlatmayı destekler.

DeepSpeed eğitim işleriniz için DeepSpeed, ORT, MSSCCL ve Pytorch gibi en son teknolojilerle kullanıma hazır bir ortam için seçilmiş bir ortam kullanabilirsiniz.

DeepSpeed örneği

  • DeepSpeed eğitimi ve otomatik düzeltme örnekleri için bu klasörlere bakın.

TensorFlow

Eğitim kodunuzda TensorFlow 2.x'in API'si tf.distribute.Strategy gibi yerel dağıtılmış TensorFlow kullanıyorsanız, parametreleri veya TensorFlowDistribution nesnesini kullanarak distribution Dağıtılmış işi Azure Machine Learning aracılığıyla başlatabilirsiniz.

# 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.12-cuda11@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)

Eğitim betiğiniz, eski TensorFlow 1.x gibi dağıtılmış eğitim için parametre sunucusu stratejisini kullanıyorsa, içinde parametresi içinde iş içinde kullanılacak parametre sunucularının distributioncommandsayısını da belirtmeniz gerekir. Yukarıdaki örnekte, örneğin "parameter_server_count" : 1 ve "worker_count": 2.

TF_CONFIG

TensorFlow'da ortam değişkeni birden TF_CONFIG çok makinede eğitim için gereklidir. TensorFlow işleri için Azure Machine Learning, eğitim betiğinizi yürütmeden önce değişkeni her çalışan için uygun şekilde yapılandırıp ayarlar TF_CONFIG .

Gerekirse eğitim betiğinizden erişebilirsiniz TF_CONFIG : os.environ['TF_CONFIG'].

Baş çalışan düğümünde ayarlanan örnek TF_CONFIG :

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

TensorFlow örneği

  • Tam not defterinin TensorFlow örneğini çalıştırması için bkz . azureml-examples: Horovod ile Tensorflow kullanarak MNIST veri kümesinde dağıtılmış MPI ile temel bir sinir ağını eğitme.

InfiniBand ile dağıtılmış GPU eğitimini hızlandırma

Modeli eğiten VM sayısı arttıkça, modeli eğitmek için gereken süre azalmalıdır. İdeal olarak zamandaki azalma, eğitim VM'lerinin sayısıyla doğrusal olarak orantılı olmalıdır. Örneğin, bir modelin bir VM'de eğitilmesi 100 saniye sürüyorsa, aynı modeli iki VM üzerinde eğitme ideal olarak 50 saniye sürmelidir. Modelin dört VM üzerinde eğitilmesi 25 saniye sürmelidir ve bu şekilde devam eder.

InfiniBand, bu doğrusal ölçeklendirmenin elde edilmesinde önemli bir faktör olabilir. InfiniBand, bir kümedeki düğümler arasında düşük gecikme süreli GPU'ya iletişim sağlar. InfiniBand'in çalışması için özel donanım gerekir. Belirli Azure VM serisi, özellikle NC, ND ve H serisi, artık SR-IOV ve InfiniBand desteğine sahip RDMA özellikli VM'lere sahiptir. Bu VM'ler, Ethernet tabanlı bağlantıdan çok daha yüksek performanslı olan düşük gecikme süresi ve yüksek bant genişliğine sahip InfiniBand ağı üzerinden iletişim kurar. InfiniBand için SR-IOV, herhangi bir MPI kitaplığı için neredeyse çıplak performans sağlar (MPI, NVIDIA'nın NCCL yazılımı da dahil olmak üzere birçok dağıtılmış eğitim çerçevesi ve aracı tarafından kullanılır.) Bu SKU'lar hesaplama açısından yoğun, GPU hızlandırmalı makine öğrenmesi iş yüklerinin gereksinimlerini karşılamaya yöneliktir. Daha fazla bilgi için bkz . SR-IOV ile Azure Machine Learning'de Dağıtılmış Eğitimi Hızlandırma.

Normalde, adında "r" olan VM SKU'ları gerekli InfiniBand donanımını içerir ve "r" olmayanlar genellikle içermez. ("r", uzaktan doğrudan bellek erişiminin kısaltması olan RDMA'ya başvurudur.) Örneğin, VM SKU'su Standard_NC24rs_v3 InfiniBand özelliklidir, ancak SKU Standard_NC24s_v3 etkin değildir. InfiniBand özelliklerinin yanı sıra, bu iki SKU arasındaki belirtimler büyük ölçüde aynıdır. Her ikisinde de 24 çekirdek, 448 GB RAM, aynı SKU'nun 4 GPU'su vb. vardır. RDMA ve InfiniBand özellikli makine SKU'ları hakkında daha fazla bilgi edinin.

Uyarı

Eski nesil makine SKU'su Standard_NC24r RDMA özelliklidir, ancak InfiniBand için gereken SR-IOV donanımını içermez.

Bu RDMA özellikli, InfiniBand özellikli boyutlardan birinin kümesini oluşturursanız AmlCompute , işletim sistemi görüntüsü InfiniBand'i önceden yüklenmiş ve önceden yapılandırılmış olarak etkinleştirmek için gereken Mellanox OFED sürücüsüyle birlikte gelir.

Sonraki adımlar