פריסת מודל AI ב-GKE באמצעות NVIDIA NIM

1. מבוא

בשיעור ה-Lab המעשי הזה תלמדו איך לפרוס מודל AI בקונטיינר ולנהל אותו ב-Google Kubernetes Engine‏ (GKE), באמצעות היכולות של מיקרו-שירותי NVIDIA NIM™‎.

המדריך הזה מיועד למפתחים ולמדעני נתונים שרוצים:

  • פריסת מסקנות AI בצורה פשוטה יותר: במאמר הזה מוסבר איך להשתמש ב-NIM מוכן מראש כדי לפרוס מודלים של AI בסביבת ייצור ב-GKE בצורה מהירה ופשוטה יותר.
  • שיפור הביצועים במעבדי GPU של NVIDIA: תוכלו להתנסות בפריסת NIM שמשתמשות ב-NVIDIA TensorRT להסקת מסקנות אופטימלית במעבדי GPU באשכול GKE.
  • התאמה אוטומטית לעומס של עומסי עבודה של הסקת מסקנות מ-AI: במאמר הזה מוסבר איך להתאים אוטומטית לעומס את הפריסה של NIM לפי הביקוש באמצעות Kubernetes לניהול משאבי מחשוב.

2. מה תלמדו

בסוף המדריך הזה תהיה לכם הבנה לגבי:

  1. פריסת NIM ב-GKE: פריסת NVIDIA NIM מוכן מראש למשימות שונות של הסקת מסקנות באשכול GKE.
  2. ניהול פריסות של NIM: אפשר להשתמש בפקודות kubectl כדי לנהל, לעקוב ולשנות את קנה המידה של ה-NIM שנפרס.
  3. התאמה לעומס של עומסי עבודה של הסקת מסקנות: אפשר להשתמש בתכונות של Kubernetes כדי להגדיר התאמה אוטומטית לעומס של פריסות NIM על סמך דרישות התנועה.

3. הסבר על הרכיבים

יחידות GPU ב-Google Kubernetes Engine ‏ (GKE)

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

NVIDIA NIM

NVIDIA NIM הם קבוצה של מיקרו-שירותי הסקה קלים לשימוש, שמיועדים להאצת הפריסה של מודלים בסיסיים בכל ענן או מרכז נתונים, ולעזרה בשמירה על אבטחת הנתונים.

NVIDIA AI Enterprise

NVIDIA AI Enterprise היא פלטפורמת תוכנה מקצה לקצה, מבוססת-ענן, שמאיצה את צינורות עיבוד הנתונים ומייעלת את הפיתוח והפריסה של טייסים אוטומטיים ברמת ייצור ושל אפליקציות אחרות של AI גנרטיבי. זמין דרך GCP Marketplace.

4. דרישות מוקדמות

  • פרויקט: פרויקט ב-Google Cloud שהחיוב בו מופעל.
  • הרשאות: הרשאות מספיקות ליצירת אשכולות GKE ומשאבים קשורים אחרים.
  • Helm: Helm הוא מנהל חבילות ל-Kubernetes.
  • NVIDIA GPU Operator: תוסף ל-Kubernetes שמבצע אוטומטית את הניהול של כל רכיבי התוכנה של NVIDIA שנדרשים להקצאת GPU.
  • מפתח NVIDIA API: לוחצים על הקישור הזה ופועלים לפי ההוראות ליצירת חשבון וליצירת מפתח API. כדי להוריד את מאגר התגים של NIM, צריך מפתח API.
  • מעבדי GPU של NVIDIA: אחד ממעבדי ה-GPU הבאים אמור לפעול (שימו לב, אפשר לבצע את השלבים האלה כדי לבקש הגדלה של המכסה, אם אין לכם מספיק מעבדי GPU)
  • אופציונליGCloud SDK:** אם אתם לא משתמשים ב-Cloud Shell בפורטל GCP, אתם צריכים לוודא ש-Google Cloud SDK מותקן ומוגדר.
  • אופציונליkubectl:** אם אתם לא משתמשים ב-Cloud Shell בפורטל GCP, אתם צריכים לוודא שכלי שורת הפקודה kubectl מותקן ומוגדר.

5. יצירת אשכול GKE עם יחידות GPU

  1. פותחים את Cloud Shell או את הטרמינל.
  2. מציינים את הפרמטרים הבאים:
    export PROJECT_ID=<YOUR PROJECT ID>
    export REGION=<YOUR REGION>
    export ZONE=<YOUR ZONE>
    export CLUSTER_NAME=nim-demo
    export NODE_POOL_MACHINE_TYPE=g2-standard-16
    export CLUSTER_MACHINE_TYPE=e2-standard-4
    export GPU_TYPE=nvidia-l4
    export GPU_COUNT=1
    

