دليل شامل لتحسين أداء وحدة معالجة الرسومات (GPU) للتعلم العميق
تستكشف هذه الورقة البحثية أساليب تحسين أداء وحدة معالجة الرسومات (GPU) في تدريب نماذج التعلم العميق واستنتاجها. ومن خلال دراسة هذه الورقة، تُعرض تقنيات لتقليل وقت التدريب وزيادة الإنتاجية.

دليل شامل لتحسين أداء وحدة معالجة الرسومات (GPU) للتعلم العميق

في هذه المقالة، نستكشف تحسين أداء وحدة معالجة الرسومات (GPU) للتعلم العميق. باستخدام أساليب عملية وتقنية، نعلمك كيفية تحقيق أقل وقت تدريب وأعلى إنتاجية من خلال استخدام الأجهزة المناسبة والإعدادات المثلى.
0 الأسهم
0
0
0
0

 

لماذا يُعد تحسين أداء وحدة معالجة الرسومات (GPU) مهمًا للتعلم العميق؟

يُعد تحسين أداء وحدة معالجة الرسومات للتعلم العميق تحديًا أساسيًا لأولئك الذين يعملون على تدريب واستنتاج النماذج الكبيرة. هدف يقدم هذا الدليل إرشادات عملية وتقنية لزيادة أداء وحدة معالجة الرسومات في البيئات المحلية والسحابية: من ضبط برامج التشغيل وتكوين نظام التشغيل إلى تحسين الإدخال/الإخراج، والأطر، والتحليل، والتدريب الموزع.

هذا النص موجه لمسؤولي المواقع، ومهندسي DevOps، وباحثي التعلم العميق، وفرق MLOps لمساعدتهم في اختيار توليفة الأجهزة المناسبة (مثل خادم رسومات سحابي مزود بوحدة معالجة رسومات مع إمكانية الوصول إلى أكثر من 85 موقعًا) وتحسين البرمجيات، لتحقيق أقل وقت تدريب وأعلى إنتاجية.

 

العناصر الرئيسية والرؤية

لتحسين الأداء، نحتاج إلى مراعاة أربعة مجالات رئيسية. كل مجال من هذه المجالات، بمفرده أو مجتمعة، يمكن أن يخلق اختناقات تقلل من الإنتاجية.

  • الحوسبة باستخدام وحدة معالجة الرسومات (GPU): استخدام نوى الموتر، الدقة المختلطة وتحسين النواة.
  • ذاكرة وحدة معالجة الرسومات وإدارتها: تجنب نفاد الذاكرة، استخدم نقطة تفتيش التنشيط وتقليل استهلاك الذاكرة.
  • عمليات الإدخال والإخراج ومعالجة البيانات (خط أنابيب البيانات): NVMe، prefetch، DALI أو tf.data للتخلص من اختناقات الإدخال/الإخراج.
  • الشبكة في التعلم الموزع (الشبكة): زمن الوصول وعرض النطاق الترددي بين العقد، واستخدام RDMA/InfiniBand، وإعدادات NCCL.

 

تحديد نقاط الاختناق

يُعد التشخيص الدقيق للمشكلة العالقة الخطوة الأولى. إذا استخدام وحدة معالجة الرسومات إذا كان الأداء منخفضًا وتتوقع أداءً أعلى، فعادةً ما تكون المشكلة في وحدة المعالجة المركزية أو الإدخال/الإخراج.

تشمل الأدوات الأساسية للتشخيص ما يلي: نفيديا-سمي وأدوات تحليل أداء NVIDIA مثل إن سيس و إنسايت توفر هذه الأدوات معلومات حول استخدام وحدة الذاكرة المتعددة، والذاكرة، واستهلاك الطاقة.

 

أوامر nvidia-smi المفيدة وفحص البنية الشبكية

nvidia-smi --query-gpu=utilization.gpu,utilization.memory,memory.total,memory.used --format=csv
nvidia-smi topo -m

 

