دليل التدريب على وحدة معالجة الرسومات الموزعة

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

  • واجهة تمرير الرسائل (MPI)
    • هوروفود
    • ديب سبيد
    • متغيرات البيئة من MPI المفتوح
  • PyTorch
    • تهيئة مجموعة العمليات
    • خيارات التشغيل
    • DisdistributiondDataParallel (لكل عملية إطلاق)
    • استخدام torch.distributed.launch (لكل عقدة إطلاق)
    • PyTorch البرق
    • معانقة محولات الوجه
  • TensorFlow
    • متغيرات البيئة ل TensorFlow (TF_CONFIG)
  • تسريع تدريب وحدة معالجة الرسومات باستخدام InfiniBand

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

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

تلميح

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

MPI

يوفر Azure ML وظيفة MPI لإطلاق عدد معين من العمليات في كل عقدة. يمكنك اعتماد هذا النهج لتشغيل التدريب الموزع باستخدام إما مشغل لكل عملية أو مشغل لكل عقدة، اعتمادا على ما إذا كان process_count_per_node قد تم تعيينه إلى 1 (الافتراضي) لكل مشغل عقدة، أو يساوي عدد الأجهزة/وحدات معالجة الرسومات لكل مشغل عملية. يقوم Azure ML بإنشاء أمر تشغيل MPI الكامل (mpirun) خلف الكواليس. لا يمكنك توفير أوامر مشغل العقدة الكاملة الخاصة بك مثل mpirun أو DeepSpeed launcher.

تلميح

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

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

  1. استخدم بيئة Azure ML مع إطار التعلم العميق المفضل و MPI. يوفر AzureML بيئة منسقة لأطر العمل الشائعة.
  2. تعريف MpiConfiguration مع process_count_per_node و node_count. process_count_per_node يجب أن يكون مساويا لعدد وحدات معالجة الرسومات لكل عقدة لكل عملية تشغيل ، أو مضبوطا على 1 (الافتراضي) لكل تشغيل عقدة إذا كان البرنامج النصي للمستخدم مسؤولا عن تشغيل العمليات لكل عقدة.
  3. تمرير الكائن MpiConfiguration إلى معلمة distributed_job_configScriptRunConfig.
from azureml.core import Workspace, ScriptRunConfig, Environment, Experiment
from azureml.core.runconfig import MpiConfiguration

curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)
distr_config = MpiConfiguration(process_count_per_node=4, node_count=2)

run_config = ScriptRunConfig(
  source_directory= './src',
  script='train.py',
  compute_target=compute_target,
  environment=pytorch_env,
  distributed_job_config=distr_config,
)

# submit the run configuration to start the job
run = Experiment(ws, "experiment_name").submit(run_config)

هوروفود

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

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

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

مثال هوروفود

ديب سبيد

لا تستخدم مشغل DeepSpeed المخصص لتشغيل التدريب الموزع باستخدام مكتبة DeepSpeed على Azure ML. بدلا من ذلك، قم بتكوين وظيفة MPI لبدء مهمة التدريب باستخدام MPI.

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

  • تحتوي بيئة Azure ML على DeepSpeed وتبعياتها و Open MPI و mpi4py.
  • MpiConfiguration إنشاء مع التوزيع الخاص بك.

مثال على DeepSeed

متغيرات البيئة من MPI المفتوح

عند تشغيل مهام MPI باستخدام صور 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 - عدد العمليات على العقدة

تلميح

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

PyTorch

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

تلميح

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

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

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

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

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

