دليل تدريب GPU الموزع (SDK v2)

ينطبق على: Python SDK azure-ai-ml v2 (الحالي)

تعرف على المزيد حول استخدام التعليمات البرمجية للتدريب على GPU الموزعة في Azure التعلم الآلي. تساعدك هذه المقالة على تشغيل التعليمات البرمجية للتدريب الموزع الحالي، وتقدم لك تلميحات وأمثلة لمتابعة كل إطار عمل:

  • واجهة تمرير الرسائل (MPI)
    • Horovod
    • متغيرات البيئة من Open MPI
  • PyTorch
  • TensorFlow
  • تسريع تدريب GPU باستخدام InfiniBand

المتطلبات الأساسية

راجع المفاهيم الأساسية لتدريب وحدة معالجة الرسومات الموزعة، مثل توازي البيانات وتوازي البيانات الموزعة وتوازي النموذج.

تلميح

إذا كنت لا تعرف نوع التوازي الذي يجب استخدامه، فإن أكثر من 90٪ من الوقت يجب عليك استخدام توازي البيانات الموزعة.

MPI

يقدم Azure التعلم الآلي مهمة MPI لبدء عدد معين من العمليات في كل عقدة. يقوم Azure التعلم الآلي بإنشاء أمر تشغيل MPI الكامل (mpirun) خلف الكواليس. لا يمكنك تقديم أوامر عقدة- التشغيل-المسبقة الخاصة بك مثل mpirun أو DeepSpeed launcher.

تلميح

تحتاج صورة Docker الأساسية المستخدمة بواسطة وظيفة MPI التعلم الآلي إلى تثبيت مكتبة التعليميات البرمجية MPI. يتم تضمين MPI المفتوح في جميع الصور الأساسية ل Azure التعلم الآلي GPU. عند استخدام صورة Docker المخصصة، فأنت مسؤول عن التأكد من أن الصورة تتضمن مكتبة التعليمات البرمجية MPI. فتح MPI، ولكن يمكنك أيضاً استخدام تطبيق MPI مختلفاً مثل Intel MPI. يوفر Azure التعلم الآلي أيضا بيئات منسقة لأطر العمل الشائعة.

لتشغيل التدريب الموزع باستخدام MPI، اتبع الخطوات التالية:

  1. استخدم بيئة Azure التعلم الآلي مع إطار عمل التعلم العميق المفضل وMPI. يوفر Azure التعلم الآلي بيئات منسقة لأطر العمل الشائعة. أو أنشئ بيئة مخصصة مع إطار عمل التعلم العميق المفضل وMPI.
  2. حدد باستخدام commandinstance_count. instance_count يجب أن يكون مساويا لعدد وحدات معالجة الرسومات لكل عقدة لكل عملية تشغيل، أو تعيين إلى 1 (الافتراضي) لكل عقدة تشغيل إذا كان البرنامج النصي للمستخدم مسؤولا عن تشغيل العمليات لكل عقدة.
  3. استخدم معلمة distributioncommand لتحديد إعدادات .MpiDistribution
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.7-ubuntu20.04-py38-cuda11-gpu@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

استخدم تكوين وظيفة MPI عند استخدام Horovod للتدريب الموزع مع إطار عمل التعلم العميق.

تأكد من أن التعليمات البرمجية الخاصة بك تتبع هذه التلميحات:

  • يتم وضع علامة على التعليمات البرمجية للتدريب بشكل صحيح باستخدام Horovod قبل إضافة أجزاء التعلم الآلي Azure.
  • تحتوي بيئة Azure التعلم الآلي على Horovod وMPI. تأتي بيئات وحدة معالجة الرسومات المنسقة PyTorch وTensorFlow مكونة مسبقا مع Horovod وتبعياتها.
  • command إنشاء مع التوزيع المطلوب.

مثال Horovod

متغيرات البيئة من Open MPI

عند تشغيل مهام MPI مع صور Open MPI، يمكنك استخدام متغيرات البيئة التالية لكل عملية تم تشغيلها:

  1. OMPI_COMM_WORLD_RANK: رتبة العملية
  2. OMPI_COMM_WORLD_SIZE: حجم العالم
  3. AZ_BATCH_MASTER_NODE: العنوان الأساسي مع المنفذ، MASTER_ADDR:MASTER_PORT
  4. OMPI_COMM_WORLD_LOCAL_RANK: الترتيب المحلي للعملية على العقدة
  5. OMPI_COMM_WORLD_LOCAL_SIZE: عدد العمليات على العقدة

تلميح

على الرغم من الاسم، لا يتوافق متغير OMPI_COMM_WORLD_NODE_RANK البيئة مع NODE_RANK. لاستخدام تشغيل كل عقدة، اضبط process_count_per_node=1 واستخدم OMPI_COMM_WORLD_RANK كـ NODE_RANK.

PyTorch

يدعم Azure التعلم الآلي تشغيل المهام الموزعة باستخدام قدرات التدريب الموزع الأصلية ل PyTorch (torch.distributed).

تلميح