أدوات تحديد الملفات الشخصية الموصى بها

استخدم الأدوات التالية لإجراء تحليل أعمق:

  • أنظمة إنفيديا إنسايت (nsys) و إنسايت كومبيوت لتحليل توقيت النواة والذاكرة.
  • محلل أداء PyTorch و محلل أداء TensorBoard للتحليل ضمن الإطار.
  • أدوات النظام مثل أداء، قمة و أيوستات لفحص وحدة المعالجة المركزية والقرص.

مثال تنفيذي إن سيس:

nsys profile --trace=cuda,cudnn,osrt -o my_profile python train.py

 

إعدادات النظام وبرامج التشغيل (لينكس)

قم بتثبيت بيئة نظيفة تتوافق مع إصدارات CUDA/cuDNN. النقاط الرئيسية:

  • تحقق دائمًا من التوافق بين إصدار برنامج تشغيل NVIDIA ومجموعة أدوات CUDA و cuDNN.
  • بالنسبة للخوادم المخصصة، التفعيل وضع الاستمرارية ويمكن لضبط تردد وحدة معالجة الرسومات أن يمنع تقلبات التردد:
sudo nvidia-smi -pm 1
sudo nvidia-smi -ac <memClock,graphicsClock>

يُعد إعداد Docker مع دعم وحدة معالجة الرسومات مثالاً على الخطوات الأساسية:

sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
docker run --gpus '"device=0,1"' --rm -it your-image:tag bash

مثال على تثبيت برنامج التشغيل و nvidia-docker (مثال عام لنظام Ubuntu):

sudo apt update && sudo apt install -y build-essential dkms
# add NVIDIA repository and install driver and cuda-toolkit per NVIDIA guide
sudo apt install -y nvidia-docker2
sudo systemctl restart docker

 

تحسين على مستوى الإطار (PyTorch و TensorFlow)

تحتوي الأطر البرمجية على ميزات لاستغلال الأجهزة؛ ويؤثر تكوينها الصحيح بشكل مباشر على الإنتاجية واستهلاك الذاكرة.

 

PyTorch — إعداد سريع وعملي

  • تفعيل خاصية الضبط التلقائي لـ cuDNN للنماذج ذات المدخلات الثابتة:
torch.backends.cudnn.benchmark = True
  • استخدام الدقة المختلطة مع torch.cuda.amp لاستخدام وحدات معالجة الموتر:
scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast(): outputs = model(inputs)
  • مُحمِّل البيانات: زيادة عدد العمال طالما أن وحدة المعالجة المركزية أو الإدخال/الإخراج لا تشكل عنق زجاجة، استخدم pin_memory=True و persistent_workers=True:
DataLoader(dataset, batch_size=..., num_workers=8, pin_memory=True, persistent_workers=True, prefetch_factor=2)
  • عينة تراكم التدرج لمحاكاة دفعة أكبر دون حدوث نفاد الذاكرة:
loss = model(...) / accumulation_steps
scaler.scale(loss).backward()
if (step+1) % accumulation_steps == 0:
    scaler.step(optimizer)
    scaler.update()
    optimizer.zero_grad()

 

TensorFlow - الإعدادات العملية

  • تفعيل الدقة المختلطة:
from tensorflow.keras import mixed_precision
mixed_precision.set_global_policy('mixed_float16')
  • tf.data: استخدم خاصية الجلب المسبق، وقم بالربط باستخدام عدد_الاستدعاءات_المتوازية=tf.data.AUTOTUNE وذاكرة تخزين مؤقتة للمجموعات الصغيرة:
dataset = dataset.map(..., num_parallel_calls=tf.data.AUTOTUNE).prefetch(tf.data.AUTOTUNE)
  • إعدادات نمو ذاكرة وحدة معالجة الرسومات:
gpus = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(gpus[0], True)

 

إدارة البيانات والإدخال/الإخراج