init_method يخبرك كيف يمكن لكل عملية اكتشاف بعضها البعض ، وكيف يقومون بتهيئة مجموعة العملية والتحقق منها باستخدام الواجهة الخلفية للاتصال. بشكل افتراضي إذا init_method لم يتم تحديد PyTorch سوف تستخدم طريقة تهيئة متغير البيئة (env://). init_method هي طريقة التهيئة الموصى بها لاستخدامها في التعليمات البرمجية للتدريب لتشغيل PyTorch الموزع على Azure ML. ستبحث 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).

خيارات إطلاق PyTorch

تدعم وظيفة Azure ML PyTorch نوعين من الخيارات لبدء التدريب الموزع:

  • مشغل لكل عملية: سيقوم النظام بتشغيل جميع العمليات الموزعة نيابة عنك ، مع جميع المعلومات ذات الصلة (مثل متغيرات البيئة) لإعداد مجموعة العمليات.
  • مشغل لكل عقدة: يمكنك تزويد Azure ML بمشغل الأداة المساعدة الذي سيتم تشغيله على كل عقدة. سيتعامل مشغل الأداة المساعدة مع إطلاق كل عملية من العمليات على عقدة معينة. محليا داخل كل عقدة ، RANK ويتم LOCAL_RANK إعدادها بواسطة المشغل. تنتمي كل من الأداة المساعدة torch.distributiond.launch و PyTorch Lightning إلى هذه الفئة.

لا توجد اختلافات جوهرية بين خيارات الإطلاق هذه. الخيار متروك إلى حد كبير لتفضيلاتك أو اتفاقيات الأطر / المكتبات المبنية فوق الفانيليا PyTorch (مثل Lightning أو Hugging Face).

تتناول الأقسام التالية المزيد من التفاصيل حول كيفية تكوين وظائف Azure ML PyTorch لكل خيار من خيارات التشغيل.

DisdistributiondDataParallel (لكل عملية إطلاق)

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

  1. تحديد البرنامج النصي للتدريب والوسيطات
  2. قم بإنشاء PyTorchConfiguration وحدد process_count و node_count. process_count يتوافق مع إجمالي عدد العمليات التي تريد تشغيلها لوظيفتك. process_count يجب أن تساوي # GPUs per node x # nodesعادة . إذا process_count لم يتم تحديده، فسيقوم Azure ML افتراضيا بتشغيل عملية واحدة لكل عقدة.

سيقوم Azure ML بتعيين MASTER_ADDRالمتغيرات و و MASTER_PORTWORLD_SIZE، والبيئة على كل عقدة، وتعيين متغيرات مستوى RANK العملية والبيئة NODE_RANKLOCAL_RANK.

لاستخدام هذا الخيار للتدريب متعدد العمليات لكل عقدة، استخدم Azure ML Python SDK >= 1.22.0. تم تقديم Process_count في 1.22.0.

from azureml.core import ScriptRunConfig, Environment, Experiment
from azureml.core.runconfig import PyTorchConfiguration

curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)
distr_config = PyTorchConfiguration(process_count=8, node_count=2)

run_config = ScriptRunConfig(
  source_directory='./src',
  script='train.py',
  arguments=['--epochs', 50],
  compute_target=compute_target,
  environment=pytorch_env,
  distributed_job_config=distr_config,
)

run = Experiment(ws, 'experiment_name').submit(run_config)

تلميح

إذا كان البرنامج النصي للتدريب الخاص بك يمرر معلومات مثل الرتبة المحلية أو الترتيب كوسيطات برنامج نصي، فيمكنك الرجوع إلى متغير (متغيرات) البيئة في الوسيطات:

arguments=['--epochs', 50, '--local_rank', $LOCAL_RANK]

مثال على إطلاق Pytorch لكل عملية

استخدام torch.distributed.launch (لكل عقدة إطلاق)

يوفر PyTorch أداة تشغيل في torch.disdistributiond.launch يمكنك استخدامها لتشغيل عمليات متعددة لكل عقدة. تولد الوحدة torch.distributed.launch عمليات تدريب متعددة على كل عقد من العقد.

توضح الخطوات التالية كيفية تكوين مهمة PyTorch باستخدام مشغل لكل عقدة على Azure ML. تحقق المهمة ما يعادل تشغيل الأمر التالي:

python -m torch.distributed.launch --nproc_per_node <num processes per node> \
  --nnodes <num nodes> --node_rank $NODE_RANK --master_addr $MASTER_ADDR \
  --master_port $MASTER_PORT --use_env \
  <your training script> <your script arguments>
  1. قم بتوفير torch.distributed.launch الأمر إلى command معلمة المنشئ ScriptRunConfig . يقوم Azure ML بتشغيل هذا الأمر على كل عقدة من مجموعة التدريب الخاصة بك. --nproc_per_node يجب أن يكون أقل من أو يساوي عدد وحدات معالجة الرسومات المتوفرة في كل عقدة. يتم تعيين كل من MASTER_ADDR MASTER_PORT NODE_RANK بواسطة Azure ML، بحيث يمكنك فقط الرجوع إلى متغيرات البيئة في الأمر. يقوم Azure ML بتعيين MASTER_PORT إلى ، ولكن يمكنك تمرير قيمة مختلفة إلى 6105وسيطة الأمر torch.disdistributiond.launch إذا كنت ترغب في --master_port ذلك. (ستقوم أداة التشغيل المساعدة بإعادة تعيين متغيرات البيئة.)
  2. قم بإنشاء PyTorchConfiguration ملف وحدد node_countملف .
