دليل تدريب 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، اتبع الخطوات التالية:
- استخدم بيئة Azure التعلم الآلي مع إطار عمل التعلم العميق المفضل وMPI. يوفر Azure التعلم الآلي بيئات منسقة لأطر العمل الشائعة. أو أنشئ بيئة مخصصة مع إطار عمل التعلم العميق المفضل وMPI.
- حدد باستخدام
command
instance_count
.instance_count
يجب أن يكون مساويا لعدد وحدات معالجة الرسومات لكل عقدة لكل عملية تشغيل، أو تعيين إلى 1 (الافتراضي) لكل عقدة تشغيل إذا كان البرنامج النصي للمستخدم مسؤولا عن تشغيل العمليات لكل عقدة. - استخدم معلمة
distribution
command
لتحديد إعدادات .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
- للحصول على دفتر الملاحظات الكامل لتشغيل مثال Horovod، راجع أمثلة azureml: تدريب شبكة عصبية أساسية باستخدام MPI الموزعة على مجموعة بيانات MNIST باستخدام Horovod.
متغيرات البيئة من Open MPI
عند تشغيل مهام MPI مع صور Open MPI، يمكنك استخدام متغيرات البيئة التالية لكل عملية تم تشغيلها:
OMPI_COMM_WORLD_RANK
: رتبة العمليةOMPI_COMM_WORLD_SIZE
: حجم العالمAZ_BATCH_MASTER_NODE
: العنوان الأساسي مع المنفذ،MASTER_ADDR:MASTER_PORT
OMPI_COMM_WORLD_LOCAL_RANK
: الترتيب المحلي للعملية على العقدة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
وnccl
gloo
. بالنسبة للتدريب المستند إلى وحدة معالجة الرسومات، nccl
يوصى به للحصول على أفضل أداء ويجب استخدامه كلما أمكن ذلك.
init_method
يخبرنا كيف يمكن لكل عملية اكتشاف بعضها البعض، وكيفية التهيئة والتحقق من مجموعة العملية باستخدام خلفية الاتصال. بشكل افتراضي، إذا init_method
لم يتم تحديد، يستخدم PyTorch أسلوب تهيئة متغير البيئة (env://
). init_method
هو أسلوب التهيئة الموصى به لاستخدامه في التعليمات البرمجية للتدريب لتشغيل PyTorch الموزع على Azure التعلم الآلي. يبحث PyTorch عن متغيرات البيئة التالية للتهيئة:
MASTER_ADDR
: عنوان IP للجهاز الذي يستضيف العملية بالرتبة 0MASTER_PORT
: منفذ مجاني على الجهاز الذي يستضيف العملية بالرتبة 0WORLD_SIZE
: العدد الإجمالي للعمليات. يجب أن يكون مساويا لإجمالي عدد الأجهزة (GPU) المستخدمة للتدريب الموزعRANK
: الترتيب (العمومي) للعملية الحالية. القيم المحتملة هي من 0 إلى (حجم العالم - 1)
لمزيد من المعلومات حول تكوين مجموعة العمليات، راجع وثائق PyTorch.
تحتاج العديد من التطبيقات أيضا إلى متغيرات البيئة التالية:
LOCAL_RANK
: الترتيب المحلي (النسبي) للعملية داخل العقدة. القيم المحتملة هي من 0 إلى (عدد العمليات على العقدة - 1). هذه المعلومات مفيدة لأنه يجب تنفيذ العديد من العمليات مثل إعداد البيانات مرة واحدة فقط لكل عقدة، عادة على local_rank = 0.NODE_RANK
: رتبة العقدة للتدريب متعدد العقد. القيم المحتملة هي من 0 إلى (إجمالي عدد العُقَد - 1).
لا تحتاج إلى استخدام أداة تشغيل إعجاب torch.distributed.launch
. لتشغيل مهمة PyTorch الموزعة:
- حدد البرنامج النصي للتدريب والوسيطات.
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_ADDR
MASTER_PORT
WORLD_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
- للحصول على دفتر الملاحظات الكامل لتشغيل مثال Pytorch، راجع أمثلة azureml: التدريب الموزع باستخدام PyTorch على CIFAR-10.
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
- للحصول على دفتر الملاحظات الكامل لتشغيل مثال TensorFlow، راجع أمثلة azureml: تدريب شبكة عصبية أساسية باستخدام MPI الموزعة على مجموعة بيانات MNIST باستخدام Tensorflow مع Horovod.
تسريع تدريب 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 المثبت مسبقا والمكون مسبقا.