פריסת מודל 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. המאמרים הבאים

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