במדריך הזה נסביר איך לפרוס מודל שפה גדול (LLM) ולהכניס לשימוש בסביבת הייצור באמצעות GPUs ב-Google Kubernetes Engine (GKE) עם NVIDIA Triton Inference Server ו-TensorFlow Serving. המדריך הזה מספק בסיס להבנה ולבדיקה של פריסת LLM מעשית להיקש בסביבת Kubernetes מנוהלת. אתם פורסים קונטיינר מוכן מראש באשכול GKE עם GPU אחד מסוג L4 Tensor Core ומכינים את תשתית GKE לביצוע היקש אונליין.
המדריך הזה מיועד למהנדסי למידת מכונה (ML), לאדמינים ולמפעילים של פלטפורמות ולמומחים בתחום הנתונים וה-AI שרוצים לארח מודל מאומן מראש של למידת מכונה (ML) באשכול GKE. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שמוזכרים ב Google Cloud<0x00> תוכן זמין במאמר תפקידים נפוצים של משתמשים ב-GKE ומשימות.
לפני שקוראים את הדף הזה, חשוב לוודא שמכירים את הנושאים הבאים:
מטרות
- יוצרים אשכול GKE Autopilot או אשכול רגיל.
- מגדירים קטגוריה של Cloud Storage שבה נמצא המודל שאומן מראש.
- פורסים את מסגרת ההסקה אונליין שבחרתם.
- שולחים בקשת בדיקה לשירות שנפרס.
עלויות
במדריך הזה השתמשנו ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:- GKE
- Cloud Storage
- מאיצי GPU L4
- תעבורת נתונים יוצאת
השתמשו במחשבון עלויות כדי ליצור הערכת עלות על סמך השימוש החזוי.
כדי להימנע מחיובים נוספים אחרי שסיימתם את המדריך, תוכלו למחוק את המשאבים שיצרתם. מידע נוסף זמין במאמר בנושא הסרת המשאבים.
לפני שמתחילים
הגדרת הפרויקט
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
הגדרת ברירות מחדל ל-Google Cloud CLI
במסוף Google Cloud , מפעילים מכונת Cloud Shell:
פתיחת Cloud Shellמורידים את קוד המקור של האפליקציה לדוגמה:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpuמגדירים את משתני הסביבה שמוגדרים כברירת מחדל:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGIONמחליפים את הערכים הבאים:
- PROJECT_ID: Google Cloud מזהה הפרויקט.
- COMPUTE_REGION: האזור ב-Compute Engine שתומך בסוג המאיץ שרוצים להשתמש בו, לדוגמה,
us-central1בשביל GPU מסוג L4.
ב-Cloud Shell, יוצרים את משתני הסביבה הבאים:
export PROJECT_ID=$(gcloud config get project) export REGION=$(gcloud config get compute/region) export K8S_SA_NAME=gpu-k8s-sa export GSBUCKET=$PROJECT_ID-gke-bucket export MODEL_NAME=mnist export CLUSTER_NAME=online-serving-cluster
יצירת אשכול GKE
אפשר להפעיל מודלים ב-GPU יחיד באשכול GKE Autopilot או באשכול רגיל. מומלץ להשתמש באשכול Autopilot כדי ליהנות מחוויית Kubernetes מנוהלת באופן מלא. ב-GKE Autopilot, המשאבים מותאמים אוטומטית לפי בקשות המודל.
כדי לבחור את מצב הפעולה של GKE שהכי מתאים לעומסי העבודה שלכם, אפשר לעיין במאמר בחירת מצב פעולה של GKE.
טייס אוטומטי
מריצים את הפקודה הבאה כדי ליצור אשכול GKE Autopilot:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--location=${REGION} \
--project=${PROJECT_ID} \
--release-channel=rapid
GKE יוצר אשכול Autopilot עם צמתים של מעבד ו-GPU לפי הבקשה של עומסי העבודה שנפרסו.
רגילה
מריצים את הפקודה הבאה כדי ליצור אשכול GKE Standard:
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --addons GcsFuseCsiDriver \ --release-channel=rapid \ --num-nodes=1יצירת האשכול עשויה להימשך כמה דקות.
מריצים את הפקודה הבאה כדי ליצור את מאגר הצמתים:
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-8 \ --num-nodes=1GKE יוצר מאגר צמתים יחיד שמכיל GPU אחד מסוג L4 לכל צומת.
יצירת קטגוריה של Cloud Storage
יוצרים קטגוריה של Cloud Storage לאחסון המודל שעבר אימון מראש ויוצג.
ב-Cloud Shell, מריצים את הפקודה הבאה:
gcloud storage buckets create gs://$GSBUCKET
הגדרת גישה לדלי באמצעות איחוד זהויות של עומסי עבודה ל-GKE
כדי לאפשר ל-cluster לגשת לקטגוריה של Cloud Storage, מבצעים את הפעולות הבאות:
- יוצרים Google Cloud חשבון שירות.
- יוצרים ServiceAccount של Kubernetes באשכול.
- מקשרים את חשבון השירות של Kubernetes לחשבון השירות Google Cloud .
יצירה של Google Cloud חשבון שירות
במסוף Google Cloud , נכנסים לדף יצירת חשבון שירות:
בשדה מזהה חשבון שירות, מזינים
gke-ai-sa.לוחצים על Create and continue.
ברשימה Role בוחרים בתפקיד Cloud Storage > Storage Insights Collector Service.
לוחצים על הוספת תפקיד נוסף.
ברשימה Select a role, בוחרים בתפקיד Cloud Storage > Storage Object Admin.
לוחצים על המשך ואז על סיום.
יצירת חשבון שירות של Kubernetes באשכול
ב-Cloud Shell, מבצעים את הפעולות הבאות:
יוצרים מרחב שמות של Kubernetes:
kubectl create namespace gke-ai-namespaceיוצרים חשבון שירות של Kubernetes במרחב השמות:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
קישור חשבון השירות של Kubernetes לחשבון השירות Google Cloud
ב-Cloud Shell, מריצים את הפקודות הבאות:
מוסיפים קישור IAM ל Google Cloud חשבון השירות:
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"הדגל
--memberמספק את הזהות המלאה של חשבון השירות ב-Kubernetes ב- Google Cloud.הוספת הערה ל-ServiceAccount ב-Kubernetes:
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
פריסת שרת ההיקשים אונליין
כל מסגרת היסק אונליין מצפה למצוא את מודל ה-ML שעבר אימון מראש בפורמט ספציפי. בקטע הבא מוסבר איך לפרוס את שרת ההסקה בהתאם למסגרת שבה רוצים להשתמש:
Triton
ב-Cloud Shell, מעתיקים את המודל של למידת המכונה שאומן מראש לקטגוריה של Cloud Storage:
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursiveפורסים את המסגרת באמצעות פריסה. פריסה היא אובייקט Kubernetes API שמאפשר להפעיל כמה רפליקות של Pods שמפוזרות בין הצמתים באשכול:
envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -מוודאים ש-GKE פרס את המסגרת:
kubectl get deployments --namespace=gke-ai-namespaceכשהמסגרת מוכנה, הפלט אמור להיראות כך:
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29sפורסים את השירותים כדי לגשת לפריסה:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yamlבודקים שכתובת ה-IP החיצונית הוקצתה:
kubectl get services --namespace=gke-ai-namespaceהפלט אמור להיראות כך:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m triton-server LoadBalancer 34.118.227.176 35.239.54.228 8000:30866/TCP,8001:31035/TCP,8002:30516/TCP 5m14sשימו לב לכתובת ה-IP של
triton-serverבעמודה EXTERNAL-IP.בודקים שהשירות והפריסה פועלים בצורה תקינה:
curl -v EXTERNAL_IP:8000/v2/health/readyהפלט אמור להיראות כך:
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...
TF Serving
ב-Cloud Shell, מעתיקים את המודל של למידת המכונה שאומן מראש לקטגוריה של Cloud Storage:
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursiveפורסים את המסגרת באמצעות פריסה. פריסה היא אובייקט Kubernetes API שמאפשר להפעיל כמה רפליקות של Pods שמפוזרות בין הצמתים באשכול:
envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -מוודאים ש-GKE פרס את המסגרת:
kubectl get deployments --namespace=gke-ai-namespaceכשהמסגרת מוכנה, הפלט אמור להיראות כך:
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29sפורסים את השירותים כדי לגשת לפריסה:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yamlבודקים שכתובת ה-IP החיצונית הוקצתה:
kubectl get services --namespace=gke-ai-namespaceהפלט אמור להיראות כך:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m tfserve-server LoadBalancer 34.118.227.176 35.239.54.228 8500:30003/TCP,8000:32194/TCP 5m14sשימו לב לכתובת ה-IP של
tfserve-serverבעמודה EXTERNAL-IP.בודקים שהשירות והפריסה פועלים בצורה תקינה:
curl -v EXTERNAL_IP:8000/v1/models/mnistמחליפים את
EXTERNAL_IPבכתובת ה-IP החיצונית.הפלט אמור להיראות כך:
... < HTTP/1.1 200 OK < Content-Type: application/json < Date: Thu, 12 Oct 2023 19:01:19 GMT < Content-Length: 154 < { "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }
פרסום המודל
Triton
יוצרים סביבה וירטואלית של Python ב-Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activateמתקינים את חבילות Python הנדרשות.
pip install -r src/client/triton-requirements.txtכדי לבדוק את שרת ההסקה של Triton על ידי טעינת תמונה:
cd src/client python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.pngמחליפים את מה שכתוב בשדות הבאים:
EXTERNAL_IP: כתובת ה-IP החיצונית שלכם.-
TEST_IMAGE: השם של הקובץ שתואם לתמונה שרוצים לבדוק. אפשר להשתמש בתמונות שמאוחסנות ב-src/client/images.
בהתאם לתמונה שבה משתמשים, הפלט אמור להיראות כך:
Calling Triton HTTP Service -> Prediction result: 7
TF Serving
יוצרים סביבה וירטואלית של Python ב-Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activateמתקינים את חבילות Python הנדרשות.
pip install -r src/client/tfserve-requirements.txtבודקים את TensorFlow Serving עם כמה תמונות.
cd src/client python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
מחליפים את מה שכתוב בשדות הבאים:
EXTERNAL_IP: כתובת ה-IP החיצונית שלכם.-
TEST_IMAGE: ערך מ-0עד9. אפשר להשתמש בתמונות שמאוחסנות ב-src/client/images.
בהתאם לתמונה שבה משתמשים, הפלט ייראה בערך כך:
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
מעקב אחר ביצועי המודל
Triton
כדי לעקוב אחרי ביצועי המודל, אפשר להשתמש בשילוב של לוח הבקרה של Triton ב-Cloud Monitoring. לוח הבקרה הזה מאפשר לכם לראות מדדי ביצועים קריטיים כמו קצב העברת נתונים של טוקנים, זמן האחזור של הבקשות ושיעורי השגיאות.
כדי להשתמש בלוח הבקרה של Triton, צריך להפעיל את השירות המנוהל של Google Cloud ל-Prometheus, שאוסף את המדדים מ-Triton, באשכול GKE. כברירת מחדל, Triton חושף מדדים בפורמט Prometheus, כך שלא צריך להתקין כלי נוסף לייצוא נתונים.
לאחר מכן תוכלו לראות את המדדים באמצעות לוח הבקרה של Triton. מידע על שימוש בשירות המנוהל של Google Cloud ל-Prometheus כדי לאסוף מדדים מהמודל זמין במאמר בנושא Triton בתיעוד של Cloud Monitoring.TF Serving
כדי לבדוק את ביצועי המודל, אפשר להשתמש בשילוב של לוח הבקרה של TF Serving ב-Cloud Monitoring. לוח הבקרה הזה מאפשר לכם לראות מדדי ביצועים קריטיים כמו קצב העברת נתונים של טוקנים, זמן האחזור של הבקשות ושיעורי השגיאות.
כדי להשתמש בלוח הבקרה של TF Serving, צריך להפעיל את השירות המנוהל של Google Cloud ל-Prometheus, שאוסף את המדדים מ-TF Serving, באשכול GKE.
אחר כך תוכלו לראות את המדדים באמצעות לוח הבקרה של TF Serving. מידע על שימוש בשירות מנוהל של Google Cloud ל-Prometheus כדי לאסוף מדדים מהמודל זמין בהנחיות בנושא יכולת צפייה (observability) ב-TF Serving במסמכי Cloud Monitoring.הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שיצרתם במדריך הזה, אפשר לבצע אחת מהפעולות הבאות:
- אם רוצים לשמור את אשכול GKE: מוחקים את משאבי Kubernetes באשכול ואת משאבי Google Cloud
- שמירת הפרויקט: מחיקת אשכול GKE והמשאבים Google Cloud Google Cloud
- מחיקת הפרויקט
מחיקת משאבי Kubernetes באשכול ובמשאבים Google Cloud
- מוחקים את מרחב השמות של Kubernetes ואת עומסי העבודה שפרסתם:
Triton
kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace
TF Serving
kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace
מוחקים את הקטגוריה של Cloud Storage:
נכנסים לדף Buckets:
מסמנים את התיבה
PROJECT_ID-gke-bucket.לוחצים על מחיקה.
כדי לאשר את המחיקה, מקלידים
DELETEולוחצים על מחיקה.
מוחקים את Google Cloud חשבון השירות:
עוברים לדף Service accounts:
בוחרים את הפרויקט הרצוי.
מסמנים את התיבה
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.לוחצים על מחיקה.
לוחצים על מחיקה כדי לאשר.
מחיקת אשכול GKE והמשאבים Google Cloud
מחיקת אשכול GKE:
עוברים לדף Clusters:
מסמנים את התיבה של
online-serving-cluster.לוחצים על מחיקה.
כדי לאשר את המחיקה, מקלידים
online-serving-clusterולוחצים על מחיקה.
מוחקים את הקטגוריה של Cloud Storage:
נכנסים לדף Buckets:
מסמנים את התיבה
PROJECT_ID-gke-bucket.לוחצים על מחיקה.
כדי לאשר את המחיקה, מקלידים
DELETEולוחצים על מחיקה.
מוחקים את Google Cloud חשבון השירות:
עוברים לדף Service accounts:
בוחרים את הפרויקט הרצוי.
מסמנים את התיבה
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.לוחצים על מחיקה.
לוחצים על מחיקה כדי לאשר.
מחיקת הפרויקט
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.