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

במדריך הזה מוסבר איך לבצע אופטימיזציה של העלויות של עומסי עבודה להפעלת מודלים גדולים של שפה (LLM) ב-GKE. במדריך הזה נעשה שימוש בשילוב של Flex-start VM, VM במודל Spot ו-ComputeClasses כדי להסיק מסקנות בצורה חסכונית.

במדריך הזה נעשה שימוש ב-Mixtral 8x7b כדוגמה למודל LLM שאפשר לפרוס.

המדריך הזה מיועד למהנדסי למידת מכונה (ML), למנהלי פלטפורמות ולמפעילים, ולמומחי נתונים ו-AI שרוצים להשתמש ביכולות של תזמור קונטיינרים של Kubernetes כדי להציג מודלים גדולים של שפה (LLM). מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם בתוכן של Cloud de Confiance by S3NS זמין במאמר תפקידים ומשימות נפוצים של משתמשי GKE.

תמחור Flex-start

מומלץ להשתמש ב-Flex-start אם נפח העבודה שלכם דורש הקצאה דינמית של משאבים לפי הצורך, למשך עד שבעה ימים עם הזמנות לטווח קצר, בלי ניהול מורכב של מכסות ובגישה חסכונית. התכונה 'התחלה גמישה' מבוססת על Dynamic Workload Scheduler והחיוב מתבצע לפי התמחור של Dynamic Workload Scheduler:

  • אפשר לקבל הנחה (עד 53%) על vCPU,‏ GPU,‏ TPU וכל דיסק SSD מקומי שמחובר.
  • תשלום לפי שימוש (PAYG).

רקע

בקטע הזה מפורטות התכונות הזמינות שבהן אפשר להשתמש כדי לקבל משאבי מחשוב, כולל מעבדי GPU או TPU, על סמך הדרישות של עומסי העבודה של AI/ML. התכונות האלה עוזרות לכם ליישם אסטרטגיות למיקסום הגמישות, היעילות והזמינות של קיבולת המחשוב.

‫GPUs

מעבדים גרפיים (GPU) מאפשרים להאיץ עומסי עבודה ספציפיים, כמו למידת מכונה ועיבוד נתונים. ‫GKE מציע צמתים שמצוידים במעבדי GPU עוצמתיים כאלה כדי לשפר את הביצועים של משינות למידה ומשימות עיבוד נתונים. ‫GKE מספק מגוון אפשרויות של סוגי מכונות להגדרת צמתים, כולל סוגי מכונות עם GPU מסוג NVIDIA H100,‏ A100 ו-L4.

מידע נוסף זמין במאמר מידע על מעבדים גרפיים (GPU) ב-GKE.

Flex-start

התחלה גמישה, שמבוססת על Dynamic Workload Scheduler, היא אפשרות לשימוש ב-GPU שבה GKE שומר את בקשת ה-GPU שלכם ומקצה באופן אוטומטי Flex-start VM כשהקיבולת הופכת לזמינה. מומלץ להשתמש ב-flex-start לעומסי עבודה שזקוקים לקיבולת GPU לזמן מוגבל, עד שבעה ימים, ושאין להם תאריך התחלה קבוע. מידע נוסף זמין במאמר בנושא הפעלה גמישה.

‏VMs במודל Spot

אפשר להשתמש ב-GPU עם VM במודל Spot אם עומסי העבודה יכולים לעמוד בהפרעות תכופות בצמתים. שימוש ב-VM במודל Spot או ב-flex-start מפחית את העלות של הפעלת יחידות GPU. שימוש ב-VM במודל Spot בשילוב עם התחלה גמישה מספק אפשרות חלופית כשהקיבולת של ה-VM במודל Spot לא זמינה.

מידע נוסף זמין במאמר שימוש ב-VM במודל Spot עם מאגרי צמתים של GPU.

ComputeClasses

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

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

  • In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Cloud de Confiance project.

גישה למודל

אם עדיין אין לכם, יוצרים טוקן חדש של Hugging Face:

  1. לוחצים על הפרופיל שלך > הגדרות > טוקנים של גישה.
  2. לוחצים על New Token (אסימון חדש).
  3. מציינים שם לבחירתכם ותפקיד של לפחות Read.
  4. לוחצים על יצירת אסימון.

יצירת ComputeClass

בקטע הזה, יוצרים ComputeClass בהתאמה אישית. ‫ComputeClasses מגדירים את הסוגים והקשרים בין כמה משאבי מחשוב שמשמשים את עומס העבודה.

  1. במסוף Cloud de Confiance , לוחצים על Activate Cloud Shell בCloud de Confiance מסוף כדי להפעיל סשן של Cloud Shell. סמל ההפעלה של Cloud Shell סשן ייפתח בחלונית התחתונה של המסוף Cloud de Confiance .
  2. יוצרים קובץ מניפסט dws-flex-start.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: dws-model-inference-class
    spec:
      priorities:
        - machineType: g2-standard-24
          spot: true
        - machineType: g2-standard-24
          flexStart:
            enabled: true
            nodeRecycling:
              leadTimeSeconds: 3600
      nodePoolAutoCreation:
        enabled: true
    
  3. החלת מניפסט dws-flex-start.yaml:

    kubectl apply -f dws-flex-start.yaml
    

‫GKE פורס מכונות g2-standard-24 עם מאיצי L4. ‫GKE משתמש ב-ComputeClasses כדי לתת עדיפות ל-VM במודל Spot, ואחר כך ל-Flex-start VM.

