במדריך הזה נסביר איך להכניס לשימוש בסביבת הייצור מודל שפה גדול (LLM) באמצעות יחידות לעיבוד טנסורים (TPU) ב-Google Kubernetes Engine (GKE) עם התוסף Ray Operator וה-framework של vLLM.
במדריך הזה אפשר להכניס לשימוש בסביבת הייצור מודלים של LLM ב-TPU v5e או ב-TPU Trillium (v6e) באופן הבא:
- Llama 3 8B instruct ב-TPU v5e עם מארח יחיד.
- Mistral 7B instruct v0.3 ב-TPU v5e עם מארח יחיד.
- Llama 3.1 70B ב-TPU Trillium (v6e) עם מארח יחיד.
המדריך הזה מיועד ללקוחות של AI גנרטיבי, למשתמשי GKE חדשים וקיימים, למהנדסי ML, למהנדסי MLOps (DevOps) או לאדמינים של פלטפורמות שרוצים להשתמש ביכולות של תזמור קונטיינרים ב-Kubernetes כדי להפעיל מודלים באמצעות Ray, ב-TPU עם vLLM.
רקע
בקטע הזה מתוארות הטכנולוגיות העיקריות שמופיעות במדריך הזה.
שירות Kubernetes מנוהל של GKE
Google Cloud מציעה מגוון רחב של שירותים, כולל GKE, שמתאים מאוד לפריסה ולניהול של עומסי עבודה של AI/ML. GKE הוא שירות מנוהל של Kubernetes שמפשט את הפריסה, ההתאמה לעומס (scaling) והניהול של אפליקציות בקונטיינרים. GKE מספק את התשתית הנדרשת, כולל משאבים ניתנים להרחבה, מחשוב מבוזר ורשתות יעילות, כדי לעמוד בדרישות החישוב של מודלי LLM.
מידע נוסף על מושגי Kubernetes מרכזיים זמין במאמר תחילת הלימוד של Kubernetes. מידע נוסף על GKE ועל האופן שבו הוא עוזר לכם להתאים את המערכת לעומס, לבצע אוטומציה ולנהל את Kubernetes זמין במאמר סקירה כללית של GKE.
אופרטור Ray
התוסף Ray Operator ב-GKE מספק פלטפורמת AI/ML מקצה לקצה להצגת מודלים, לאימון ולכוונון עדין של עומסי עבודה של למידת מכונה. במדריך הזה, משתמשים ב-Ray Serve, מסגרת ב-Ray, כדי להפעיל מודלים פופולריים של LLM מ-Hugging Face.
TPUs
יחידות TPU הן מעגלים משולבים לאפליקציות ספציפיות (ASIC) שפותחו על ידי Google כדי להאיץ למידת מכונה ומודלים של AI שנבנו באמצעות frameworks כמו TensorFlow, PyTorch ו-JAX.
במדריך הזה נסביר איך להפעיל מודלים של LLM בצמתים של TPU v5e או TPU Trillium (v6e) עם טופולוגיות של TPU שהוגדרו על סמך הדרישות של כל מודל להפעלת הנחיות עם השהיה נמוכה.
vLLM
vLLM הוא פריימוורק קוד פתוח לפרסום מודלים מסוג LLM שעבר אופטימיזציה גבוהה, ויכול לשפר את קצב העברת הנתונים ב-TPU. הוא כולל תכונות כמו:
- הטמעה אופטימלית של טרנספורמציה באמצעות PagedAttention
- הוספת תכונה של אצווה מתמשכת כדי לשפר את התפוקה הכוללת של הצגת המודעות
- מקביליות טנסורים והצגה מבוזרת במספר יחידות GPU
מידע נוסף מופיע במאמרי העזרה בנושא vLLM.
מטרות
במדריך הזה מוסבר איך:
- יוצרים אשכול GKE עם מאגר צמתים של TPU.
- פריסת משאב בהתאמה אישית מסוג RayCluster עם פרוסת TPU של מארח יחיד. GKE פורס את המשאב המותאם אישית RayCluster כ-Pods של Kubernetes.
- הפעלת מודל LLM.
- ליצור אינטראקציה עם המודלים.
אפשר גם להגדיר את המשאבים והטכניקות הבאים להצגת מודלים, שהמסגרת Ray Serve תומכת בהם:
- פריסה של משאב מותאם אישית מסוג RayService.
- שילוב של כמה מודלים באמצעות תכונת שילוב המודלים.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- יוצרים חשבון ב-Hugging Face, אם עדיין אין לכם חשבון.
- מוודאים שיש לכם טוקן של Hugging Face.
- מוודאים שיש לכם גישה למודל Hugging Face שבו אתם ��וצים להשתמש. בדרך כלל מקבלים את הגישה הזו אחרי שחותמים על הסכם ומבקשים גישה מבעלי המודל בדף המודל ב-Hugging Face.
- צריך לוודא שיש לכם את התפקידים הבאים ב-IAM:
roles/container.adminroles/iam.serviceAccountAdminroles/container.clusterAdminroles/artifactregistry.writer
הכנת הסביבה
חשוב ל��ודא שיש לכם מכסה מספקת ב Google Cloud פרויקט ל-TPU v5e עם מארח יחיד או ל-TPU Trillium (v6e) עם מארח יחיד. במאמר מכסות TPU מוסבר איך לנהל את המכסה.
במסוף Google Cloud , מפעילים מכונת Cloud Shell:
פתיחת Cloud Shellמשכפלים את המאגר לדוגמה:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samplesעוברים לספריית העבודה:
cd ai-ml/gke-ray/rayserve/llmמגדירים את משתני הסביבה שמוגדרים כברירת מחדל ליצירת אשכול GKE:
Llama-3-8B-Instruct
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="meta-llama/Meta-Llama-3-8B-Instruct" export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svcמחליפים את מה שכתוב בשדות הבאים:
-
HUGGING_FACE_TOKEN: אסימון הגישה שלכם ל-Hugging Face. -
REGION: האזור שבו יש לכם מכסת TPU. מוודאים שגרסת ה-TPU שבה רוצים להשתמש זמינה באזור הזה. מידע נוסף זמין במאמר זמינות של TPU ב-GKE. -
ZONE: האזור עם מכסת TPU זמינה. -
VLLM_IMAGE: תמונת ה-TPU של vLLM. אתם יכולים להשתמש בתמונתdocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1ציבורית או ליצור תמונת TPU משלכם.
Mistral-7B
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="mistralai/Mistral-7B-Instruct-v0.3" export TOKENIZER_MODE=mistral export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svcמחליפים את מה שכתוב בשדות הבאים:
-
HUGGING_FACE_TOKEN: אסימון הגישה שלכם ל-Hugging Face. -
REGION: האזור שבו יש לכם מכסת TPU. מוודאים שגרסת ה-TPU שבה רוצים להשתמש זמינה באזור הזה. מידע נוסף זמין במאמר זמינות של TPU ב-GKE. -
ZONE: האזור עם מכסת TPU זמינה. -
VLLM_IMAGE: תמונת ה-TPU של vLLM. אתם יכולים להשתמש בתמונתdocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1ציבורית או ליצור תמונת TPU משלכם.
Llama 3.1 70B
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="meta-llama/Llama-3.1-70B" export MAX_MODEL_LEN=8192 export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svcמחליפים את מה שכתוב בשדות הבאים:
-
HUGGING_FACE_TOKEN: אסימון הגישה שלכם ל-Hugging Face. -
REGION: האזור שבו יש לכם מכסת TPU. מוודאים שגרסת ה-TPU שבה רוצים להשתמש זמינה באזור הזה. מידע נוסף זמין במאמר זמינות של TPU ב-GKE. -
ZONE: האזור עם מכסת TPU זמינה. -
VLLM_IMAGE: תמונת ה-TPU של vLLM. אתם יכולים להשתמש בתמונתdocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1ציבורית או ליצור תמונת TPU משלכם.
-
מושכים את קובץ האימג' של קונטיינר vLLM:
sudo usermod -aG docker ${USER} newgrp docker docker pull ${VLLM_IMAGE}
יצירת אשכול
אפשר להפעיל מודל שפה גדול (LLM) ב-TPU באמצעות Ray באשכול GKE Autopilot או באשכול רגיל, באמצעות התוסף Ray Operator.
כדי ליהנות מחוויית Kubernetes מנוהלת לחלוטין, אפשר להשתמש באשכול Autopilot. כדי לבחור את מצב הפעולה של GKE שהכי מתאים לעומסי העבודה שלכם, אפשר לעיין במאמר בחירת מצב פעולה של GKE.
משתמשים ב-Cloud Shell כדי ליצור אשכול במצב Autopilot או אשכול רגיל:
טייס אוטומטי
יוצרים אשכול GKE Autopilot עם התוסף Ray Operator מופעל:
gcloud container clusters create-auto ${CLUSTER_NAME} \ --enable-ray-operator \ --release-channel=rapid \ --location=${COMPUTE_REGION}
רגילה
יוצרים אשכול רגיל עם התוסף Ray Operator מופעל:
gcloud container clusters create ${CLUSTER_NAME} \ --release-channel=rapid \ --location=${COMPUTE_ZONE} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --machine-type="n1-standard-4" \ --addons=RayOperator,GcsFuseCsiDriverיוצרים מאגר צמתים של פרוסת TPU עם מארח יחיד:
Llama-3-8B-Instruct
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-8t \ --num-nodes=1GKE יוצר מאגר צמתים של TPU v5e עם סוג מכונה
ct5lp-hightpu-8t.Mistral-7B
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-8t \ --num-nodes=1GKE יוצר מאגר צמתים של TPU v5e עם סוג מכונה
ct5lp-hightpu-8t.Llama 3.1 70B
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-8t \ --num-nodes=1GKE יוצר מאגר צמתים של TPU v6e עם סוג מכונה של
ct6e-standard-8t.
הגדרת kubectl לתקשורת עם האשכול
כדי להגדיר את kubectl לתקשורת עם האשכול, מריצים את הפקודה הבאה:
טייס אוטומטי
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_REGION}
רגילה
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_ZONE}
יצירת סוד של Kubernetes לפרטי הכניסה של Hugging Face
כדי ליצור סוד של Kubernetes שמכיל את האסימון של Hugging Face, מריצים את הפקודה הבאה:
kubectl create secret generic hf-secret \
--from-literal=hf_api_token=${HF_TOKEN} \
--dry-run=client -o yaml | kubectl --namespace ${NAMESPACE} apply -f -
יצירת קטגוריה של Cloud Storage
כדי לקצר את זמן ההפעלה של פריסת vLLM ולצמצם את נפח האחסון הנדרש לכל צומת, משתמשים במנהל התקן ה-CSI של Cloud Storage FUSE כדי לטעון את המודל שהורד ואת מטמון הקומפילציה לצמתי Ray.
ב-Cloud Shell, מריצים את הפקודה הבאה:
gcloud storage buckets create gs://${GSBUCKET} \
--uniform-bucket-level-access
הפקודה הזו יוצרת קטגוריה של Cloud Storage לאחסון קובצי המודל שהורדתם מ-Hugging Face.
הגדרת ServiceAccount ב-Kubernetes כדי לגשת לקטגוריה
יוצרים את חשבון השירות של Kubernetes:
kubectl create serviceaccount ${KSA_NAME} \ --namespace ${NAMESPACE}נותנים לחשבון השירות של Kubernetes גישת קריאה וכתיבה לקטגוריית Cloud Storage:
gcloud storage buckets add-iam-policy-binding gs://${GSBUCKET} \ --member "principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${NAMESPACE}/sa/${KSA_NAME}" \ --role "roles/storage.objectUser"GKE יוצר את המשאבים הבאים עבור ה-LLM:
- קטגוריה של Cloud Storage לאחסון המודל שהורד ומטמון הקומפילציה. מנהל התקן ה-CSI של Cloud Storage FUSE קורא את התוכן של הקטגוריה.
- כרכים עם שמירת קבצים במטמון והתכונה הורדה מקבילי�� של Cloud Storage FUSE.
שיטה מומלצת: כדאי להשתמש במטמון קבצים שמגובה על ידי
tmpfsאוHyperdisk / Persistent Disk, בהתאם לגודל הצפוי של תוכן המודל, למשל קבצי משקל. במדריך הזה משתמשים במטמון קבצים של Cloud Storage FUSE שמגובה על ידי RAM.
פריסת משאב מותאם אישית של RayCluster
פריסת משאב מותאם אישית של RayCluster, שבדרך כלל מורכב מ-Pod אחד של המערכת ומכמה Pods של עובדים.
Llama-3-8B-Instruct
כדי לפרוס את מודל Llama 3 8B שעבר כוונון להוראות, צריך ליצור את המשאב המותאם אישית RayCluster באמצעות השלבים הבאים:
בודקים את קובץ המניפסט
ray-cluster.tpu-v5e-singlehost.yaml:החלת המניפסט:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -הפקודה
envsubstמחליפה את משתני הסביבה במניפסט.
GKE יוצר משאב מותאם אישית מסוג RayCluster עם workergroup שמכיל מארח יחיד של TPUv5e בטופולוגיה של 2x4.
Mistral-7B
כדי לפרוס את מודל Mistral-7B, צריך ליצור את המשאב המותאם אישית RayCluster. לשם כך, מבצעים את השלבים הבאים:
בודקים את קובץ המניפסט
ray-cluster.tpu-v5e-singlehost.yaml:החלת המניפסט:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -הפקודה
envsubstמחליפה את משתני הסביבה במניפסט.
GKE יוצר משאב מותאם אישית מסוג RayCluster עם workergroup שמכיל מארח יחיד של TPUv5e בטופולוגיה של 2x4.
Llama 3.1 70B
כדי לפרוס את מודל Llama 3.1 70B, צריך ליצור את המשאב המותאם אישית RayCluster. לשם כך, מבצעים את השלבים הבאים:
בודקים את קובץ המניפסט
ray-cluster.tpu-v6e-singlehost.yaml:החלת המניפסט:
envsubst < tpu/ray-cluster.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -הפקודה
envsubstמחליפה את משתני הסביבה במניפסט.
GKE יוצר משאב מותאם אישית מסוג RayCluster עם workergroup
שמכיל TPU v6e עם מארח יחיד בטופולוגיה 2x4.
התחברות למשאב מותאם אישית RayCluster
אחרי שיוצרים את המשאב המותאם אישית RayCluster, אפשר להתחבר למשאב RayCluster ולהתחיל להפעיל את המודל.
מוודאים ש-GKE יצר את שירות RayCluster:
kubectl --namespace ${NAMESPACE} get raycluster/vllm-tpu \ --output wideהפלט אמור להיראות כך:
NAME DESIRED WORKERS AVAILABLE WORKERS CPUS MEMORY GPUS TPUS STATUS AGE HEAD POD IP HEAD SERVICE IP vllm-tpu 1 1 ### ###G 0 8 ready ### ###.###.###.### ###.###.###.###מחכים עד שהסטטוס של
STATUSיהיהreadyועד שבעמודותHEAD POD IPו-HEAD SERVICE IPתופיע כתובת IP.יוצרים
port-forwardingסשנים ל-Ray head:pkill -f "kubectl .* port-forward .* 8265:8265" pkill -f "kubectl .* port-forward .* 10001:10001" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null & kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 10001:10001 2>&1 >/dev/null &מוודאים שלקוח Ray יכול להתחבר למשאב המותאם אישית RayCluster המרוחק:
docker run --net=host -it ${VLLM_IMAGE} \ ray list nodes --address http://localhost:8265הפלט אמור להיראות כך:
======== List: YYYY-MM-DD HH:MM:SS.NNNNNN ======== Stats: ------------------------------ Total: 2 Table: ------------------------------ NODE_ID NODE_IP IS_HEAD_NODE STATE STATE_MESSAGE NODE_NAME RESOURCES_TOTAL LABELS 0 XXXXXXXXXX ###.###.###.### True ALIVE ###.###.###.### CPU: 2.0 ray.io/node_id: XXXXXXXXXX memory: #.### GiB node:###.###.###.###: 1.0 node:__internal_head__: 1.0 object_store_memory: #.### GiB 1 XXXXXXXXXX ###.###.###.### False ALIVE ###.###.###.### CPU: 100.0 ray.io/node_id: XXXXXXXXXX TPU: 8.0 TPU-v#e-8-head: 1.0 accelerator_type:TPU-V#E: 1.0 memory: ###.### GiB node:###.###.###.###: 1.0 object_store_memory: ##.### GiB tpu-group-0: 1.0
פריסת המודל באמצעות vLLM
כדי לפרוס מודל ספציפי באמצעות vLLM, פועלים לפי ההוראות האלה.
Llama-3-8B-Instruct
docker run \
--env MODEL_ID=${MODEL_ID} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MODEL_ID": "meta-llama/Meta-Llama-3-8B-Instruct"}}'
Mistral-7B
docker run \
--env MODEL_ID=${MODEL_ID} \
--env TOKENIZER_MODE=${TOKENIZER_MODE} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MODEL_ID": "mistralai/Mistral-7B-Instruct-v0.3", "TOKENIZER_MODE": "mistral"}}'
Llama 3.1 70B
docker run \
--env MAX_MODEL_LEN=${MAX_MODEL_LEN} \
--env MODEL_ID=${MODEL_ID} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MAX_MODEL_LEN": "8192", "MODEL_ID": "meta-llama/Meta-Llama-3.1-70B"}}'
הצגת מרכז הבקרה של Ray
אפשר לראות את הפריסה של Ray Serve ואת היומנים הרלוונטיים מלוח הבקרה של Ray.
- לוחצים על הלחצן
Web Preview (תצוגה מקדימה באינטרנט) בפינה השמאלית העליונה של סרגל המשימות של Cloud Shell.
- לוחצים על שינוי יציאה ומגדירים את מספר היציאה ל-
8265. - לוחצים על שינוי ותצוגה מקדימה.
- בלוח הבקרה של Ray, לוחצים על הכרטיסייה Serve (הגשה).
אחרי שהפריסה של ה-Serve מקבלת סטטוס HEALTHY, המודל מוכן להתחיל לעבד קלט.
פרסום המודל
במדריך הזה מודגשים מודלים שתומכים ביצירת טקסט, טכניקה שמאפשרת ליצור תוכן טקסט מתוך הנחיה.
Llama-3-8B-Instruct
מגדירים העברה ליציאה אחרת לשרת:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &שליחת הנחיה לנקודת הקצה של הפריסה:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Mistral-7B
מגדירים העברה ליציאה אחרת לשרת:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &שליחת הנחיה לנקודת הקצה של הפריסה:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Llama 3.1 70B
מגדירים העברה ליציאה אחרת לשרת:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &שליחת הנחיה לנקודת הקצה של הפריסה:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
שלבי הגדרת תצורה נוספים
אפשר גם להגדיר את המשאבים והטכניקות הבאים להצגת מודלים, שהמסגרת Ray Serve תומכת בהם:
- פריסת משאב מותאם אישית של RayService. בשלבים הקודמים של המדריך הזה, השתמשתם ב-RayCluster במקום ב-RayService. מומלץ להשתמש ב-RayService בסביבות ייצור.
- איך יוצרים כמה מודלים באמצעות שילוב מודלים הגדרת שילוב מודלים (multiplexing) והרכבת מודלים (composition) שנתמכים על ידי מסגרת Ray Serve. הרכבת מודלים מאפשרת לכם לשרשר קלט ופלט בכמה מודלים גדולים של שפה (LLM) ולהרחיב את המודלים שלכם כאפליקציה אחת.
- איך יוצרים ופורסים תמונת TPU משלכם מומלץ להשתמש באפשרות הזו אם אתם צריכים שליטה מדויקת יותר על התוכן של תמונת Docker.
פריסת RayService
אפשר לפרוס את אותם מודלים מהמדריך הזה באמצעות משאב מותאם אישית של RayService.
מוחקים את המשאב המותאם אישית RayCluster שיצרתם במדריך הזה:
kubectl --namespace ${NAMESPACE} delete raycluster/vllm-tpuיוצרים את המשאב המותאם אישית RayService כדי לפרוס מודל:
Llama-3-8B-Instruct
בודקים את קובץ המניפסט
ray-service.tpu-v5e-singlehost.yaml:החלת המניפסט:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -הפקודה
envsubstמחליפה את ��שתני הסביבה במניפסט.GKE יוצר RayService עם
workergroupשמכיל TPU v5e עם מארח יחיד בטופולוגיה של2x4.
Mistral-7B
בודקים את קובץ המניפסט
ray-service.tpu-v5e-singlehost.yaml:החלת המניפסט:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -הפקודה
envsubstמחליפה את משתני הסביבה במניפסט.GKE יוצר RayService עם
workergroupשמכיל TPU v5e עם מארח יחיד בטופולוגיה2x4.
Llama 3.1 70B
בודקים את קובץ המניפסט
ray-service.tpu-v6e-singlehost.yaml:החלת המניפסט:
envsubst < tpu/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -הפקודה
envsubstמחליפה את משתני הסביבה במניפסט.
GKE יוצר משאב מותאם אישית מסוג RayCluster שבו אפליקציית Ray Serve נפרסת, ואז נוצר משאב מותאם אישית מסוג RayService.
בודקים את הסטטוס של משאב RayService:
kubectl --namespace ${NAMESPACE} get rayservices/vllm-tpuמחכים שסטטוס השירות ישתנה ל
Running:NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 1מאחזרים את השם של שירות ה-head של RayCluster:
SERVICE_NAME=$(kubectl --namespace=${NAMESPACE} get rayservices/vllm-tpu \ --template={{.status.activeServiceStatus.rayClusterStatus.head.serviceName}})כדי להציג את לוח הבקרה של Ray, צריך ליצור
port-forwardingסשנים ל-Ray:pkill -f "kubectl .* port-forward .* 8265:8265" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null &פינוי המשאב RayService:
kubectl --namespace ${NAMESPACE} delete rayservice/vllm-tpu
הרכבת כמה מודלים באמצעות הרכבת מודלים
קומפוזיציה של מודלים היא טכניקה לשילוב של כמה מודלים באפליקציה אחת.
בקטע הזה משתמשים באשכול GKE כדי להרכיב שני מודלים, Llama 3 8B IT ו-Gemma 7B IT, לאפליקציה אחת:
- המודל הראשון הוא מודל העוזר הדיגיטלי שמשיב על שאלות שמופיעות בהנחיה.
- המודל השני הוא מודל הסיכום. הפלט של מודל ה-Assistant משורשר לקלט של מודל המסכם. התוצאה הסופית היא גרסה מסוכמת של התשובה מהמודל של העוזר הדיגיטלי.
כדי לקבל גישה למודל Gemma, צריך לבצע את השלבים הבאים:
- נכנסים לפלטפורמת Kaggle, חותמים על הסכם ההסכמה לרישיון ומקבלים טוקן Kaggle API. במדריך הזה נשתמש ב-Kubernetes Secret בשביל פרטי הכניסה של Kaggle.
- נכנסים אל דף ההסכמה לשימוש במודל באתר Kaggle.com.
- אם עדיין לא עשיתם זאת, נכנסים לחשבון Kaggle.
- לוחצים על בקשת גישה.
- בקטע Choose Account for Consent (בחירת חשבון להענקת הסכמה), בוחרים באפשרות Verify via Kaggle Account (אימות דרך חשבון Kaggle) כדי להשתמש בחשבון Kaggle להענקת הסכמה.
- מאשרים את התנאים וההגבלות של המודל.
מגדירים את הסביבה:
export ASSIST_MODEL_ID=meta-llama/Meta-Llama-3-8B-Instruct export SUMMARIZER_MODEL_ID=google/gemma-7b-itבמערכות Standard, יוצרים מאגר צמתים נוסף של פרוסת TPU עם מארח יחיד:
gcloud container node-pools create tpu-2 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=MACHINE_TYPE \ --num-nodes=1מחליפים את
MACHINE_TYPEבאחד מסוגי המכונות הבאים:-
ct5lp-hightpu-8tTPU v5e. ct6e-standard-8tכדי להקצות TPU v6e.
ב-Autopilot, הקלאסטרים מקצים באופן אוטומטי את הצמתים הנדרשים.
-
פורסים את משאב RayService על סמך גרסת ה-TPU שבה רוצים להשתמש:
TPU v5e
בודקים את קובץ המניפסט
ray-service.tpu-v5e-singlehost.yaml:החלת המניפסט:
envsubst < model-composition/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
TPU v6e
בודקים את קובץ המניפסט
ray-service.tpu-v6e-singlehost.yaml:החלת המניפסט:
envsubst < model-composition/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
מחכים שהסטטוס של משאב RayService ישתנה ל-
Running:kubectl --namespace ${NAMESPACE} get rayservice/vllm-tpuהפלט אמור להיראות כך:
NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 2בפלט הזה, הסטטוס
RUNNINGמציין שהמשאב RayService מוכן.מוודאים ש-GKE יצר את השירות לאפליקציית Ray Serve:
kubectl --namespace ${NAMESPACE} get service/vllm-tpu-serve-svcהפלט אמור להיראות כך:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vllm-tpu-serve-svc ClusterIP ###.###.###.### <none> 8000/TCP ###יוצרים
port-forwardingסשנים ל-Ray head:pkill -f "kubectl .* port-forward .* 8265:8265" pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/vllm-tpu-serve-svc 8265:8265 2>&1 >/dev/null & kubectl --namespace ${NAMESPACE} port-forward service/vllm-tpu-serve-svc 8000:8000 2>&1 >/dev/null &שליחת בקשה למודל:
curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What is the most popular programming language for machine learning and why?", "max_tokens": 1000}'הפלט אמור להיראות כך:
{"text": [" used in various data science projects, including building machine learning models, preprocessing data, and visualizing results.\n\nSure, here is a single sentence summarizing the text:\n\nPython is the most popular programming language for machine learning and is widely used in data science projects, encompassing model building, data preprocessing, and visualization."]}
יצירה ופריסה של תמונת ה-TPU
במדריך הזה נעשה שימוש בתמונות TPU מאוחסנות מ-vLLM. vLLM מספק תמונת Dockerfile.tpu שיוצרת vLLM על בסיס תמונת PyTorch XLA הנדרשת, שכוללת תלות ב-TPU. עם זאת, אתם יכולים גם ליצור ולפרוס קובץ אימג' משלכם של TPU כדי לקבל שליטה מדויקת יותר על התוכן של קובץ האימג' של Docker.
יוצרים מאגר Docker לאחסון תמונות הקונטיינר של המדריך הזה:
gcloud artifacts repositories create vllm-tpu --repository-format=docker --location=${COMPUTE_REGION} && \ gcloud auth configure-docker ${COMPUTE_REGION}-docker.pkg.devמשכפלים את מאגר vLLM:
git clone https://github.com/vllm-project/vllm.git cd vllmיוצרים את התמונה:
docker build -f ./docker/Dockerfile.tpu . -t vllm-tpuמתייגים את תמונת ה-TPU בשם שלכם ב-Artifact Registry:
export VLLM_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/vllm-tpu/vllm-tpu:TAG docker tag vllm-tpu ${VLLM_IMAGE}מחליפים את
TAGבשם התג שרוצים להגדיר. אם לא מציינים תג, Docker מחיל את התג העדכני שמוגדר כברירת מחדל.מעבירים את האימג' ל-Artifact Registry:
docker push ${VLLM_IMAGE}
מחיקת המשאבים הבודדים
אם השתמשתם בפרויקט קיים ואתם לא רוצים למחוק אותו, אתם יכולים למחוק את המשאבים הבודדים.
מוחקים את המשאב המותאם אישית RayCluster:
kubectl --namespace ${NAMESPACE} delete rayclusters vllm-tpuמוחקים את הקטגוריה של Cloud Storage:
gcloud storage rm -r gs://${GSBUCKET}מחיקת מאגר Artifact Registry:
gcloud artifacts repositories delete vllm-tpu \ --location=${COMPUTE_REGION}מחיקת האשכול:
gcloud container clusters delete ${CLUSTER_NAME} \ --location=LOCATIONמחליפים את
LOCATIONבאחד ממשתני הסביבה הבאים:- באשכולות במצב Autopilot, משתמשים ב-
COMPUTE_REGION. - למערכות סטנדרטיות, משתמשים ב-
COMPUTE_ZONE.
- באשכולות במצב Autopilot, משתמשים ב-
מחיקת הפרויקט
אם פרסתם את המדריך בפרויקט חדש Google Cloud ואתם לא צריכים יותר את הפרויקט, אתם יכולים למחוק אותו באמצעות השלבים הבאים:
- במסוף Google Cloud , נכנסי�� לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
המאמרים הבאים
- כאן מוסבר איך להריץ עומסי עבודה של AI/ML שעברו אופטימיזציה באמצעות יכולות התזמור של פלטפורמת GKE.
- למדו כיצד להשתמש ב-Ray Serve ב-GKE, על ידי צפייה ב-קוד לדוגמה ב-GitHub.
- כדי ללמוד איך לאסוף מדדים של אשכולות Ray שפועלים ב-GKE ולהציג אותם, צריך לבצע את השלבים במאמר איסוף והצגה של יומנים ומדדים של אשכולות Ray ב-GKE.