بالنسبة إلى توازي البيانات، فإن إرشادات PyTorch الرسمية هي استخدام DistributedDataParallel (DDP) عبر DataParallel لكل من التدريب الموزع على عقدة واحدة ومتعددة العقد. توصي PyTorch أيضاً باستخدام DistributedDataParallel عن حزمة المعالجة المتعددة. لذلك تركز وثائق وأمثلة Azure التعلم الآلي على تدريب DistributedDataParallel.

معالجة مجموعة العمليات

إن الأمر المهم في أي تدريب موزع على مجموعة من العمليات هو معرفتها ببعضها وإمكانية أن تتواصل مع بعضها باستخدام الخلفية. بالنسبة إلى PyTorch، يتم إنشاء مجموعة المعالجة عن طريق الاتصال torch.distributed.init_process_group في جميع العمليات الموزعة لتشكيل مجموعة معالجة بشكل جماعي.

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

أكثر الخلفيات المستخدمة شيوعاً للاتصالات الخلفية هي mpiوncclgloo. بالنسبة للتدريب المستند إلى وحدة معالجة الرسومات، nccl يوصى به للحصول على أفضل أداء ويجب استخدامه كلما أمكن ذلك.

init_methodيخبرنا كيف يمكن لكل عملية اكتشاف بعضها البعض، وكيفية التهيئة والتحقق من مجموعة العملية باستخدام خلفية الاتصال. بشكل افتراضي، إذا init_method لم يتم تحديد، يستخدم PyTorch أسلوب تهيئة متغير البيئة (env://). init_methodهو أسلوب التهيئة الموصى به لاستخدامه في التعليمات البرمجية للتدريب لتشغيل PyTorch الموزع على Azure التعلم الآلي. يبحث PyTorch عن متغيرات البيئة التالية للتهيئة:

  • MASTER_ADDR: عنوان IP للجهاز الذي يستضيف العملية بالرتبة 0
  • MASTER_PORT: منفذ مجاني على الجهاز الذي يستضيف العملية بالرتبة 0
  • WORLD_SIZE: العدد الإجمالي للعمليات. يجب أن يكون مساويا لإجمالي عدد الأجهزة (GPU) المستخدمة للتدريب الموزع
  • RANK: الترتيب (العمومي) للعملية الحالية. القيم المحتملة هي من 0 إلى (حجم العالم - 1)

لمزيد من المعلومات حول تكوين مجموعة العمليات، راجع وثائق PyTorch.

تحتاج العديد من التطبيقات أيضا إلى متغيرات البيئة التالية:

  • LOCAL_RANK: الترتيب المحلي (النسبي) للعملية داخل العقدة. القيم المحتملة هي من 0 إلى (عدد العمليات على العقدة - 1). هذه المعلومات مفيدة لأنه يجب تنفيذ العديد من العمليات مثل إعداد البيانات مرة واحدة فقط لكل عقدة، عادة على local_rank = 0.
  • NODE_RANK: رتبة العقدة للتدريب متعدد العقد. القيم المحتملة هي من 0 إلى (إجمالي عدد العُقَد - 1).

لا تحتاج إلى استخدام أداة تشغيل إعجاب torch.distributed.launch. لتشغيل مهمة PyTorch الموزعة:

  1. حدد البرنامج النصي للتدريب والوسيطات.
  2. command أنشئ وحدد النوع ك PyTorch و process_count_per_instance في المعلمة distribution . التوافق process_count_per_instance مع إجمالي عدد العمليات التي تريد تشغيلها لعملك. process_count_per_instance يجب أن يساوي # of GPUs per nodeعادة . إذا process_count_per_instance لم يتم تحديد، فسيبدأ Azure التعلم الآلي بشكل افتراضي عملية واحدة لكل عقدة.

يقوم Azure التعلم الآلي بتعيين MASTER_ADDRMASTER_PORTWORLD_SIZEمتغيرات البيئة و NODE_RANK على كل عقدة، وتعيين متغيرات مستوى RANK العملية والبيئة.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-acpt-pytorch-2.0-cuda11.7:26",
    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

DeepSpeed

يدعم Azure التعلم الآلي DeepSpeed كمواطن من الدرجة الأولى لتشغيل المهام الموزعة مع قابلية التوسع شبه الخطية من حيث:

  • زيادة حجم النموذج
  • زيادة عدد وحدات معالجة الرسومات

يمكن تمكين DeepSpeed باستخدام توزيع Pytorch أو MPI لتشغيل التدريب الموزع. يدعم Azure التعلم الآلي مشغل DeepSpeed لإطلاق التدريب الموزع بالإضافة إلى التشغيل التلقائي للحصول على التكوين الأمثلds.

يمكنك استخدام بيئة منسقة لبيئة خارج الصندوق مع أحدث أحدث التقنيات بما في ذلك DeepSpeed وORT وMSSCCL وPytorch لوظائف التدريب DeepSpeed.

مثال DeepSpeed

  • للحصول على أمثلة التدريب والتواؤم التلقائي ل DeepSpeed، راجع هذه المجلدات.

TensorFlow

إذا كنت تستخدم TensorFlow الموزع الأصلي في التعليمات البرمجية للتدريب، مثل واجهة برمجة تطبيقات TensorFlow 2.xtf.distribute.Strategy، يمكنك تشغيل المهمة الموزعة عبر Azure التعلم الآلي باستخدام distribution المعلمات أو 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.4-ubuntu18.04-py37-cuda11-gpu@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)

