Panduan pelatihan GPU terdistribusi (SDK v2)
BERLAKU UNTUK: Python SDK azure-ai-ml v2 (saat ini)
Pelajari selengkapnya tentang menggunakan kode pelatihan GPU terdistribusi di Azure Pembelajaran Mesin. Artikel ini membantu Anda menjalankan kode pelatihan terdistribusi yang ada, dan menawarkan tips dan contoh yang harus Anda ikuti untuk setiap kerangka kerja:
- PyTorch
- TensorFlow
- Mempercepat pelatihan GPU dengan InfiniBand
Prasyarat
Tinjau konsep dasar pelatihan GPU terdistribusi, seperti paralelisme data, paralelisme data terdistribusi, dan paralelisme model.
Tip
Jika Anda tidak tahu jenis paralelisme mana yang akan digunakan, lebih dari 90% waktu Anda harus menggunakan paralelisme data terdistribusi.
PyTorch
Azure Pembelajaran Mesin mendukung menjalankan pekerjaan terdistribusi menggunakan kemampuan pelatihan terdistribusi asli PyTorch (torch.distributed
).
Tip
Untuk paralelisme data, panduan resmi PyTorch adalah menggunakan DistributedDataParallel (DDP) di atas DataParallel untuk pelatihan terdistribusi single-node dan multi-node. PyTorch juga menyarankan untuk menggunakan DistributedDataParallel melalui paket multipemrosesan. Oleh karena itu, dokumentasi dan contoh Azure Pembelajaran Mesin berfokus pada pelatihan DistributedDataParallel.
Inisialisasi grup proses
Tulang punggung dari setiap pelatihan terdistribusi didasarkan pada sekelompok proses yang saling mengenal dan dapat berkomunikasi satu sama lain menggunakan backend. Untuk PyTorch, grup proses dibuat dengan memanggil torch.distributed.init_process_group di semua proses terdistribusi untuk secara kolektif membentuk grup proses.
torch.distributed.init_process_group(backend='nccl', init_method='env://', ...)
Backend komunikasi yang paling umum digunakan adalah mpi
, nccl
, dan gloo
. Untuk pelatihan berbasis GPU, nccl
disarankan untuk performa terbaik dan harus digunakan jika memungkinkan.
init_method
memberi tahu bagaimana setiap proses dapat menemukan satu sama lain, bagaimana mereka menginisialisasi dan memverifikasi grup proses menggunakan backend komunikasi. Secara default, jika init_method
tidak ditentukan, PyTorch menggunakan metode inisialisasi variabel lingkungan (env://
). init_method
adalah metode inisialisasi yang direkomendasikan untuk digunakan dalam kode pelatihan Anda untuk menjalankan PyTorch terdistribusi di Azure Pembelajaran Mesin. PyTorch mencari variabel lingkungan berikut untuk inisialisasi:
MASTER_ADDR
: Alamat IP komputer yang menghosting proses dengan peringkat 0MASTER_PORT
: Port gratis pada komputer yang menghosting proses dengan peringkat 0WORLD_SIZE
: Jumlah total proses. Harus sama dengan jumlah total perangkat (GPU) yang digunakan untuk pelatihan terdistribusiRANK
: Peringkat (global) dari proses saat ini. Nilai yang mungkin adalah 0 hingga (ukuran dunia - 1)
Untuk informasi selengkapnya tentang inisialisasi grup proses, lihat dokumentasi PyTorch.
Banyak aplikasi juga memerlukan variabel lingkungan berikut:
LOCAL_RANK
: Peringkat lokal (relatif) proses dalam simpul. Kemungkinan nilainya adalah 0 hingga (# dari proses pada simpul - 1). Informasi ini berguna karena banyak operasi seperti persiapan data hanya boleh dilakukan sekali per simpul, biasanya pada local_rank = 0.NODE_RANK
: Peringkat simpul untuk pelatihan multi-simpul. Kemungkinan nilainya adalah 0 hingga (total # dari simpul - 1).
Anda tidak perlu menggunakan utilitas peluncur seperti torch.distributed.launch
. Untuk menjalankan tugas PyTorch terdistribusi:
- Tentukan skrip dan argumen pelatihan.
- Buat
command
dan tentukan jenis sebagaiPyTorch
danprocess_count_per_instance
dalamdistribution
parameter .process_count_per_instance
sesuai dengan jumlah total proses yang ingin Anda jalankan untuk pekerjaan Anda.process_count_per_instance
biasanya harus sama dengan# of GPUs per node
. Jikaprocess_count_per_instance
tidak ditentukan, Azure Pembelajaran Mesin akan secara default meluncurkan satu proses per simpul.
Azure Pembelajaran Mesin mengatur MASTER_ADDR
variabel lingkungan , MASTER_PORT
, WORLD_SIZE
, dan NODE_RANK
pada setiap simpul, dan mengatur variabel tingkat RANK
proses dan LOCAL_RANK
lingkungan.
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
Contoh Pytorch
- Agar notebook lengkap menjalankan contoh Pytorch, lihat azureml-examples: Pelatihan terdistribusi dengan PyTorch di CIFAR-10.
DeepSpeed
Azure Pembelajaran Mesin mendukung DeepSpeed sebagai warga negara kelas satu untuk menjalankan pekerjaan terdistribusi dengan skalabilitas yang hampir linier dalam hal:
- Peningkatan ukuran model
- Peningkatan jumlah GPU
DeepSpeed dapat diaktifkan menggunakan distribusi Pytorch atau MPI untuk menjalankan pelatihan terdistribusi. Azure Pembelajaran Mesin mendukung peluncur DeepSpeed untuk meluncurkan pelatihan terdistribusi serta penyetelan otomatis untuk mendapatkan konfigurasi yang optimalds
.
Anda dapat menggunakan lingkungan yang dikumpulkan untuk lingkungan out of the box dengan teknologi canggih terbaru termasuk DeepSpeed, ORT, MSSCCL, dan Pytorch untuk pekerjaan pelatihan DeepSpeed Anda.
Contoh DeepSpeed
- Untuk contoh pelatihan dan penyetelan otomatis DeepSpeed, lihat folder ini.
TensorFlow
Jika Anda menggunakan TensorFlow terdistribusi asli dalam kode pelatihan Anda, seperti API TensorFlow 2.xtf.distribute.Strategy
, Anda dapat meluncurkan pekerjaan terdistribusi melalui Azure Pembelajaran Mesin menggunakan distribution
parameter atau TensorFlowDistribution
objek .
# 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)
Jika skrip pelatihan Anda menggunakan strategi server parameter untuk pelatihan terdistribusi, seperti untuk TensorFlow 1.x warisan, Anda juga perlu menentukan jumlah server parameter yang akan digunakan dalam pekerjaan, di dalam distribution
parameter command
. Dalam hal di atas, misalnya, "parameter_server_count" : 1
dan "worker_count": 2
.
TF_CONFIG
Di TensorFlow, TF_CONFIG
variabel lingkungan diperlukan untuk pelatihan pada beberapa mesin. Untuk pekerjaan TensorFlow, Azure Pembelajaran Mesin mengonfigurasi dan mengatur TF_CONFIG
variabel dengan tepat untuk setiap pekerja sebelum menjalankan skrip pelatihan Anda.
Anda dapat mengakses TF_CONFIG
dari skrip pelatihan jika Anda perlu: os.environ['TF_CONFIG']
.
Contoh TF_CONFIG
yang ditetapkan pada simpul kepala pekerja:
TF_CONFIG='{
"cluster": {
"worker": ["host0:2222", "host1:2222"]
},
"task": {"type": "worker", "index": 0},
"environment": "cloud"
}'
Contoh TensorFlow
- Agar notebook lengkap menjalankan contoh TensorFlow, lihat azureml-examples: Melatih jaringan neural dasar dengan MPI terdistribusi pada himpunan data MNIST menggunakan Tensorflow dengan Horovod.
Mempercepat pelatihan GPU dengan InfiniBand
Ketika jumlah VM yang melatih model meningkat, waktu yang dibutuhkan untuk melatih model itu harus berkurang. Penurunan waktu, idealnya, harus proporsional secara linier dengan jumlah VM pelatihan. Misalnya, jika melatih model pada satu VM membutuhkan waktu 100 detik, maka melatih model yang sama pada dua VM idealnya membutuhkan waktu 50 detik. Melatih model pada empat VM harus memakan waktu 25 detik, dan seterusnya.
InfiniBand dapat menjadi faktor penting dalam mencapai penskalaan linier ini. InfiniBand memungkinkan komunikasi GPU-ke-GPU latensi rendah di seluruh node dalam kluster. InfiniBand membutuhkan perangkat keras khusus untuk beroperasi. Seri Azure VM tertentu, khususnya NC, ND, dan H-series, sekarang memiliki VM berkemampuan RDMA dengan dukungan SR-IOV dan InfiniBand. VM ini berkomunikasi melalui latensi rendah dan jaringan InfiniBand bandwidth tinggi, yang jauh lebih performant daripada konektivitas berbasis Ethernet. SR-IOV untuk InfiniBand memungkinkan performa mendekati bare-metal untuk pustaka MPI apa pun (MPI digunakan oleh banyak kerangka kerja dan alat pelatihan terdistribusi, termasuk perangkat lunak NCCL NVIDIA.) SKU ini dimaksudkan untuk memenuhi kebutuhan beban kerja pembelajaran mesin yang intensif secara komputasi dan dipercepat GPU. Untuk informasi selengkapnya, lihat Mempercepat Pelatihan Terdistribusi dalam Pembelajaran Mesin Azure dengan SR-IOV.
Biasanya, SKU VM dengan "r" dalam namanya berisi perangkat keras InfiniBand yang diperlukan, dan yang tanpa "r" biasanya tidak. ("r" adalah referensi ke RDMA, yang merupakan singkatan dari akses memori langsung jarak jauh.) Misalnya, SKU Standard_NC24rs_v3
VM diaktifkan InfiniBand, tetapi SKU Standard_NC24s_v3
tidak. Selain kemampuan InfiniBand, spesifikasi antara kedua SKU ini sebagian besar sama. Keduanya memiliki 24 core, RAM 448 GB, 4 GPU dari SKU yang sama, dll. Pelajari lebih lanjut tentang SKU mesin berkemampuan RDMA dan InfiniBand.
Peringatan
SKU Standard_NC24r
komputer generasi lama diaktifkan RDMA, tetapi tidak berisi perangkat keras SR-IOV yang diperlukan untuk InfiniBand.
Jika Anda membuat AmlCompute
kluster dari salah satu ukuran berkemampuan RDMA yang mendukung InfiniBand ini, gambar OS dilengkapi dengan driver Mellanox OFED yang diperlukan untuk mengaktifkan InfiniBand yang telah diinstal dan telah dikonfigurasi sebelumnya.