العودة إلى الرئيسية

تقسيم زمن وحدة معالجة الرسومات لوكلاء نماذج اللغة الكبيرة المتزامنة على كوبرنيتيز

تعلم كيف يتيح تقطيع وقت وحدة معالجة الرسومات (GPU) تشغيل وكلاء نماذج اللغة الكبيرة (LLM) بشكل متزامن على Kubernetes، مما يعزز استغلال وحدة المعالجة الرسومية ويقلل التكاليف. يغطي هذا المقال التكوين، والأمثلة العملية، وأفضل الممارسات.

القراءة الصوتية غير متاحة في هذا المتصفح
تقسيم زمن وحدة معالجة الرسومات لوكلاء نماذج اللغة الكبيرة المتزامنة على كوبرنيتيز

الوسوم

ملخص سريع

تعلم كيف يتيح تقطيع وقت وحدة معالجة الرسومات (GPU) تشغيل وكلاء نماذج اللغة الكبيرة (LLM) بشكل متزامن على Kubernetes، مما يعزز استغلال وحدة المعالجة الرسومية ويقلل التكاليف. يغطي هذا المقال التكوين، والأمثلة العملية، وأفضل الممارسات.

تقطيع الوقت لوحدة معالجة الرسوميات (GPU Time-Slicing) لوكلاء LLM المتزامنين على Kubernetes

تعمل وكلاء نماذج اللغة الكبيرة (LLM) على تحويل طريقة أتمتة المؤسسات للاستدلال والاسترجاع واتخاذ القرارات. ومع ذلك، فإن تشغيل عدة وكلاء LLM بشكل متزامن على Kubernetes يمثل تحديًا أساسيًا: وحدات معالجة الرسوميات (GPUs) باهظة الثمن ونادرة، ويتم تخصيصها تقليديًا كحاوية واحدة لكل GPU. يحل تقطيع الوقت (Time-Slicing) هذه المشكلة من خلال السماح لأعباء العمل المتعددة بمشاركة GPU واحدة، مما يحسن الاستخدام بشكل كبير ويقلل التكلفة. تقدم هذه المقالة دليلاً عمليًا خطوة بخطوة لتكوين تقطيع الوقت لوحدة معالجة الرسوميات على Kubernetes لنشر وكلاء LLM المتزامنين.

ما هو تقطيع الوقت لوحدة معالجة الرسوميات؟

تقطيع الوقت هو آلية أصلية في Kubernetes تقسم GPU مادية واحدة إلى أجهزة افتراضية متعددة. يتم تقديم كل جهاز افتراضي للحاوية (Pod) كما لو كان GPU مخصصًا، لكن الأجهزة الأساسية تعالج أعباء العمل في شرائح زمنية سريعة بنظام round-robin. يختلف هذا الأسلوب عن تقسيم GPU (MIG) الذي يعزل الذاكرة والحوسبة فعليًا. يشارك تقطيع الوقت موارد الذاكرة والحوسبة ولكنه يضيف حملًا زائدًا ضئيلًا لأعباء عمل الاستدلال، مما يجعله مثاليًا لوكلاء LLM الذين يقضون معظم الوقت في انتظار مكالمات الشبكة أو توليد الرموز.

المقايضة الرئيسية هي الأداء القابل للتنبؤ: إذا حاولت حاويتان من الوكلاء إشباع GPU في وقت واحد، فستعاني كل منهما من انخفاض الإنتاجية. ومع ذلك، بالنسبة لوكلاء LLM التفاعليين ذوي أنماط الاستدلال المتقطعة، غالبًا ما يحقق تقطيع الوقت زمن استجابة قريبًا من الأصلي مع مضاعفة عدد الوكلاء المتزامنين لكل GPU أو أكثر.

المتطلبات

قبل تنفيذ تقطيع الوقت لوحدة معالجة الرسوميات، تأكد من أن بيئتك تستوفي هذه المتطلبات الأساسية:

  • **مجموعة Kubernetes** الإصدار 1.24 أو أحدث (تم الاختبار مع 1.27+)
  • **مشغل GPU من NVIDIA** مثبت (الإصدار 23.6.0 أو أحدث موصى به)
  • **برامج تشغيل NVIDIA** الإصدار 525 أو أحدث (تدعم تقطيع الوقت)
  • **أجهزة GPU**: أي GPU من NVIDIA بقدرة حوسبة 7.0+ (Volta، Turing، Ampere، Hopper)
  • **إطار عمل وكيل LLM**: أي وكيل محوسب (مثل LangChain، LlamaIndex، خدمة Python مخصصة) يستدعي LLM عبر API أو نموذج محلي
  • **Helm** (لتثبيت مشغل GPU)
  • **kubectl** مهيأ بحقوق مسؤول المجموعة

> **ملاحظة**: يعمل تقطيع الوقت بشكل أفضل لأعباء عمل الاستدلال. للتدريب، استخدم MIG أو GPUs مخصصة.

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

1. تثبيت مشغل GPU من NVIDIA