from azureml.core import ScriptRunConfig, Environment, Experiment
from azureml.core.runconfig import PyTorchConfiguration

curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)
distr_config = PyTorchConfiguration(node_count=2)
launch_cmd = "python -m torch.distributed.launch --nproc_per_node 4 --nnodes 2 --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT --use_env train.py --epochs 50".split()

run_config = ScriptRunConfig(
  source_directory='./src',
  command=launch_cmd,
  compute_target=compute_target,
  environment=pytorch_env,
  distributed_job_config=distr_config,
)

run = Experiment(ws, 'experiment_name').submit(run_config)

تلميح

تدريب وحدة معالجة الرسومات المتعددة أحادية العقدة: إذا كنت تستخدم الأداة المساعدة للتشغيل لتشغيل تدريب PyTorch متعدد وحدات معالجة الرسومات أحادي العقدة distributed_job_config ، فلن تحتاج إلى تحديد معلمة ScriptRunConfig.

launch_cmd = "python -m torch.distributed.launch --nproc_per_node 4 --use_env train.py --epochs 50".split()

run_config = ScriptRunConfig(
 source_directory='./src',
 command=launch_cmd,
 compute_target=compute_target,
 environment=pytorch_env,
)

مثال على إطلاق PyTorch لكل عقدة

PyTorch البرق

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

للتدريب على العقدة الواحدة (بما في ذلك وحدة معالجة الرسومات المتعددة أحادية العقدة)، يمكنك تشغيل التعليمات البرمجية الخاصة بك على Azure ML دون الحاجة إلى تحديد distributed_job_configملف . للتدريب متعدد العقد، يتطلب Lightning تعيين متغيرات البيئة التالية على كل عقدة من مجموعة التدريب الخاصة بك:

  • MASTER_ADDR
  • MASTER_PORT
  • NODE_RANK

لتشغيل تدريب Lightning متعدد العقد على Azure ML، اتبع إرشادات التشغيل لكل عقدة ، ولكن لاحظ أن الاستراتيجية تعمل حاليا فقط عند تشغيل تجربة باستخدام عقد متعددة، مع وحدة معالجة رسومات واحدة لكل عقدة ddp .

لتشغيل تجربة باستخدام عقد متعددة مع وحدات معالجة رسومات متعددة:

  • تعريف MpiConfiguration وتحديد node_count. لا تحدد process_count لأن Lightning يتعامل داخليا مع إطلاق عمليات العامل لكل عقدة.

  • بالنسبة لوظائف PyTorch، يعالج Azure ML إعداد متغيرات البيئة MASTER_ADDR MASTER_PORT NODE_RANK التي يتطلبها Lightning:

    import os
    
    def set_environment_variables_for_nccl_backend(single_node=False, master_port=6105):
         if not single_node:
             master_node_params = os.environ["AZ_BATCH_MASTER_NODE"].split(":")
             os.environ["MASTER_ADDR"] = master_node_params[0]
    
             # Do not overwrite master port with that defined in AZ_BATCH_MASTER_NODE
             if "MASTER_PORT" not in os.environ:
                 os.environ["MASTER_PORT"] = str(master_port)
         else:
             os.environ["MASTER_ADDR"] = os.environ["AZ_BATCHAI_MPI_MASTER_NODE"]
             os.environ["MASTER_PORT"] = "54965"
    
         os.environ["NCCL_SOCKET_IFNAME"] = "^docker0,lo"
         try:
             os.environ["NODE_RANK"] = os.environ["OMPI_COMM_WORLD_RANK"]
             # additional variables
             os.environ["MASTER_ADDRESS"] = os.environ["MASTER_ADDR"]
             os.environ["LOCAL_RANK"] = os.environ["OMPI_COMM_WORLD_LOCAL_RANK"]
             os.environ["WORLD_SIZE"] = os.environ["OMPI_COMM_WORLD_SIZE"]
         except:
             # fails when used with pytorch configuration instead of mpi
             pass
    
  • يتعامل Lightning مع حساب الحجم العالمي من أعلام المدرب ويدير --num_nodes الرتبة --gpus والرتبة المحلية داخليا:

    from azureml.core import ScriptRunConfig, Experiment
    from azureml.core.runconfig import MpiConfiguration
    
    nnodes = 2
    args = ['--max_epochs', 50, '--gpus', 2, '--accelerator', 'ddp_spawn', '--num_nodes', nnodes]
    distr_config = MpiConfiguration(node_count=nnodes)
    
    run_config = ScriptRunConfig(
       source_directory='./src',
       script='train.py',
       arguments=args,
       compute_target=compute_target,
       environment=pytorch_env,
       distributed_job_config=distr_config,
    )
    
    run = Experiment(ws, 'experiment_name').submit(run_config)
    