يمكن أن تصبح عمليات الإدخال/الإخراج بسرعة عنق زجاجة، خاصة بالنسبة لمجموعات البيانات الكبيرة وأحمال العقد المتعددة.

  • NVMe يُنصح باستخدام الوضع المحلي مع مجموعات البيانات الكبيرة للاستفادة من سرعة الإدخال/الإخراج.
  • في بيئة متعددة العقد، استخدم أنظمة الملفات الموزعة (Lustre، Ceph) أو مخازن الكائنات المتوافقة مع S3.
  • بالنسبة للبيانات الثابتة (مثل المتجهات أو النماذج الجاهزة)، فإن استخدام شبكة توصيل المحتوى (CDN) والتغطية العالمية (أكثر من 85 موقعًا) يمكن أن يقلل من زمن استجابة التنزيل.
  • معالجة الصور والفيديو: يمكن لتقنية NVIDIA DALI نقل المعالجة المسبقة من وحدة المعالجة المركزية إلى وحدة معالجة الرسومات، مما يقلل الضغط على وحدة المعالجة المركزية.

 

إعدادات الشبكة والتعلم الموزع

للتدريب متعدد العقد، استخدم NCCL كخادم خلفي للتواصل بين وحدات معالجة الرسومات. وتتفوق الشبكات التي تستخدم RDMA/InfiniBand على TCP عبر الإيثرنت.

بيئات مفيدة:

export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_DISABLE=0

توصية الشبكة: استخدم 25/40/100GbE أو InfiniBand للتدريب الموزع على النماذج الكبيرة.

مثال على تشغيل PyTorch DDP داخل Docker:

docker run --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 your-image
python -m torch.distributed.run --nproc_per_node=4 --nnodes=2 --node_rank=0 --rdzv_endpoint=master:29500 train.py

 

زيادة كفاءة ذاكرة وحدة معالجة الرسومات

تساعد الحلول التالية في تقليل استهلاك الذاكرة وزيادة قابلية التوسع:

  • الدقة المختلطة (FP16) ونوى الموتر لتقليل الاستهلاك وزيادة الإنتاجية.
  • نقطة تفتيش التنشيط عدم حفظ جميع عمليات التنشيط وإعادة إنشائها في عملية التراجع.
  • تقنيات مثل زيرو (ديب سبيد) و برنامج التنمية الاجتماعية والأسرية (PyTorch Fully Sharded Data Parallel) لتقسيم الذاكرة بين وحدات معالجة الرسومات (GPUs).
  • تقليل الدقة في أجزاء من النموذج (مثل التضمينات) والاحتفاظ بالأجزاء الحساسة في FP32.

 

نصائح تقنية ومتغيرات بيئية مفيدة

بعض متغيرات البيئة وإعدادات النظام التي غالباً ما تكون مفيدة:

  • التحكم في تخصيص وحدة معالجة الرسومات (GPU) مع CUDA_VISIBLE_DEVICES=0,1.
  • لتصحيح الأخطاء من CUDA_LAUNCH_BLOCKING=1 الاستخدام (مشكلة، فهو يسبب بطءًا).
  • اضبط عدد خيوط وحدة المعالجة المركزية لمنع الاكتظاظ:
export OMP_NUM_THREADS=4
export MKL_NUM_THREADS=4

بالنسبة لـ NCCL في بيئات الحوسبة السحابية عالية السرعة (إيثرنت):

export NCCL_SOCKET_IFNAME=ens5
export NCCL_IB_DISABLE=1

 

الأمن والإدارة التشغيلية

تُعد الإدارة التشغيلية الموثوقة أمراً ضرورياً لبيئات الإنتاج:

  • تأمين الوصول إلى SSH باستخدام المفتاح العام، والتخلص من تسجيل الدخول بكلمة المرور، وإغلاق المنافذ غير الضرورية.
  • قم بجدولة تحديثات برامج التشغيل وأخذ لقطات شاشة قبل الترقية على الخوادم السحابية.
  • قم بتشغيل النماذج في حاوية (nvidia-docker) للعزل؛ استخدم NVIDIA Device Plugin أو GPU Operator في Kubernetes.
  • استخدام الخوادم المحمية حماية من هجمات DDoS ومراقبة بيئات الإنتاج ذات حركة المرور الواردة.

 

