إدارة وحدات معالجة الرسوم: لماذا أصبحت وحدات معالجة الرسوم الخاملة بمثابة الطائرات المتوقفة عن الطيران
في عمليات نشر الذكاء الاصطناعي المحلية، تعكس وحدات معالجة الرسومات الخاملة الطائرات الرابضة على الأرض: فهي تستهلك رأس المال، وتشغل حيزًا، وتفقد قيمتها دون أن تحقق عوائد. تضمن الإدارة الفعالة لوحدات معالجة الرسومات—عبر المحاكاة الافتراضية، وجدولة المهام، وتجميع الأحمال—أن تظل هذه الموارد القوية تحلق عاليًا، مما يزيد من الإنتاجية وكفاءة التكلفة للاستدلال على النماذج المحلية وتدريبها.
الوسوم
ملخص سريع
في عمليات نشر الذكاء الاصطناعي المحلية، تعكس وحدات معالجة الرسومات الخاملة الطائرات الرابضة على الأرض: فهي تستهلك رأس المال، وتشغل حيزًا، وتفقد قيمتها دون أن تحقق عوائد. تضمن الإدارة الفعالة لوحدات معالجة الرسومات—عبر المحاكاة الافتراضية، وجدولة المهام، وتجميع الأحمال—أن تظل هذه الموارد القوية تحلق عاليًا، مما يزيد من الإنتاجية وكفاءة التكلفة للاستدلال على النماذج المحلية وتدريبها.
إدارة وحدات معالجة الرسوميات: لماذا تُعد وحدات GPU الخاملة بمثابة طائرات متوقفة على الأرض
ادخل إلى أي مختبر ذكاء اصطناعي اليوم، وسترى مشهداً مألوفاً: رفوف من وحدات معالجة الرسوميات باهظة الثمن، ومراوح تدور بهدوء في وضع الخمول، منتظرةً مهمةً لن تأتي أبداً. إنه مشهد يذكّرنا بشكل غريب بأسطول من الطائرات المتوقفة على مدرج الطائرات — أصول رأسمالية ضخمة تحرق القيمة في كل ثانية تمضي دون استخدام. الطائرة التي تحلّق تدرّ إيرادات؛ أما الطائرة المتوقفة فلا تدرّ سوى التكاليف. وينطبق المنطق نفسه على وحدات معالجة الرسوميات. ومع ذلك، فإن معظم المؤسسات تدير أساطيل وحدات المعالجة الرسومية لديها بنفس القدر من التعقيد الذي كانت تستخدمه شركة طيران صغيرة لصيانة الطائرات في الثمانينيات: الكثير من الأجهزة، وقليل من القياس عن بُعد، ولا يوجد أي جدولة ديناميكية.
هذه المقالة عبارة عن دليل عملي ميداني لإصلاح هذه المشكلة. سننظر في سبب كون وحدات GPU الخاملة مكلفة للغاية، وما هي الأدوات التي تحتاجها لقياس المشكلة، وكيفية تثبيت حزمة مراقبة وجدولة خفيفة الوزن على بنيتك التحتية الخاصة وتكوينها واستخدامها. وفي النهاية، سيكون لديك أوامر ملموسة تحوّل أسطول وحدات معالجة الرسوميات لديك من تكلفة غارقة إلى أصل مُقاس ومُشارك ومُستغل بكفاءة.
التكلفة الخفية للسيليكون المتوقف
إن التشبيه بين وحدات GPU الخاملة والطائرات المتوقفة على الأرض ليس مبالغاً فيه. تأمل ما يمثله مسرّع الذكاء الاصطناعي الحديث في الواقع. فوحدة معالجة رسوميات عالية المستوى لمراكز البيانات قد تكلف عشرات الآلاف من الدولارات. ومصدر الطاقة والتبريد والبنية التحتية للشبكات يضاعف هذه التكلفة. وعندما توزّع هذه التكلفة على دورة حياة الأجهزة التي تمتد لثلاث سنوات، وتضيف الكهرباء وإدارة الأنظمة، فإن كل ساعة تبقى فيها وحدة معالجة رسوميات خاملة تمثل استنزافاً مباشراً لميزانيتك التشغيلية.
ومع ذلك، فإن اهتمام الصناعة ينصبّ حصرياً تقريباً على *تدريب النماذج الكبيرة*. لقد أكدت مدونة Hugging Face، أحد الأصوات الأكثر ثباتاً في مجال البنية التحتية لوحدات معالجة الرسوميات، مراراً وتكراراً أن الإدارة الفعالة لوحدات GPU لا تقل أهمية عن تصميم النموذج. كما سلطت الضوء على أن الفجوة بين الأداء الأقصى النظري والاستغلال الفعلي هائلة، وأن الأدوات — وليس البنية المعمارية — هي ما يقلص هذه الفجوة. وقد أصبحت المدونة مرجعاً موثوقاً لتحول المجتمع نحو قياس ومشاركة وتحسين كل مسرّع متاح.
الطائرة المتوقفة على الأرض لديها على الأقل عذر عاصفة أو فحص فني. أما وحدة معالجة الرسوميات الخاملة فغالباً لا تملك أي عذر على الإطلاق. إنها خاملة لأن قائمة الانتظار مهندسة بشكل سيئ، أو لأن لا أحد يعلم أنها متاحة، أو لأن مطوراً حجزها "احتياطاً" ثم ذهب لتناول الغداء. هذا السيناريو الأخير هو القاتل الحقيقي. إن حجز وحدة معالجة رسوميات دون جدولة يعادل قيام طيار بإبقاء الطائرة على المدرج لأنه *ربما* يرغب في الطيران لاحقاً.
ما الذي يعنيه "خامل" فعلياً
قبل إصلاح المشكلة، نحتاج إلى قياسها. وبالنسبة لوحدات معالجة الرسوميات، فإن مصطلح "خامل" أكثر دقة مما تظن.
- **استغلال SM**: هو جزء دورات معالجات البث الصغري التي تقوم فعلياً بالحساب. وحدة معالجة رسوميات تُظهر استغلال SM بنسبة 100% تكون مشغولة نظرياً، لكنها قد تظل محدودة بالذاكرة.
- **استغلال الذاكرة**: هو النسبة المئوية لذاكرة الجهاز المستخدمة. الاستخدام المرتفع للذاكرة مع نشاط SM منخفض غالباً ما يشير إلى ضعف تجميع الدفعات (batching) ومهمة تنتظر نقل البيانات.
- **استهلاك الطاقة**: مؤشر جيد للنشاط الكلي. وحدة NVIDIA A100 الخاملة قد تستهلك 30-50 واط؛ بينما تستهلك عند التحميل الكامل 250-400 واط.
- **محركات الحساب مقابل محركات النسخ**: إذا كانت محركات النسخ مشبعة بينما محركات الحساب خاملة، فأنت تغذي وحدة معالجة الرسوميات ببطء شديد.
الأدوات التي سنثبتها في الخطوة التالية ستُظهر لك كل هذه المقاييس. بعد أسبوع من جمع البيانات، سترى "أسطولك المتوقف" بوضوح: ربما وحدة معالجة رسوميات واحدة باستغلال 90% وسبع وحدات أخرى بنسبة 5%، لأن جدولك كان عبارة عن صفحة على ويكيبيديا ودعاء.
المتطلبات
ستحتاج إلى ما يلي لهذا الدليل:
- خادم أو أكثر من خوادم Linux مزودة بوحدات معالجة رسوميات من NVIDIA (يُوصى ببنية Ampere أو أحدث، لكن البنيات الأقدم تعمل أيضاً).
- برنامج تشغيل NVIDIA مثبت ويعمل. تحقق من ذلك باستخدام `nvidia-smi`. إذا كان الأمر مفقوداً، فقم بتثبيت برنامج التشغيل من مستودع توزيعتك أولاً.
- بايثون 3.8 أو أحدث، بالإضافة إلى `pip`.
- إلمام أساسي بسطر الأوامر و systemd.
- اختياري: مجموعة Kubernetes إذا كنت تريد متابعة أمثلة التنسيق المتقدمة. بالنسبة للمقال الأساسي، يكفي خادم واحد.
سنبني حزمة الإدارة الخاصة بنا من ثلاثة مكونات:
1. `nvidia-smi` — أداة سطر الأوامر القياسية من NVIDIA للاستعلام عن حالة وحدة معالجة الرسوميات. 2. `pynvml` — ربط Python رسمي من NVIDIA يتيح لنا كتابة نصوص مراقبة. 3. `cron` و `systemd` — المجدولان المدمجان في نظام التشغيل، واللذان يصبحان قويين بشكل مدهش عند دمجهما مع حالة وحدة معالجة الرسوميات التي نجمعها.
اختيارياً، سنقوم بتثبيت Ollama لخدمة استدلال LLM المحلي كوسيلة لملء الفترات الخاملة بعمل مفيد. وقد وثّقت مدونة Ollama مدى سهولة تحويل وحدة معالجة رسوميات احتياطية إلى خادم نماذج مستضاف ذاتياً، كما تنشر كل من Mistral AI News وMeta AI Blog بانتظام نماذج جديدة مفتوحة الأوزان يمكنك تشغيلها محلياً. وعند استخدامها كـ"عبء عمل خلفي" دوري، فإن هذا يحول وقت GPU الخامل إلى ميزة وليس تكلفة.
التثبيت خطوة بخطوة
الخطوة 1: التحقق من حزمة برامج تشغيل NVIDIA وتثبيتها
أولاً، تأكد من أن وحدة معالجة الرسوميات مرئية للنظام. قم بتشغيل:
nvidia-smiإذا لم يتم العثور على الأمر، فقم بتثبيته. على Ubuntu 22.04 أو أحدث:
sudo apt update
sudo apt install -y nvidia-driver-535
sudo rebootبعد إعادة التشغيل، تحقق مرة أخرى:
nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used --format=csvيجب أن ترى جدولاً يسرد فهرس كل وحدة معالجة رسوميات واسمها واستغلالها الحالي واستخدام الذاكرة. هذا هو خط الأساس الخاص بك.
الخطوة 2: تثبيت روابط بايثون
بعد ذلك، قم بتثبيت `pynvml`. هذه المكتبة الرسمية من NVIDIA تمنحنا وصولاً برمجياً إلى جميع بيانات القياس عن بُعد المرئية في `nvidia-smi`. سنقوم أيضاً بتثبيت `psutil` لمقاييس مستوى النظام:
pip install nvidia-ml-py psutilملاحظة: اسم الحزمة هو `nvidia-ml-py`، لكن الاستيراد يتم عبر `pynvml`. وهذا مصدر شائع للارتباك.
الخطوة 3: كتابة نص برمجي للمراقبة
أنشئ ملفاً باسم `gpu_monitor.py`:
#!/usr/bin/env python3
import pynvml
import time
import csv
import os
pynvml.nvmlInit()
device_count = pynvml.nvmlDeviceGetCount()
log_file = "gpu_utilization.csv"
def log_gpu_state():
with open(log_file, "a", newline="") as f:
writer = csv.writer(f)
writer.writerow([time.time()] + [get_device_state(i) for i in range(device_count)])
def get_device_state(index):
handle = pynvml.nvmlDeviceGetHandleByIndex(index)
util = pynvml.nvmlDeviceGetUtilizationRates(handle)
memory = pynvml.nvmlDeviceGetMemoryInfo(handle)
power = pynvml.nvmlDeviceGetPowerUsage(handle)
return f"{util.gpu}%|{util.memory}%|{memory.used / 1024**2:.0f}MiB|{power / 1000:.1f}W"
if __name__ == "__main__":
while True:
log_gpu_state()
time.sleep(30) # Sample every 30 secondsاختبر النص البرمجي:
python3 gpu_monitor.py &اتركه يعمل لمدة دقيقة، ثم افحص المخرجات:
cat gpu_utilization.csvسترى صفوفاً مثل `1724733600.0, 3%|5%|512MiB|38.2W, 98%|100%|79123MiB|392.1W`. إذا كانت وحدات معالجة الرسوميات لديك تبدو مثل المدخل الأول وليس الثاني، فأنت تعاني من مشكلة توقف.
الخطوة 4: إعداد خدمة systemd للقياس عن بُعد المستمر
المراقب الذي يعمل في واجهة طرفية أمامية ليس حلاً للمراقبة. أنشئ خدمة بحيث تنجو بيانات القياس لديك من عمليات إعادة التشغيل:
sudo nano /etc/systemd/system/gpu-monitor.serviceأضف ما يلي:
[Unit]
Description=GPU utilization logger
After=multi-user.target
[Service]
WorkingDirectory=/opt/gpu-monitor
ExecStart=/usr/bin/python3 /opt/gpu-monitor/gpu_monitor.py
Restart=always
[Install]
WantedBy=multi-user.targetالآن انقل النص البرمجي، وفعّل الخدمة، وابدأها:
sudo mkdir -p /opt/gpu-monitor
sudo mv gpu_monitor.py /opt/gpu-monitor/
sudo systemctl daemon-reload
sudo systemctl enable --now gpu-monitorتهانينا. لديك الآن سجل تاريخي مستمر لاستغلال كل وحدة معالجة رسوميات وذاكرتها واستهلاكها للطاقة — أي ما يعادل صندوقاً أسود لرحلة طيران لأسطول المسرّعات الخاص بك.
الخطوة 5: تثبيت Ollama للاستدلال في الخلفية
Ollama هو أسرع طريقة لتحويل الدورات الخاملة إلى عمل مفيد. إنه ملف ثنائي واحد يغلّف خدمة النماذج لنماذج LLM المحلية، وقد وثّقت مدونته نظاماً بيئياً متنامياً من النماذج التي يمكنك سحبها وتشغيلها. لتثبيته، قم بتشغيل:
curl -fsSL https://ollama.com/install.sh | shسينشئ لك سكريبت التثبيت خدمة systemd. تحقق من ذلك:
sudo systemctl status ollamaثم اسحب نموذجاً. نظراً لأن كلاً من Mistral AI وMeta تنشران نماذج مفتوحة الأوزان يدعمها Ollama، يمكنك الاختيار حسب ميزانية الذاكرة لديك:
ollama pull llama3أو، لنموذج أصغر يعمل على وحدة معالجة رسوميات واحدة بذاكرة ضئيلة:
ollama pull mistralبمجرد سحب النموذج، تظل عملية الخدمة مقيمة في ذاكرة وحدة معالجة الرسوميات، بانتظار طلب. عندما تعمل مهام التدريب الخاصة بك، يمكنك إيقاف Ollama أو ترحيله إلى وحدة معالجة رسوميات أخرى باستخدام `CUDA_VISIBLE_DEVICES`. هذا يحول وحدات معالجة الرسوميات "الخاملة" إلى نقطة استدلال خاصة — ذات قيمة للمطورين وفرق ضمان الجودة وخطوط معالجة المستندات في جميع أنحاء الشركة.
أمثلة على الاستخدام
المثال 1: اكتشاف وقتل عمليات GPU الزومبي
النمط الأكثر تدميراً في أي أسطول وحدات معالجة رسوميات هو عملية تحتفظ بالذاكرة دون القيام بأي حساب — طائرة هبطت بمحركات متوقفة ولكن فرامل الانتظار مفعّلة. استخدم هذا الأمر لسرد العمليات التي تشغل ذاكرة وحدة معالجة الرسوميات:
nvidia-smi --query-compute-apps=pid,used_memory,process_name --format=csvإذا رأيت عمليات `python3` قديمة، فحدد عمليتها الأم وقم بإنهائها:
ps aux | grep <pid>
sudo kill <pid>لجعل هذا روتيناً متكرراً، أضفه إلى `cron`:
crontab -eأضف السطر التالي لتشغيل سكريبت التنظيف كل ساعة:
0 * * * * /opt/gpu-monitor/cleanup_gpus.shيمكن أن يكون محتوى السكريبت حلقة بسيطة تجد العمليات التي تستخدم ذاكرة أكبر من الصفر ولكن استغلال وحدة معالجة الرسوميات لها هو 0% لأكثر من 10 دقائق. هذا هو أقرب شيء إلى فحص تلقائي لطاقم الأرض الذي حظيت به وحدات معالجة الرسوميات لديك على الإطلاق.
المثال 2: الجدولة الديناميكية باستخدام `CUDA_VISIBLE_DEVICES`
أكثر قاعدة فعالة لإدارة وحدات معالجة الرسوميات هي التعيين الصريح للأجهزة. بدلاً من ترك PyTorch أو TensorFlow يختار وحدة معالجة رسوميات عشوائياً، قم دائماً بتعيين متغير البيئة:
CUDA_VISIBLE_DEVICES=2 python3 train.pyإذا كنت تشغل مهمة تدريب متعددة وحدات المعالجة الرسومية، فقم بتقييد المجموعة المرئية:
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --nproc_per_node=4 train.pyادمج هذا مع فحص سريع بلغة بايثون للعثور على أقل وحدة معالجة رسوميات تحميلاً قبل تشغيل مهمة:
import pynvml
pynvml.nvmlInit()
best_idx = -1
best_util = 101
for i in range(pynvml.nvmlDeviceGetCount()):
handle = pynvml.nvmlDeviceGetHandleByIndex(i)
util = pynvml.nvmlDeviceGetUtilizationRates(handle).gpu
if util < best_util:
best_util = util
best_idx = i
print(best_idx)احفظ هذا كـ `pick_gpu.py` ولفّ أمر التدريب الخاص بك:
export BEST_GPU=$(python3 pick_gpu.py)
CUDA_VISIBLE_DEVICES=$BEST_GPU python3 train.pyهذا النمط البسيط يزيل أسوأ أشكال وحدة معالجة الرسوميات الخاملة: البطاقة المحجوزة وغير المستخدمة.
المثال 3: ملء الفترات الخاملة باستدلال دفعات Ollama
تخيل أن لديك وحدة معالجة رسوميات خاملة كل ليلة من منتصف الليل حتى السادسة صباحاً. بدلاً من ترك هذا الأصل جالساً على "المدرج"، قم بجدولة مهمة دفعات تستخدم Ollama لمعالجة قائمة طلبات موجودة مسبقاً. إليك عميل دفعات صغير بلغة بايثون:
import requests
import json
with open("texts.json") as f:
texts = json.load(f)
for text in texts:
response = requests.post(
"http://localhost:11434/api/generate",
json={"model": "mistral", "prompt": f"Summarize: {text}", "stream": False}
)
result = response.json()
print(result.get("response", ""))قم بتشغيل هذا مع وظيفة cron:
0 0 * * * /usr/bin/python3 /opt/batch_inference.py >> /var/log/batch_inference.log 2>&1أصبحت وحدة معالجة الرسوميات لديك الآن تقوم بعمل مفيد خلال فترة ميتة كان من الممكن أن تضيع. هذا هو الفرق تماماً بين طائرة متوقفة على الأرض وطائرة تعمل.
المثال 4: التنبيه على نقص استغلال وحدة معالجة الرسوميات
اكتب سكريبتاً يفحص آخر 10 أسطر من سجل CSV الخاص بك ويطلق مقياساً إذا كان الاستغلال أقل من 10% لأكثر من ساعة:
import sys
import csv
rows = list(csv.reader(open("/opt/gpu-monitor/gpu_utilization.csv")))
if len(rows) < 20:
print("Not enough samples yet.")
sys.exit(0)
# Parse GPU 0 utilization from the last 20 samples
recent_u = [float(r[1].split("|")[0].rstrip("%")) for r in rows[-20:]]
avg_util = sum(recent_u) / len(recent_u)
if avg_util < 10:
print(f"ALERT: GPU 0 average utilization {avg_util:.1f}% over the last 10 minutes.")
else:
print(f"OK: GPU 0 average utilization {avg_util:.1f}%.")إذا كنت ترغب في خط أنابيب تنبيه ناضج، فقم بتصدير هذه الأرقام إلى Prometheus وتصويرها في Grafana. ومع ذلك، فإن نهج CSV أنيق لأنه لا يتطلب أي بنية تحتية إضافية — لا Kubernetes، ولا أدوات تصدير، ولا قاعدة بيانات سلاسل زمنية.
ما بعد الخادم الواحد: إدارة الأسطول
الأوامر أعلاه تعمل بشكل جيد على جهاز واحد. في مجموعة Kubernetes، يتم حل المشكلة على مستوى المنصة. يقوم المكوّن الإضافي الرسمي لـ NVIDIA device plugin لـ Kubernetes بتعريض وحدات معالجة الرسوميات كموارد قابلة للجدولة، وتعمل عوامل تشغيل مثل NVIDIA GPU Operator على توسيع ذلك ليشمل تقسيم MIG (Multi-Instance GPU). وقد غطت مدونة Hugging Face هذه الأنماط على نطاق واسع، معتبرة إياها أساسية لخدمة النماذج والتدريب الفعالين من حيث التكلفة على نطاق واسع.
إذا لم تكن مؤسستك تستخدم Kubernetes بعد، فإن الانضباط لا يزال قابلاً للتطبيق: وحّد استخدام `CUDA_VISIBLE_DEVICES`، وفرض نظام حجز زمني واضح، وسجل الاستغلال في كل مكان. الأدوات ثانوية بالنسبة لعادة القياس.
الخلاصة
وحدة معالجة الرسوميات الخاملة هي طائرة متوقفة على الأرض: أصل رأسمالي ضخم لا يقوم بأي عمل يدرّ إيرادات بينما يحرق الكهرباء ويشغل سعة التبريد ويشغل الميزانية العمومية. الحل ليس شراء المزيد من وحدات معالجة الرسوميات. الحل هو تثبيت حلقة مراقبة، وفرض جدولة صريحة للأجهزة، وملء الفترات الخاملة فعلياً بمهام استدلال في الخلفية.
الأوامر في هذه المقالة بسيطة عن قصد. سكريبت بايثون، ووظيفة cron، وخدمة systemd، وخادم نماذج محلي. معاً، تمنحك ما يفتقر إليه معظم منظمات الذكاء الاصطناعي: الرؤية. ومع الرؤية يأتي الاستغلال؛ ومع الاستغلال يأتي العائد على الملايين من الدولارات التي أنفقتها بالفعل. أسطولك جالس على المدرج، بانتظار طيّار. لديك الآن أدوات قمرة القيادة لتطيّره.
المصادر
أسئلة شائعة
عن ماذا يتحدث هذا المقال؟
يتناول هذا المقال موضوع "إدارة وحدات معالجة الرسوم: لماذا أصبحت وحدات معالجة الرسوم الخاملة بمثابة الطائرات المتوقفة عن الطيران" ضمن تصنيف نماذج محلية. في عمليات نشر الذكاء الاصطناعي المحلية، تعكس وحدات معالجة الرسومات الخاملة الطائرات الرابضة على الأرض: فهي تستهلك رأس المال، وتشغل حيزًا، وتفقد قيمتها دون أن تحقق عوائد. تضمن الإدارة الفعالة لوحدات معالجة الرسومات—عبر المحاكاة الافتراضية، وجدولة المهام، وتجميع الأحمال—أن تظل هذه الموارد القوية تحلق عاليًا، مما يزيد من الإنتاجية وكفاءة التكلفة للاستدلال على النماذج المحلية وتدريبها.
لمن يفيد هذا المقال؟
يفيد القراء المهتمين بفهم أدوات وتقنيات الذكاء الاصطناعي بطريقة عملية وواضحة.
ما الخطوة التالية؟
اقرأ المقال كاملاً، راجع المصادر المرفقة، ثم جرّب الأفكار المناسبة لاحتياجك بحذر.



