במדריך הזה נסביר איך לפרוס את מודל ה-AI המשולב Qwen3-Coder-30B-A3B (Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8) ב-Google Kubernetes Engine (GKE) ולהגיש ממנו תשובות. הפריסה משתמשת במאיצי TPU v6e (Trillium) עם כמה מארחים ובמסגרת להצגת מודעות SGLang עם TorchTPU (torchtpu) ופירוק של מילוי מראש ופענוח (PD).
בהגדרת הפריסה שמתוארת במדריך הזה, אתם מקצים שני מאגרי צמתים של ct6e-standard-4t עם כמה מארחים, שכל אחד מהם מסודר בטופולוגיה של 2x4 (שמונה שבבי TPU v6e בשני צמתים לכל מאגר צמתים, סה"כ 16 שבבי TPU v6e). אתם יכולים להשתמש ב-Kubernetes LeaderWorkerSet API כדי:
- מריצים שרתי מילוי מראש ופענוח מרובי-מארחים מפורקים בפרוסות נפרדות של TPU v6e, כשהאפשרויות "מקביליות של טנזורים" ו"מקביליות של מומחים" מופעלות.
- ניתוב בקשות דרך נתב SGLang disaggregation.
כדי להריץ תהליך עבודה דומה של מילוי בקשות ב-SGLang TorchTPU עם מספר מארחים במאיצי TPU7x (Ironwood) עם המודל הגדול יותר Qwen3-Coder-480B, קראו את המאמר מילוי בקשות ב-Qwen3-Coder-480B ב-GKE עם SGLang TorchTPU עם מספר מארחים והפרדת PD במאיצי TPU7x.
מטרות
- מגדירים את אשכול GKE ואת מאגרי הצמתים של TPU v6e עם כמה מארחים.
- מגדירים את פרטי הכניסה ומתקינים את בקר LeaderWorkerSet.
- פורסים את עומסי העבודה של מילוי מראש, פענוח ונתב של SGLang בכמה מארחים.
- שולחים בקשת הסקה לשירות הנתב של SGLang.
- מריצים עומס עבודה להערכת ביצועים של מילוי בקשות.
- מנקים.
עלויות
במסמך הזה משתמשים ברכיבים הבאים שלGoogle Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את העלויות בהתאם לשימוש הצפוי, אתם יכולים להשתמש במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
מגדירים את הסביבה למדריך:
מתקינים ומפעילים את Google Cloud CLI, ומתקינים את
kubectl. אם אתם משתמשים ב-Cloud Shell, שני הכלים מותקנים מראש.מפעילים את ממשקי ה-API הבאים בפרויקט ב- Google Cloud : Kubernetes Engine API, Compute Engine API, Cloud TPU API ו-Artifact Registry API.
מוודאים שבפרויקט יש מספיק מכסת דיסק ומכסת כתובות IP חיצוניות באזור שבו נמצאת קיבולת ה-TPU:
במסוף Google Cloud , נכנסים לדף Quotas & System Limits.
מוודאים שיש לכם מכסה פנויה של לפחות 400GiB ב-Google Cloud Hyperdisk Balanced, בארבעת הנפחים הזמניים של 100GiB שמשמשים לשמירת המודל במטמון על ידי ה-Pods של המילוי מראש ופענוח הקוד.
מסננים לפי In-use regional external IPv4 addresses ומוודאים שיש לכם מספיק מכסות של כתובות IP באזור היעד.
איך מקבלים טוקן גישה ל-Hugging Face
כדי להשתמש במדריך הזה, אתם צריכים טוקן גישה ל-Hugging Face. אפשר להירשם לחשבון בחינם ב-Hugging Face. אחרי שיוצרים חשבון, יוצרים אסימון גישה:
- בדף Welcome to Hugging Face, לוחצים על הדמות של החשבון ובוחרים באפשרות טוקן גישה.
- בדף טוקני גישה, לוחצים על Create new token.
- בוחרים את סוג הטוקן Read ומזינים שם לטוקן.
- טוקן הגישה שלכם יוצג. שומרים את הטוקן במקום בטוח.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להשלמת המדריך, בקשו מהאדמין להקצות לכם את התפקידים הבאים ב-IAM בפרויקט:
- אדמין ב-Kubernetes Engine (
roles/container.admin) - אדמין ב-Compute (
roles/compute.admin) - משתמש בחשבון שירות (
roles/iam.serviceAccountUser)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
מוודאים שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש את התפקידים הבאים של ניהול זהויות והרשאות גישה (IAM) בפרויקט:
- חשבון השירות של צומת ברירת המחדל של Kubernetes Engine
(
roles/container.defaultNodeServiceAccount) - קריאה ב-Artifact Registry
(
roles/artifactregistry.reader)
הגדרת משתני הסביבה
מייצאים את משתני הסביבה שבהם משתמשים במדריך הזה:
מחליפים את מה שכתוב בשדות הבאים:
-
YOUR_CLUSTER_NAME: השם של אשכול GKE. -
YOUR_PROJECT_ID: מזהה הפרויקט ב- Google Cloud. -
YOUR_REGION: האזור שבו רוצים לפרוס את האשכול, למשלus-central1. -
YOUR_ZONE: האזור שבו רוצים לפרוס את מאגרי הצמתים של TPU v6e, למשלus-central1-b. -
YOUR_RESERVATION_NAME: אם אתם משתמשים בהזמנה, השם של ההזמנה של TPU v6e. -
YOUR_HF_TOKEN: טוקן הגישה שלכם ל-Hugging Face.
אם אתם משתמשים בקובץ אימג' של קונטיינר SGLang TorchTPU בהתאמה אישית, החליפו את lmsysorg/sglang:v0.1.0-tpu במשתנה SGLANG_IMAGE ב-URI של קובץ האימג'.
יצירת אשכול GKE
כדי ליצור אשכול GKE במצב Standard ולצרף שני מאגרי צמתים של TPU v6e עם כמה מארחים להפרדה של מילוי מראש ופענוח, מבצעים את השלבים הבאים:
יוצרים אשכול GKE אזורי שמשתמש בצומתי
e2-standard-4למאגר הצמתים שמוגדר כברירת מחדל, שמספק מספיק משאבי מעבד (CPU) וזיכרון לבקר LeaderWorkerSet ולנתב הפירוק של SGLang:יוצרים שני מאגרי צמתים של TPU v6e עם כמה מארחים, שכל אחד מהם מכיל שני צמתים של
ct6e-standard-4t(שמונה שבבי TPU v6e בטופולוגיה של2x4לכל מאגר צמתים, ובסך הכול 16 שבבי TPU v6e):במקום להשתמש במקום שמור ספציפי, אתם יכולים גם ליצור את מאגרי הצמתים באמצעות קיבולת Spot או Flex-start VMs:
VMs במודל Spot
מקצים את מאגרי הצמתים באמצעות קיבולת Spot, על ידי החלפת הדגלים
--reservation-affinity=specificו---reservation="${RESERVATION}"בדגל--spot:יכול להיות שייקח זמן ליצור מכונות שמשתמשות בקיבולת של Spot אחרי שמאגר הצמתים נוצר, ויכול להיות שהן יופסקו במהלך הרצת עומסי העבודה.
מכונות וירטואליות מסוג Flex-start
מקצים את מאגרי הצמתים באמצעות אפשרות הצריכה Flex-start:
מידע נוסף זמין במאמר הרצת עומס עבודה קטן של אצווה באמצעות יחידות TPU ומכונות וירטואליות מסוג Flex-start.
מגדירים את פרטי הכניסה של
kubectlכדי לתקשר עם האשכול:
הגדרת פרטי כניסה והתקנת LeaderWorkerSet
כדי להכין את האשכול לפריסת SGLang בכמה מארחים, מבצעים את הפעולות הבאות:
יוצרים סוד של Kubernetes בשם
hf-secretכדי לאחסן את טוקן הגישה של Hugging Face:מתקינים את ה-CustomResourceDefinition והבקר של LeaderWorkerSet באשכול:
פריסת שרת SGLang עם כמה מארחים
במניפסט של עומס העבודה (qwen3-coder-30b-multihost-disagg-v6e-2x4.yaml) מוגדרים המשאבים הבאים, כדי לתאם בין מילוי מראש מבוזר לבין פענוח של הצגת מודעות בשני מאגרי הצמתים של 2x4 TPU v6e:
<!--StorageClass (): provisions ephemeral 100 GiBReadWriteOnce volumes backed by Google Cloud Hyperdisk Balanced storage.-->StorageClass (
hyperdisk-balanced-tpu): מקצה נפחי אחסון זמניים של 100 GiB ReadWriteOnce שמגובים באחסון של Google Cloud Hyperdisk Balanced. כל אחד מארבעת ה-Pods למילוי מראש ולפענוח טוען את אמצעי האחסון שלו ב-/dataכדי לאחסן באופן מקומי את נקודות הבדיקה שלQwen/Qwen3-Coder-30B-A3B-Instruct-FP8שהורדו.מאגר למילוי מראש (
sglang-prefill-serviceו-sglang-tpu-prefill): מריץ LeaderWorkerSet, שמכיל Pod אחד של Leader ו-Pod אחד של Worker, שמוצמדים באופן בלעדי למאגר אחד של צומתי2x4TPU v6e. במאגר הצמתים הזה יש שמונה שבבי TPU, שמספקים שמונה ליבות Tensor. ה-LeaderWorkerSet משתמש בהערהleaderworkerset.sigs.k8s.io/exclusive-topologyשמוגדרת ל-"cloud.google.com/gke-nodepool". ה-Pods מפעילים אתsglang.launch_serverעם הדגלים הבאים, וחושפים את היציאה8000ואת יציאת האתחול8998:--disaggregation-mode=prefill--tensor-parallel-size=8--ep-size=8
Decode pool (
sglang-decode-serviceו-sglang-tpu-decode): מריץ LeaderWorkerSet שלsize: 2שמוצמד למאגר הצמתים השני של2x4TPU v6e (שמונה שבבי TPU שמספקים שמונה TensorCores). LeaderWorkerSet מפעיל אתsglang.launch_serverעם הדגלים הבאים:--disaggregation-mode=decode--tensor-parallel-size=8--ep-size=8
Disaggregation router (
sglang-routerו-sglang-service): מריץ פריסת מעבד (CPU) שמפעילה את המודולsglang_router.launch_routerעם הדגל--pd-disaggregationוחושפת ClusterIP Service ביציאה8000. הנתב מפנה את ההנחיות ומתאם את העברת המטמון של KV בין השירותיםsglang-prefill-serviceו-sglang-decode-service.
כדי לפרוס את שרתי SGLang עם כמה מארחים ולעקוב אחריהם:
מורידים את המניפסט של עומס העבודה:
אפשר גם ליצור קובץ בשם
qwen3-coder-30b-multihost-disagg-v6e-2x4.yamlעם התוכן הבא:מחילים את המניפסט של עומס העבודה על האשכול:
מוודאים שהפודים של הנתב, המילוי מראש והפענוח נוצרו:
כשהפודים מוכנים, הפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE sglang-router-6d87cb8c7d-gv4wr 1/1 Running 0 39m sglang-tpu-decode-0 1/1 Running 0 40m sglang-tpu-decode-0-1 1/1 Running 0 40m sglang-tpu-prefill-0 1/1 Running 0 40m sglang-tpu-prefill-0-1 1/1 Running 0 40mעוקבים אחרי היומנים של Pod ה-Leader למילוי מראש ולפענוח עד לסיום ההפעלה:
ההורדה הראשונית של המודל, טעינת המשקלים וההידור נמשכים בערך 7 עד 10 דקות בהפעלה הראשונה.
אם אתם משתמשים בקיבולת שניתנת להפסקה לפני הזמן, כמו קיבולת של Spot או מכונות וירטואליות מסוג Flex-start, יכול להיות שייקח יותר זמן ליצור את הצמתים של פרוסות ה-TPU אחרי שתיצרו את מאגר הצמתים, ויכול להיות שהם יופסקו לפני הזמן במהלך הרצת עומסי העבודה. מידע נוסף מופיע במאמר מכונות VM זמניות. כדי לבדוק אם נוצרו צומתי פרוסות ה-TPU, עיינו בקטע בדיקת הסטטוס והתנאים של הצומת.
מחכים עד שביומני ה-Pod הראשיים של המילוי מראש והפענוח תופיע ההודעה הבאה, ובעמודה
READYשל כל ה-Pods הערך שלkubectl get podsיהיה1/1:The server is fired up and ready to roll!פותחים סשן שני של טרמינל ומעבירים את היציאה המקומית
8000אלsglang-service:משאירים את ההעברה ליציאה אחרת פועלת בסשן הטרמינל הזה.
שליחת בקשות להסקת מסקנות
חוזרים לסשן הראשון בטרמינל ושולחים בקשה להשלמת צ'אט לנקודת הקצה (endpoint) של /v1/chat/completions שנחשפה על ידי הנתב של SGLang:
הרצת עומס עבודה להערכת ביצועים
כדי להשוות את המודל Qwen3-Coder-30B-A3B שנפרס באמצעות עומס עבודה של קלט של 1,024 טוקנים ופלט של 1,024 טוקנים (1k/1k) מ-Pod של sglang-router, מריצים את הפקודה הבאה:
אחרי שהבדיקה מסתיימת, מחפשים פלט שמכיל מדדים כמו:
Output token throughput
Total token throughput
TTFT
TPOT
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה, צריך למחוק את המשאבים הבאים:
מוחקים את עומסי העבודה של SGLang למילוי מראש, לפענוח ולניתוב:
מוחקים את מאגרי הצמתים של TPU v6e ואת אשכול GKE:
המאמרים הבאים
אלא אם צוין אחרת, התוכן של דף זה הוא ברישיון Creative Commons Attribution 4.0 ודוגמאות הקוד הן ברישיון Apache 2.0. לפרטים, ניתן לעיין במדיניות האתר Google Developers. Java הוא סימן מסחרי רשום של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2026-11-03 (שעון UTC).