التكوين الموصى به بناءً على الاحتياجات

تكوين الأجهزة بناءً على نوع المهمة:

  • التطوير والاختبار (تجارب محلية / صغيرة): 1x NVIDIA T4 أو RTX 3080، 32-64 جيجابايت من ذاكرة الوصول العشوائي، NVMe 1 تيرابايت، 8 أنوية معالجة مركزية.
  • التعليم المتوسط (البحث): 2-4x A100/RTX 6000، 256 جيجابايت من ذاكرة الوصول العشوائي، NVMe 2-4 تيرابايت، 32-64 نواة معالجة مركزية، 25-100 جيجابت إيثرنت.
  • الاستدلال / زمن استجابة منخفض: وحدة معالجة الرسومات والذاكرة عالية السرعة (مثل A10/A30)، وNVMe للنماذج، ومجموعات التوسع التلقائي، وCDN للنماذج والبيانات.
  • المعالجة الرسومية/الحوسبة الثقيلة: وحدة معالجة الرسومات ذات مواصفات FP32 عالية، والكثير من ذاكرة الوصول العشوائي للفيديو، وNVLink إذا كانت هناك حاجة إلى ذاكرة مشتركة.

 

سيناريوهات عملية وأوامر نموذجية

الأوامر الشائعة والأمثلة المفيدة في فحص النماذج وتشغيلها:

  • عرض حالة وحدة معالجة الرسومات:
watch -n1 nvidia-smi
  • تشغيل حاوية PyTorch مع إمكانية الوصول إلى جميع وحدات معالجة الرسومات وذاكرة محدودة:
docker run --gpus all --memory=128g --cpus=32 -it my-pytorch:latest bash

مثال على مقتطف برمجي لـ PyTorch لـ AMP و DataLoader:

model.train()
scaler = torch.cuda.amp.GradScaler()
for data, target in dataloader:
    data, target = data.cuda(non_blocking=True), target.cuda(non_blocking=True)
    optimizer.zero_grad()
    with torch.cuda.amp.autocast():
        output = model(data)
        loss = loss_fn(output, target)
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

 

الخاتمة والتوصية النهائية

يتطلب تحسين أداء وحدة معالجة الرسومات (GPU) للتعلم العميق مزيجًا من التحسينات على مستويات متعددة: الأجهزة المناسبة (وحدة معالجة الرسومات، وNVMe، والشبكات السريعة)، وبرامج التشغيل المناسبة، وتقنية الحاويات، وتحسين مسار البيانات، واستخدام إمكانيات مثل الدقة المختلطة، نقطة تفتيش التنشيط والتعلم الموزع.

يُعد إجراء التحليل المنتظم وقياس التغييرات بعد كل عملية تحسين أفضل طريقة لتحديد الاختناقات الحقيقية.

 

الأسئلة الشائعة

قد يعجبك أيضاً
واجهة برمجة تطبيقات خدمة الويب من أمازون

واجهات برمجة التطبيقات والخدمات من Amazon (AWS): كل ما تحتاج إلى معرفته

في عالم اليوم الذي يشهد نموًا متسارعًا لتكنولوجيا المعلومات، أصبح استخدام البنية التحتية السحابية أحد الاحتياجات الرئيسية للشركات. تُعدّ خدمات أمازون ويب، أو اختصارًا AWS، من أكبر وأقوى مزودي الخدمات السحابية في العالم. في هذه المقالة، سنقدم تعريفًا لواجهة برمجة التطبيقات (API)، ودورها في AWS، ثم نتطرق إلى أهم خدمات أمازون.