פריסת עומס העבודה של ה-LLM

  1. יוצרים סוד של Kubernetes שמכיל את הטוקן של Hugging Face באמצעות הפקודה הבאה:

    kubectl create secret generic model-inference-secret \
        --from-literal=HUGGING_FACE_TOKEN=HUGGING_FACE_TOKEN \
        --dry-run=client -o yaml | kubectl apply -f -
    

    מחליפים את HUGGING_FACE_TOKEN באסימון הגישה שלכם ל-Hugging Face.

  2. יוצרים קובץ בשם mixtral-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: inference-mixtral-ccc
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          nodeSelector:
            cloud.google.com/compute-class: dws-model-inference-class
          containers:
          - name: llm
            image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311
            resources:
              requests:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
              limits:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
            env:
            - name: MODEL_ID
              value: mistralai/Mixtral-8x7B-Instruct-v0.1
            - name: NUM_SHARD
              value: "2"
            - name: PORT
              value: "8080"
            - name: QUANTIZE
              value: bitsandbytes-nf4
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: model-inference-secret
                  key: HUGGING_FACE_TOKEN
            volumeMounts:
              - mountPath: /dev/shm
                name: dshm
              - mountPath: /tmp
                name: ephemeral-volume
          volumes:
            - name: dshm
              emptyDir:
                  medium: Memory
            - name: ephemeral-volume
              ephemeral:
                volumeClaimTemplate:
                  metadata:
                    labels:
                      type: ephemeral
                  spec:
                    accessModes: ["ReadWriteOnce"]
                    storageClassName: "premium-rwo"
                    resources:
                      requests:
                        storage: 100Gi
    

    במניפסט הזה, השדה mountPath מוגדר ל-/tmp, כי זה הנתיב שמשתנה הסביבה HF_HOME ב-Deep Learning Container ‏ (DLC) להסקת מסקנות לגבי יצירת טקסט (TGI) מוגדר אליו, במקום הנתיב /data שמוגדר כברירת מחדל בתוך קובץ האימג' של TGI. המודל שהורדתם יישמר בספרייה הזו.

  3. פורסים את המודל:

    kubectl apply -f  mixtral-deployment.yaml
    

    מערכת GKE מתזמנת פריסה של Pod חדש, מה שמפעיל את המידרוג האוטומטי של מאגר הצמתים כדי להוסיף צומת שני לפני פריסת הרפליקה השנייה של המודל.

  4. מאמתים את הסטטוס של המודל:

    watch kubectl get deploy inference-mixtral-ccc
    

    אם פריסת המודל הושלמה בהצלחה, הפלט ייראה כך:

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    inference-mixtral-ccc  1/1     1            1           10m
    

    כדי לצאת מהשעון, לוחצים על CTRL + C.

  5. מחכים שהקונטיינר יוריד את המודל ויתחיל להפעיל אותו:

    watch "kubectl logs $(kubectl get pods -l app=llm -o custom-columns=:metadata.name --no-headers) | tail"
    

    כדי לצאת מהשעון, לוחצים על CTRL + C.

  6. מציגים את מאגרי הצמתים ש-GKE הקצה:

    kubectl get nodes -L cloud.google.com/gke-nodepool
    

    הפלט אמור להיראות כך:

      NAME                                                  STATUS   ROLES    AGE   VERSION               GKE-NODEPOOL
      gke-flex-na-nap-g2-standard--0723b782-fg7v   Ready    <none>   10m   v1.32.3-gke.1152000   nap-g2-standard-24-spot-gpu2-1gbdlbxz
      gke-flex-nap-zo-default-pool-09f6fe53-fzm8   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-lv2v   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-pq6m   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
    

    השם של מאגר הצמתים שנוצר מציין את סוג המכונה. במקרה הזה, GKE הקצה מכונות וירטואליות במודל Spot.

  7. חושפים את המודל:

    kubectl expose deployment/inference-mixtral-ccc --port 8080 --name=llm-service
    

אינטראקציה עם המודל באמצעות curl

בקטע הזה מוסבר איך לבצע בדיקת הסקה בסיסית כדי לוודא שהמודל שנפרס פועל.

  1. מגדירים העברה ליציאה אחרת למודל:

    kubectl port-forward service/llm-service 8080:8080
    

    הפלט אמור להיראות כך:

    Forwarding from 127.0.0.1:8080 -> 8080
    
  2. בסשן חדש בטרמינל, משוחחים עם המודל באמצעות curl:

    curl http://localhost:8080/v1/completions \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{
        "model": "mixtral-8x7b-instruct-gptq",
        "prompt": "<s>[INST]Who was the first president of the United States?[/INST]",
        "max_tokens": 40}'
    

    הפלט אמור להיראות כך:

    George Washington was a Founding Father and the first president of the United States, serving from 1789 to 1797.
    

הסרת המשאבים

כדי להימנע מצבירת חיובים בחשבון Cloud de Confiance by S3NS על המשאבים שבהם השתמשתם בדף הזה, אתם יכולים למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים.

מחיקת הפרויקט

  1. במסוף Cloud de Confiance , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת המשאב הספציפי

  1. מוחקים את משאבי Kubernetes שנוצרו בעזרת המדריך הזה:

    kubectl delete deployment inference-mixtral-ccc
    kubectl delete service llm-service
    kubectl delete computeclass dws-model-inference-class
    kubectl delete secret model-inference-secret
    
  2. מחיקת האשכול:

    gcloud container clusters delete CLUSTER_NAME
    

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