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

1. מבוא

בשיעור Codelab הזה נסביר איך לפרוס ולנהל מודל 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 היא פלטפורמת תוכנה מקצה לקצה, מבוססת-ענן, שמאיצה את תהליכי העבודה של מדע הנתונים ומייעלת את הפיתוח והפריסה של טייסים אוטומטיים ברמת ייצור ושל אפליקציות אחרות של בינה מלאכותית גנרטיבית. זמין דרך 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. המאמרים הבאים

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