يدير مشغل GPU برامج تشغيل GPU والمكونات الإضافية للأجهزة والمراقبة. قم بتثبيته عبر Helm:

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm install gpu-operator nvidia/gpu-operator --namespace nvidia-gpu-operator --create-namespace

يضيف هذا الأمر مستودع Helm من NVIDIA، ويحدث ذاكرة التخزين المؤقت المحلية، ويقوم بتثبيت المشغل في مساحة أسماء مخصصة. انتظر حتى تصبح جميع الحاويات جاهزة:

kubectl wait --for=condition=ready pod --all -n nvidia-gpu-operator --timeout=300s

2. التحقق من اكتشاف GPU

تأكد من أن المجموعة ترى عقد GPU الخاصة بك:

kubectl get nodes -o json | jq '.items[].status.allocatable | with_entries(select(.key | startswith("nvidia.com/gpu")))'

يجب أن ترى مخرجات مثل `"nvidia.com/gpu": "1"` لكل عقدة GPU.

3. إنشاء ConfigMap لتقطيع الوقت

يستخدم المكون الإضافي للأجهزة من NVIDIA ConfigMap لتحديد ملفات تعريف تقطيع الوقت. أنشئ ملفًا باسم `time-slicing-config.yaml`:

apiVersion: v1
kind: ConfigMap
metadata:
  name: time-slicing-config
  namespace: nvidia-gpu-operator
data:
  default: |-
    version: v1
    sharing:
      timeSlicing:
        resources:
        - name: nvidia.com/gpu
          replicas: 4

يعلن هذا التكوين أن كل GPU مادي يجب أن يظهر كـ 4 GPUs افتراضية. اضبط `replicas` بناءً على عبء العمل الخاص بك (4–8 شائع لوكلاء LLM).

طبق ConfigMap:

kubectl apply -f time-slicing-config.yaml

4. تكوين ClusterPolicy لتقطيع الوقت

يتحكم مورد ClusterPolicy الخاص بمشغل GPU في إعدادات المكون الإضافي للأجهزة. قم بتصحيحه لتمكين تقطيع الوقت:

kubectl patch clusterpolicy gpu-cluster-policy -n nvidia-gpu-operator --type='json' -p='[{"op": "replace", "path": "/spec/devicePlugin/config", "value": {"name": "time-slicing-config", "default": "default"}}]'

يخبر هذا المكون الإضافي للأجهزة باستخدام ConfigMap التي أنشأناها. إذا كان ClusterPolicy الخاص بك له اسم مختلف (تحقق باستخدام `kubectl get clusterpolicy -n nvidia-gpu-operator`)، فاضبط وفقًا لذلك.

5. إعادة تشغيل DaemonSet للمكون الإضافي للأجهزة

أجبر المكون الإضافي للأجهزة على إعادة تحميل تكوينه:

kubectl rollout restart daemonset nvidia-device-plugin-daemonset -n nvidia-gpu-operator

انتظر حتى اكتمال إعادة التشغيل:

kubectl rollout status daemonset nvidia-device-plugin-daemonset -n nvidia-gpu-operator

6. التحقق من GPUs الافتراضية

الآن يجب أن تبلغ كل عقدة GPU عن موارد `nvidia.com/gpu` متعددة:

kubectl get nodes -o json | jq '.items[].status.allocatable | with_entries(select(.key | startswith("nvidia.com/gpu")))'

المخرجات المتوقعة: `"nvidia.com/gpu": "4"` (أو أي عدد من النسخ قمت بتعيينه).

أمثلة على الاستخدام

مثال 1: نشر حاويتين متزامنتين لوكيل LLM

أنشئ نشرًا يطلب GPU افتراضيًا واحدًا لكل حاوية:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: llm-agent
spec:
  replicas: 2
  selector:
    matchLabels:
      app: llm-agent
  template:
    metadata:
      labels:
        app: llm-agent
    spec:
      containers:
      - name: agent
        image: your-llm-agent:latest
        resources:
          limits:
            nvidia.com/gpu: 1
        env:
        - name: NVIDIA_VISIBLE_DEVICES
          value: "all"

طبق النشر:

kubectl apply -f llm-agent-deployment.yaml

سيتم تشغيل كلتا الحاويتين على نفس عقدة GPU، وستتلقى كل منهما GPU افتراضيًا واحدًا. تحقق من مشاركتهما للـ GPU:

kubectl get pods -o wide | grep llm-agent
kubectl exec <pod-name> -- nvidia-smi

ترى كل حاوية GPU كاملاً في `nvidia-smi`، لكن برنامج التشغيل يضمن تقطيع الوقت العادل.

مثال 2: مراقبة استخدام GPU باستخدام Prometheus

قم بتثبيت مصدر DCGM من NVIDIA للحصول على مقاييس في الوقت الفعلي:

helm install dcgm-exporter nvidia/dcgm-exporter --namespace nvidia-gpu-operator

قم بتوجيه منفذ المقاييس:

kubectl port-forward -n nvidia-gpu-operator service/dcgm-exporter 9400:9400 &

استعلم عن استخدام GPU:

