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:
- 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.
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ı , nccl
ve 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 adresiMASTER_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ırRANK
: 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.launch
bir başlatıcı yardımcı programı kullanmanız gerekmez. Dağıtılmış bir PyTorch işini çalıştırmak için:
- Eğitim betiğini ve bağımsız değişkenlerini belirtin.
- bir
command
oluşturun ve parametresindedistribution
olarakPyTorch
veprocess_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 node
eşit olmalıdır. Belirtilmezseprocess_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_SIZE
ve 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.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)
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 distribution
command
sayı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.