معانقة محولات الوجه

يوفر Hugging Face العديد من الأمثلة لاستخدام مكتبة torch.distributed.launch Transformers الخاصة به لتشغيل التدريب الموزع. لتشغيل هذه الأمثلة والبرامج النصية للتدريب المخصص باستخدام واجهة برمجة تطبيقات مدرب المحولات، اتبع القسم استخدام torch.distributed.launch .

نموذج التعليمات البرمجية لتكوين المهمة لضبط نموذج BERT الكبير على مهمة MNLI لتصنيف النص باستخدام run_glue.py البرنامج النصي على عقدة واحدة مع 8 وحدات معالجة رسومات:

from azureml.core import ScriptRunConfig
from azureml.core.runconfig import PyTorchConfiguration

distr_config = PyTorchConfiguration() # node_count defaults to 1
launch_cmd = "python -m torch.distributed.launch --nproc_per_node 8 text-classification/run_glue.py --model_name_or_path bert-large-uncased-whole-word-masking --task_name mnli --do_train --do_eval --max_seq_length 128 --per_device_train_batch_size 8 --learning_rate 2e-5 --num_train_epochs 3.0 --output_dir /tmp/mnli_output".split()

run_config = ScriptRunConfig(
  source_directory='./src',
  command=launch_cmd,
  compute_target=compute_target,
  environment=pytorch_env,
  distributed_job_config=distr_config,
)

يمكنك أيضا استخدام خيار التشغيل لكل عملية لتشغيل التدريب الموزع دون استخدام torch.distributed.launch. شيء واحد يجب مراعاته عند استخدام هذه الطريقة هو أن المحولات TrainingArguments تتوقع أن يتم تمرير الرتبة المحلية كحجة (--local_rank). torch.distributed.launch يعتني بهذا عندما --use_env=False، ولكن إذا كنت تستخدم كل عملية تشغيل ، فستحتاج إلى تمرير الترتيب المحلي صراحة كوسيطة إلى البرنامج النصي --local_rank=$LOCAL_RANK للتدريب حيث يقوم Azure ML بتعيين LOCAL_RANK متغير البيئة فقط.

TensorFlow

إذا كنت تستخدم TensorFlow الموزع الأصلي في التعليمات البرمجية للتدريب الخاصة بك، مثل واجهة برمجة تطبيقات TensorFlow 2.x tf.distribute.Strategy ، فيمكنك تشغيل المهمة الموزعة عبر Azure ML باستخدام TensorflowConfiguration.

للقيام بذلك، حدد TensorflowConfiguration كائنا إلى distributed_job_config معلمة المنشئ ScriptRunConfig . إذا كنت تستخدم tf.distribute.experimental.MultiWorkerMirroredStrategy، فحدد في worker_count المقابل TensorflowConfiguration لعدد العقد لمهمة التدريب الخاصة بك.

from azureml.core import ScriptRunConfig, Environment, Experiment
from azureml.core.runconfig import TensorflowConfiguration

curated_env_name = 'AzureML-TensorFlow-2.3-GPU'
tf_env = Environment.get(workspace=ws, name=curated_env_name)
distr_config = TensorflowConfiguration(worker_count=2, parameter_server_count=0)

run_config = ScriptRunConfig(
  source_directory='./src',
  script='train.py',
  compute_target=compute_target,
  environment=tf_env,
  distributed_job_config=distr_config,
)

# submit the run configuration to start the job
run = Experiment(ws, "experiment_name").submit(run_config)

إذا كان البرنامج النصي للتدريب يستخدم استراتيجية خادم المعلمة للتدريب الموزع، مثل TensorFlow 1.x القديم، فستحتاج أيضا إلى تحديد عدد خوادم المعلمات التي يجب استخدامها في المهمة، على سبيل المثال، tf_config = TensorflowConfiguration(worker_count=2, parameter_server_count=1).

TF_CONFIG

في TensorFlow ، يلزم وجود متغير بيئة TF_CONFIG للتدريب على أجهزة متعددة. بالنسبة لمهام TensorFlow، سيقوم Azure ML بتكوين متغير 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

تسريع تدريب وحدة معالجة الرسومات الموزعة باستخدام InfiniBand

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

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

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

تحذير

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

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

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