הגדרת התאמה אוטומטית לעומס (autoscaling) לעומסי עבודה של LLM במעבדי GPU באמצעות Google Kubernetes Engine ‏(GKE)

אתם יכולים להגדיר התאמה אוטומטית לעומס (autoscaling) לעומסי עבודה של מודלים גדולים של שפה (LLM) שפועלים במעבדים גרפיים (GPU) ב-Google Kubernetes Engine ‏(GKE). שינוי גודל אוטומטי משנה את המשאבים באופן אוטומטי כדי להתמודד עם תנודות בביקוש, לשפר את הביצועים ולהפחית את עלויות התפעול. התהליך הזה כולל פריסה של Gemma LLM ושימוש ב-Horizontal Pod Autoscaler ‏ (HPA) של GKE כדי לשנות את גודל הפודים באופן אוטומטי. הפריסה משלבת גם את ממשק יצירת הטקסט של Hugging Face (TGI), שהוא מסגרת להסקת מסקנות יעילה.

מידע נוסף על בחירת מדדים להתאמה אוטומטית לעומס זמין במאמר שיטות מומלצות להתאמה אוטומטית לעומס של עומסי עבודה של מודלים גדולים של שפה (LLM) באמצעות GPU ב-GKE.

לפני שמתחילים

לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

שינוי קנה מידה אוטומטי באמצעות מדדי שרת

אתם יכולים להשתמש במדדי הביצועים הספציפיים לעומס העבודה שמופקים על ידי שרת ההסקה של TGI כדי לכוון את שינוי הגודל האוטומטי של ה-Pods. מידע נוסף על המדדים האלה זמין במאמר מדדי שרתים.

כדי להגדיר שינוי אוטומטי של קנה מידה של מדדים מותאמים אישית באמצעות מדדי שרת:

  1. ייצוא המדדים משרת ה-TGI אל Cloud Monitoring. אתם משתמשים בשירות המנוהל של Google Cloud ל-Prometheus, שמפשט את הפריסה וההגדרה של כלי האיסוף של Prometheus. השירות המנוהל של Google Cloud ל-Prometheus מופעל כברירת מחדל באשכול GKE, אבל אפשר גם להפעיל אותו באופן ידני.

    בקובץ המניפסט שמוצג בדוגמה הבאה מוגדר משאב PodMonitoring שמורה לשירות המנוהל של Google Cloud ל-Prometheus לבצע סקריפט של מדדים מה-Pods במרווחי זמן חוזרים של 15 שניות:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: gemma-pod-monitoring
    spec:
      selector:
        matchLabels:
          app: gemma-server
      endpoints:
      - port: 8000
        interval: 15s
    
  2. מתקינים את Custom Metrics Stackdriver Adapter. המתאם הזה מאפשר לבקר HPA לראות את המדד המותאם אישית שייצאתם ל-Monitoring. פרטים נוספים זמינים במאמר בנושא שינוי אוטומטי של מספר העותקים של פודים במאמרי העזרה של השירות המנוהל של Google Cloud ל-Prometheus.

    בדוגמה הבאה אפשר לראות איך מתקינים את המתאם:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. מגדירים את משאב ה-HPA שמבוסס על מדד מותאם אישית. פריסת משאב HPA שמבוסס על המדד המותאם אישית המועדף. פרטים נוספים זמינים במאמר בנושא שינוי אוטומטי של מספר העותקים של פודים במאמרי העזרה של השירות המנוהל של Google Cloud ל-Prometheus.

    בוחרים באחת מהכרטיסיות הבאות כדי לראות דוגמאות להגדרת המשאב HorizontalPodAutoscaler במניפסט:

    גודל התור

    בדוגמה הזו נעשה שימוש במדדים של שרת tgi_queue_size TGI, שמייצגים את מספר הבקשות בתור.

    כדי לקבוע את ערך הסף הנכון של גודל התור ל-HPA, אפשר לעיין במאמר בנושא שיטות מומלצות להרחבת קנה מידה אוטומטית של עומסי עבודה של הסקת מסקנות של מודלים גדולים של שפה (LLM) באמצעות מעבדי GPU.

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-server
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: Pods
        pods:
          metric:
            name: prometheus.googleapis.com|tgi_queue_size|gauge
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

    גודל האצווה

    בדוגמה הזו נעשה שימוש במדד השרת tgi_batch_size TGI, שמייצג את מספר הבקשות באצווה הנוכחית.

    כדי לקבוע את סף גודל האצווה המתאים ל-HPA, אפשר לעיין במאמר שיטות מומלצות להרחבת קנה מידה אוטומטית של עומסי עבודה של הסקת מסקנות של מודלים גדולים של שפה (LLM) באמצעות GPU.

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-server
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: Pods
        pods:
          metric:
            name: prometheus.googleapis.com|tgi_batch_current_size|gauge
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