curl http://localhost:9400/metrics | grep -E "DCGM_FI_DEV_GPU_UTIL|DCGM_FI_DEV_MEM_COPY_UTIL"

سترى قيم الاستخدام للـ GPU المادي، مشتركة عبر جميع الحاويات المقسمة بالوقت.

مثال 3: وكيل LLM بلغة Python يستخدم GPU

قد يبدو وكيل LangChain بسيط يستدعي LLM محلي (مثل Llama 2 عبر Ollama) كالتالي:

import os
from langchain.llms import Ollama
from langchain.agents import initialize_agent, Tool
from langchain.tools import tool

@tool
def get_current_time() -> str:
    """Returns the current time."""
    from datetime import datetime
    return datetime.now().isoformat()

llm = Ollama(model="llama2", temperature=0.1)
tools = [get_current_time]
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

result = agent.run("What time is it?")
print(result)

قم بحوسبة هذا البرنامج النصي وانشره على Kubernetes مع `nvidia.com/gpu: 1` في حدود الموارد. يضمن تكوين تقطيع الوقت إمكانية تعايش عدة وكلاء من هذا القبيل على GPU واحدة.

الضبط وأفضل الممارسات

ضبط عدد النسخ بناءً على عبء العمل

لوكلاء LLM ذوي معدلات الطلب المنخفضة (مثل 1–5 استعلامات في الدقيقة لكل وكيل)، فإن 8 نسخ لكل GPU آمنة. للوكلاء عالية التردد، ابدأ بـ 4 وراقب استخدام GPU:

kubectl exec -n nvidia-gpu-operator daemonset/nvidia-device-plugin-daemonset -- nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv

إذا تجاوز الاستخدام 90%، قلل عدد النسخ.

الدمج مع Horizontal Pod Autoscaler

يتناسب تقطيع الوقت بشكل جيد مع HPA بناءً على مقاييس مخصصة. على سبيل المثال، قم بتوسيع نطاق الوكلاء بناءً على متوسط استخدام GPU:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: llm-agent-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: llm-agent
  minReplicas: 1
  maxReplicas: 8
  metrics:
  - type: Pods
    pods:
      metric:
        name: gpu_utilization
      target:
        type: AverageValue
        averageValue: 50

التعامل مع تنازع الذاكرة

يشارك تقطيع الوقت ذاكرة GPU. إذا كان نموذج LLM الخاص بك يتطلب 8 جيجابايت، فتأكد من أن إجمالي الذاكرة عبر جميع الوكلاء المتزامنين لا يتجاوز الذاكرة المتاحة. استخدم `nvidia-smi` للتحقق من استخدام الذاكرة وحدد `replicas` وفقًا لذلك.

الخلاصة

يتيح تقطيع الوقت لوحدة معالجة الرسوميات لمجموعات Kubernetes تشغيل عدة وكلاء LLM بشكل متزامن على GPU واحدة، مما يزيد من استخدام الأجهزة ويقلل تكاليف البنية التحتية. باتباع الخطوات في هذا الدليل - تثبيت مشغل GPU من NVIDIA، وإنشاء ConfigMap لتقطيع الوقت، وتكوين المكون الإضافي للأجهزة - يمكنك تحويل GPU واحدة إلى مورد مشترك لـ 4–8 أعباء عمل استدلال متزامنة. هذا النهج قيم بشكل خاص للأنظمة الإنتاجية التي تخدم العديد من وكلاء LLM التفاعليين، حيث تجعل أنماط حركة المرور المتقطعة تقطيع الوقت حلاً فعالاً وعملياً. كما لوحظ في المناقشات الصناعية الأخيرة من مصادر مثل OpenAI وMicrosoft، فإن المشاركة الفعالة لـ GPU هي عامل تمكين رئيسي لنشر AI قابل للتوسع. ابدأ بـ 4 نسخ لكل GPU، وراقب الاستخدام، واضبط لتتناسب مع احتياجات التزامن لوكيلك. وكلاء LLM الخاصون بك - وميزانيتك - سيشكرونك.

المصادر

أسئلة شائعة

عن ماذا يتحدث هذا المقال؟

يتناول هذا المقال موضوع "تقسيم زمن وحدة معالجة الرسومات لوكلاء نماذج اللغة الكبيرة المتزامنة على كوبرنيتيز" ضمن تصنيف وكلاء الذكاء الاصطناعي. تعلم كيف يتيح تقطيع وقت وحدة معالجة الرسومات (GPU) تشغيل وكلاء نماذج اللغة الكبيرة (LLM) بشكل متزامن على Kubernetes، مما يعزز استغلال وحدة المعالجة الرسومية ويقلل التكاليف. يغطي هذا المقال التكوين، والأمثلة العملية، وأفضل الممارسات.

لمن يفيد هذا المقال؟

يفيد القراء المهتمين بفهم أدوات وتقنيات الذكاء الاصطناعي بطريقة عملية وواضحة.

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

اقرأ المقال كاملاً، راجع المصادر المرفقة، ثم جرّب الأفكار المناسبة لاحتياجك بحذر.