دليل تدريب GPU الموزع (SDK v2)
ينطبق على: Python SDK azure-ai-ml v2 (الحالي)
تعرف على المزيد حول استخدام التعليمات البرمجية للتدريب على GPU الموزعة في Azure التعلم الآلي. تساعدك هذه المقالة على تشغيل التعليمات البرمجية للتدريب الموزع الحالي، وتقدم لك تلميحات وأمثلة لمتابعة كل إطار عمل:
- PyTorch
- TensorFlow
- تسريع تدريب GPU باستخدام InfiniBand
المتطلبات الأساسية
راجع المفاهيم الأساسية لتدريب وحدة معالجة الرسومات الموزعة، مثل توازي البيانات وتوازي البيانات الموزعة وتوازي النموذج.
تلميح
إذا كنت لا تعرف نوع التوازي الذي يجب استخدامه، فإن أكثر من 90٪ من الوقت يجب عليك استخدام توازي البيانات الموزعة.
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: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
مثال 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.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)
إذا كان البرنامج النصي للتدريب الخاص بك يستخدم استراتيجية خادم المعلمة للتدريب الموزع، مثل 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 المثبت مسبقا والمكون مسبقا.
الخطوات التالية
الملاحظات
https://aka.ms/ContentUserFeedback.
قريبًا: خلال عام 2024، سنتخلص تدريجيًا من GitHub Issues بوصفها آلية إرسال ملاحظات للمحتوى ونستبدلها بنظام ملاحظات جديد. لمزيد من المعلومات، راجعإرسال الملاحظات وعرضها المتعلقة بـ