إذا كان البرنامج النصي للتدريب الخاص بك يستخدم استراتيجية خادم المعلمة للتدريب الموزع، مثل TensorFlow 1.x القديمة، تحتاج أيضا إلى تحديد عدد خوادم المعلمات لاستخدامها في الوظيفة، داخل المعلمة distribution الخاصة ب command. في ما سبق، على سبيل المثال، "parameter_server_count" : 1 و "worker_count": 2.

TF_CONFIG

في TensorFlow، TF_CONFIG متغير البيئة مطلوب للتدريب على أجهزة متعددة. بالنسبة إلى مهام TensorFlow، يقوم Azure التعلم الآلي بتكوين المتغير وتعيينه TF_CONFIG بشكل مناسب لكل عامل قبل تنفيذ البرنامج النصي للتدريب.

يمكنك الوصول من TF_CONFIG البرنامج النصي للتدريب الخاص بك إذا كنت بحاجة إلى: os.environ['TF_CONFIG'].

مثال TF_CONFIG تم تعيينه على عقدة عامل رئيسي:

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

مثال على TensorFlow

تسريع تدريب GPU الموزع باستخدام InfiniBand

مع زيادة عدد أجهزة VM التي يتم تدريبها على نموذج ما، يجب تقليل الوقت اللازم لتدريب هذا النموذج. لإنقاص الوقت بشكل مثالي، يجب أن يكون متناسباً وخطياً مع عدد أجهزة VM التدريبية. على سبيل المثال، إذا كان تدريب نموذج على جهاز ظاهري واحد يستغرق 100 ثانية، فإن تدريب النموذج نفسه على جهازين افتراضيين من المفترض أن يستغرق 50 ثانية. يجب أن يستغرق تدريب النموذج على أربعة أجهزة افتراضية 25 ثانية، وهكذا.

يمكن أن يكون InfiniBand عاملاً مهماً في تحقيق هذا القياس الخطي. يمكن InfiniBand الاتصال بزمن انتقال منخفض بين GPU وGPU عبر العُقَد في مجموعة. يتطلب InfiniBand أجهزة متخصصة للعمل. بعض سلاسل Azure VM، وتحديداً NC وND وH-series، لديها الآن أجهزة ظاهرية قادرة على RDMA مع دعم SR-IOV وInfiniBand. تتواصل أجهزة VM هذه عبر شبكة InfiniBand ذات زمن الانتقال المنخفض والنطاق الترددي العالي، والتي تعد أفضل أداءً من الاتصال المستند إلى Ethernet. SR-IOV ل InfiniBand يمكن الأداء شبه المعدني لأي مكتبة MPI (يتم استخدام MPI من قبل العديد من أطر التدريب الموزعة والأدوات، بما في ذلك برنامج NCCL NVIDIA.) تهدف وحدات SKU هذه إلى تلبية احتياجات أحمال عمل التعلم الآلي المكثفة حسابيا والمتسارعة بواسطة وحدة معالجة الرسومات. لمزيد من المعلومات، راجع تسريع التدريب الموزع في التعلم الآلي باستخدام SR-IOV.

عادة ما تحتوي وحدات SKU للجهاز الظاهري مع "r" في اسمها على أجهزة InfiniBand المطلوبة، وتلك التي لا تحتوي على "r" عادة لا. ("r" هو مرجع إلى RDMA، والذي يرمز إلى الوصول المباشر إلى الذاكرة عن بعد.) على سبيل المثال، VM SKU Standard_NC24rs_v3 هو InfiniBand ممكن، ولكن SKU Standard_NC24s_v3 غير ممكن. وبصرف النظر عن قدرات InfiniBand، فإن المواصفات بين هاتين وحدتي SKU هي نفسها إلى حد كبير. كلاهما لديه 24 نواة، ذاكرة وصول عشوائي 448 غيغابايت، 4 وحدات معالجة الرسومات من نفس SKU، إلخ. تعرَّف على المزيد حول وحدات SKU للآلة التي تمكن RDMA وInfiniBand.

تحذير

تم تمكين SKU Standard_NC24r لجهاز الجيل الأقدم من RDMA، ولكنه لا يحتوي على أجهزة SR-IOV المطلوبة ل InfiniBand.

إذا قمت بإنشاء مجموعة AmlCompute من واحدة من هذه الأحجام الممكنة ل RDMA، InfiniBand الممكنة، تأتي صورة نظام التشغيل مع برنامج تشغيل Mellanox OFED المطلوب لتمكين InfiniBand المثبت مسبقا والمكون مسبقا.

الخطوات التالية