במדריך הזה מוסבר איך להפעיל מודל שפה גדול (LLM) באמצעות יחידות לעיבוד טנסורים (TPU) ב-Google Kubernetes Engine (GKE) עם התוסף Ray Operator ועם מסגרת ההפעלה 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 שנבנו באמצעות מסגרות כמו TensorFlow, PyTorch ו-JAX.
במדריך הזה נסביר איך להפעיל מודלים של LLM בצמתי TPU v5e או TPU Trillium (v6e) עם טופולוגיות TPU שהוגדרו על סמך הדרישות של כל מודל להצגת הנחיות עם זמן אחזור נמוך.
vLLM
vLLM היא מסגרת קוד פתוח מותאמת במיוחד להצגת מודלים גדולים של שפה (LLM), שיכולה להגדיל את קצב העברת הנתונים בהצגת מודלים ב-TPU, עם תכונות כמו:
- הטמעה אופטימלית של טרנספורמציה באמצעות PagedAttention
- הוספת תכונה של אצווה מתמשכת כדי לשפר את התפוקה הכוללת של הצגת המודעות
- מקביליות טנסורים והצגה מבוזרת במספר מעבדי GPU
מידע נוסף מופיע במאמרי העזרה בנושא vLLM.
מטרות
במדריך הזה מוסבר איך:
- יוצרים אשכול GKE עם מאגר צמתים של TPU.
- פריסת משאב בהתאמה אישית מסוג RayCluster עם פרוסת TPU של מארח יחיד. GKE פורס את המשאב המותאם אישית RayCluster בתור Kubernetes Pods.
- הפעלת LLM.
- ליצור אינטראקציה עם המודלים.
אפשר גם להגדיר את המשאבים והטכניקות הבאים לפרסום המודל, שנתמכים על ידי מסגרת Ray Serve:
- פריסה של משאב מותאם אישית מסוג RayService.
- שילוב של כמה מודלים באמצעות תכונת שילוב המודלים.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת 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
הכנת הסביבה
צריך לוודא שיש לכם מספיק מכסה בפרויקט ל-TPU v5e עם מארח יחיד או ל-TPU Trillium (v6e) עם מארח יחיד. Google Cloud במאמר מכסות 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.
הגדרת Kubernetes ServiceAccount לגישה לקטגוריה
יוצרים את חשבון השירות של 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 Dashboard, לוחצים על הכרטיסייה 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-8tכדי להקצות TPU 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 ואתם כבר לא צריכים את הפרויקט, תוכלו למחוק אותו באמצעות השלבים הבאים:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
המאמרים הבאים
- יכולות התזמור של פלטפורמת GKE מאפשרות להריץ עומסי עבודה של AI/ML בצורה אופטימלית.
- קוד לדוגמה ב-GitHub
- כדי ללמוד איך לאסוף מדדים של אשכולות Ray שפועלים ב-GKE ולהציג אותם, צריך לבצע את השלבים במאמר איך אוספים מדדים של אשכולות Ray ב-GKE ומציגים אותם.