שינוי קנה מידה אוטומטי באמצעות מדדי GPU

אתם יכולים להשתמש במדדי השימוש והביצועים שמופקים על ידי ה-GPU כדי להגדיר שינוי גודל אוטומטי של ה-Pods. מידע נוסף על המדדים האלה זמין במאמר מדדי GPU.

כדי להגדיר שינוי אוטומטי של קנה מידה של מדדים בהתאמה אישית באמצעות מדדי GPU, פועלים לפי השלבים הבאים:

  1. ייצוא מדדי ה-GPU ל-Cloud Monitoring אם הפעלתם מדדי מערכת באשכול GKE, המערכת שולחת באופן אוטומטי את מדד השימוש ב-GPU אל Cloud Monitoring דרך מדד המערכת container/accelerator/duty_cycle, כל 60 שניות.

    בקובץ המניפסט הבא לדוגמה אפשר לראות איך מגדירים את הגדרת המשאב PodMonitoring כדי להטמיע מדדים מעומס העבודה של NVIDIA DCGM:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: nvidia-dcgm-exporter-for-hpa
      namespace: gke-managed-system
      labels:
        app.kubernetes.io/name: nvidia-dcgm-exporter
        app.kubernetes.io/part-of: google-cloud-managed-prometheus
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: gke-managed-dcgm-exporter
      endpoints:
        - port: metrics
          interval: 15s
          metricRelabeling:
            - action: keep
              sourceLabels: [__name__]
            - action: replace
              sourceLabels: [__name__]
              targetLabel: __name__
              regex: DCGM_FI_DEV_GPU_UTIL
              replacement: dcgm_fi_dev_gpu_util
    

    בקוד, חשוב לשנות את שם המדד של DCGM שבו רוצים להשתמש ב-HPA לאותיות קטנות. הסיבה לכך היא בעיה מוכרת שבה HPA לא פועל עם שמות מדדים חיצוניים באותיות רישיות. במקרים שבהם האשכולות לא משתמשים בייצוא DCGM מנוהל, צריך לוודא שההגדרות metadata.namespace ו-spec.selector.matchLabels של ה-HPA זהות להגדרות של ייצוא DCGM.ההתאמה המדויקת הזו חיונית כדי שה-HPA יוכל לגלות ולשאול מדדים מותאמים אישית.

  2. מתקינים את Custom Metrics Stackdriver Adapter. המתאם הזה מאפשר לבקר HPA לראות את המדד המותאם אישית שייצאתם ל-Monitoring. פרטים נוספים זמינים במאמר בנושא שינוי אוטומטי של מספר העותקים של פודים במאמרי העזרה של השירות המנוהל של Google Cloud ל-Prometheus.

    בדוגמה הבאה אפשר לראות איך להריץ את ההתקנה באמצעות פקודה:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. מגדירים את משאב ה-HPA שמבוסס על מדד מותאם אישית. פורסים משאב HPA על סמך המדד המותאם אישית המועדף. פרטים נוספים זמינים במאמר בנושא שינוי אוטומטי של מספר העותקים של פודים במאמרי העזרה של השירות המנוהל של Google Cloud ל-Prometheus.

    • מזהים יעד ערך ממוצע ל-HPA כדי להפעיל את ההתאמה האוטומטית של קנה המידה. אפשר לעשות את זה באופן ניסיוני. לדוגמה, אפשר ליצור עומס הולך וגובר על השרת ולבדוק איפה השימוש ב-GPU מגיע לשיא. חשוב לשים לב לסבילות של HPA, שמוגדרת כברירת מחדל לטווח של 0.1 ללא פעולה סביב ערך היעד כדי למתן את התנודות.
    • מומלץ להשתמש בכלי locust-load-inference לבדיקה. אפשר גם ליצור לוח בקרה מותאם אישית ב-Cloud Monitoring כדי להציג את התנהגות המדד.

    בוחרים אחת מהכרטיסיות האלה כדי לראות דוגמה להגדרת המשאב HorizontalPodAutoscaler במניפסט:

    מחזור פעילות (מערכת GKE)

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: External
        external:
          metric:
            name: kubernetes.io|container|accelerator|duty_cycle
            selector:
              matchLabels:
                resource.labels.container_name: inference-server
                resource.labels.namespace_name: default
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

    מחזור פעילות (DCGM)

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: External
        external:
          metric:
            name: prometheus.googleapis.com|dcgm_fi_dev_gpu_util|unknown
            selector:
              matchLabels:
                metric.labels.exported_container: inference-server
                metric.labels.exported_namespace: default
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

המאמרים הבאים