Bagikan melalui


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_methodadalah 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 0
  • MASTER_PORT: Port gratis pada komputer yang menghosting proses dengan peringkat 0
  • WORLD_SIZE: Jumlah total proses. Harus sama dengan jumlah total perangkat (GPU) yang digunakan untuk pelatihan terdistribusi
  • RANK: 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:

  1. Tentukan skrip dan argumen pelatihan.
  2. Buat command dan tentukan jenis sebagai PyTorch dan process_count_per_instance dalam distribution 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. Jika process_count_per_instance tidak ditentukan, Azure Pembelajaran Mesin akan secara default meluncurkan satu proses per simpul.

Azure Pembelajaran Mesin mengatur MASTER_ADDRvariabel 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

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

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.

Langkah berikutnya