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

במדריך הזה מוסבר איך לבצע אופטימיזציה של העלויות של עומסי עבודה להפעלת מודלים גדולים של שפה (LLM) ב-GKE. במדריך הזה נעשה שימוש בשילוב של מכונות וירטואליות עם הפעלה גמישה, מכונות וירטואליות זמניות ו-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.
  • אתם משלמים לפי השימוש.

רקע

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

יחידות GPU

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

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

Flex-start

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

מכונות וירטואליות של Spot

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

מידע נוסף זמין במאמר בנושא שימוש במכונות וירטואליות מסוג 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 מסוף, מפעילים סשן של Cloud Shell על ידי לחיצה על Activate Cloud Shell בCloud de Confiance מסוף.סמל ההפעלה של 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 כדי לתת עדיפות למכונות וירטואליות מסוג Spot, ואחר כך למכונות וירטואליות מסוג Flex-start.

פריסת עומס העבודה של ה-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) עבור Text Generation Inference ‏ (TGI), במקום הנתיב /data שמוגדר כברירת מחדל בתמונה של TGI. המודל שהורדתם יישמר בספרייה הזו.

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

    kubectl apply -f  mixtral-deployment.yaml
    

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

  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
    

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