שימו לב: יכול להיות שתצטרכו לשנות את הערכים של NODE_POOL_MACHINE_TYPE, ‏ CLUSTER_MACHINE_TYPE ו-GPU_TYPE בהתאם לסוג של מכונת Compute ושל יחידות ה-GPU שבהן אתם משתמשים.

  1. יצירת אשכול GKE:
    gcloud container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID} \
        --location=${ZONE} \
        --release-channel=rapid \
        --machine-type=${CLUSTER_MACHINE_TYPE} \
        --num-nodes=1
    
  2. יצירת מאגר צמתים של GPU:
    gcloud container node-pools create gpupool \
        --accelerator type=${GPU_TYPE},count=${GPU_COUNT},gpu-driver-version=latest \
        --project=${PROJECT_ID} \
        --location=${ZONE} \
        --cluster=${CLUSTER_NAME} \
        --machine-type=${NODE_POOL_MACHINE_TYPE} \
        --num-nodes=1
    

6. הגדרת מפתח NVIDIA NGC API

מפתח ה-API של NGC מאפשר לכם לשלוף תמונות בהתאמה אישית מ-NVIDIA NGC. כדי לציין את המפתח:

export NGC_CLI_API_KEY="<YOUR NGC API KEY>"

זה המפתח שנוצר כחלק מהדרישות המוקדמות.

7. פריסה ובדיקה של NVIDIA NIM

  1. אחזור תרשים Helm של NIM LLM:
    helm fetch https://helm.ngc.nvidia.com/nim/charts/nim-llm-1.3.0.tgz --username='$oauthtoken' --password=$NGC_CLI_API_KEY
    
  2. יוצרים מרחב שמות של NIM:
    kubectl create namespace nim
    
  3. הגדרת סודות:
    kubectl create secret docker-registry registry-secret --docker-server=nvcr.io --docker-username='$oauthtoken'     --docker-password=$NGC_CLI_API_KEY -n nim
    
    kubectl create secret generic ngc-api --from-literal=NGC_API_KEY=$NGC_CLI_API_KEY -n nim
    
  4. הגדרת NIM:
    cat <<EOF > nim_custom_value.yaml
    image:
      repository: "nvcr.io/nim/meta/llama3-8b-instruct" # container location
      tag: 1.0.0 # NIM version you want to deploy
    model:
      ngcAPISecret: ngc-api  # name of a secret in the cluster that includes a key named NGC_CLI_API_KEY and is an NGC API key
    persistence:
      enabled: true
    imagePullSecrets:
      -   name: registry-secret # name of a secret used to pull nvcr.io images, see https://kubernetes.io/docs/tasks/    configure-pod-container/pull-image-private-registry/
    EOF
    
  5. הפעלת פריסת NIM:
    helm install my-nim nim-llm-1.1.2.tgz -f nim_custom_value.yaml --namespace nim
    
    מוודאים שפוד NIM פועל:
    kubectl get pods -n nim
    
  6. בדיקת הפריסה של NIM:
    אחרי שנאמת שהשירות NIM נפרס בהצלחה, נוכל לשלוח בקשות להסקת מסקנות כדי לראות איזה סוג משוב נקבל משירות NIM. כדי לעשות את זה, אנחנו מפעילים העברת יציאות בשירות כדי שנוכל לגשת ל-NIM מהמחשב המקומי שלנו ביציאה 8000:
    kubectl port-forward service/my-nim-nim-llm 8000:8000 -n nim
    
    אחר כך אפשר לפתוח עוד טרמינל או כרטיסייה ב-Cloud Shell ולנסות את הבקשה הבאה:
    curl -X 'POST' \
      'http://localhost:8000/v1/chat/completions' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
      "messages": [
        {
          "content": "You are a polite and respectful chatbot helping people plan a vacation.",
          "role": "system"
        },
        {
          "content": "What should I do for a 4 day vacation in Spain?",
          "role": "user"
        }
      ],
      "model": "meta/llama3-8b-instruct",
      "max_tokens": 128,
      "top_p": 1,
      "n": 1,
      "stream": false,
      "stop": "\n",
      "frequency_penalty": 0.0
    }'
    
    אם קיבלתם השלמה של צ'אט משירות ה-NIM, סימן שהשירות פועל כמצופה.

8. הסרת המשאבים

מחיקת אשכול GKE:

gcloud container clusters delete $CLUSTER_NAME --zone=$ZONE

9. המאמרים הבאים

מידע נוסף זמין במאמרים הבאים: