במדריך הזה נסביר איך לפרוס את המודל DeepSeek-R1 (deepseek-ai/DeepSeek-R1) ולהשתמש בו ב-Google Kubernetes Engine (GKE) ב-Google Cloud. זהו מודל שילוב מומחים (MoE) עם 671 מיליארד פרמטרים, מתוכם 37 מיליארד פרמטרים פעילים. הפריסה משתמשת ב-Cluster Toolkit, בשני מכונות וירטואליות (VM) מסוג A4 (a4-highgpu-8g) עם מספר מארחים ו-16 מעבדי GPU מסוג NVIDIA B200, ובמסגרת להצגת מודעות vLLM.
בהגדרת הפריסה שמתוארת במדריך הזה, משתמשים ב-Cluster Toolkit כדי להקצות אשכול GKE במצב Standard. באשכול יש שני צומתי a4-highgpu-8g שמחוברים באמצעות רשת GPUDirect Remote Direct Memory Access (RDMA). לאחר מכן, אתם מעבירים את משקלי המודל ל-Cloud Storage ומשתמשים ב-Kubernetes JobSet API וב-Ray כדי להציג את המודל בכל 16 יחידות ה-GPU מסוג NVIDIA B200 עם מקביליות של טנזורים, מקביליות של מומחים ומטמון FP8 KV.
מטרות
- מתקינים את Cluster Toolkit ומקצים אשכול GKE עם כמה מארחים מסוג A4 במצב רגיל.
- מעבירים את משקלי המודל של DeepSeek-R1 לקטגוריה של Cloud Storage.
- פורסים שרת היקשים של vLLM עם מספר מארחים באמצעות JobSet ו-Ray בשני צומתי A4, עם 16 מעבדי NVIDIA B200 GPU בסך הכול.
- שולחים בקשה להשלמת צ'אט לשרת vLLM.
- מריצים עומס עבודה להערכת ביצועים של מילוי בקשות.
- מחיקת המשאבים שנפרסו.
עלויות
במסמך הזה משתמשים ברכיבים הבאים שלGoogle Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את העלויות בהתאם לשימוש הצפוי, אתם יכולים להשתמש במחשבון העלויות.
לפני שמתחילים
מגדירים את הסביבה למדריך:
- מתקינים ומפעילים את Google Cloud CLI, ומתקינים את
kubectl. אם אתם משתמשים ב-Cloud Shell, שני הכלים מותקנים מראש. - אם אתם מריצים את המדריך הזה מתחנת עבודה של Linux או macOS ולא מ-Cloud Shell, התקינו את יחסי התלות הנדרשים של Cluster Toolkit (כמו Terraform ו-Git).
מפעילים את ממשקי ה-API הבאים בפרויקט ב- Google Cloud : Kubernetes Engine API, Compute Engine API, Cloud Storage API, Artifact Registry API ו-Service Usage API.
איך מקבלים טוקן גישה ל-Hugging Face
כדי להשתמש במדריך הזה, צריך טוקן גישה ל-Hugging Face. אפשר להירשם לחשבון בחינם ב-Hugging Face. אחרי שיוצרים חשבון, יוצרים אסימון גישה:
- בדף Welcome to Hugging Face, לוחצים על הדמות של החשבון ובוחרים באפשרות טוקן גישה.
- בדף טוקני גישה, לוחצים על יצירת טוקן חדש.
- בוחרים את סוג הטוקן Read ומזינים שם לטוקן.
- טוקן הגישה שלכם יוצג. שומרים את הטוקן במקום בטוח.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להשלמת המדריך, בקשו מהאדמין להקצות לכם את התפקידים הבאים ב-IAM בפרויקט:
- אדמין ב-Kubernetes Engine (
roles/container.admin) - אדמין ב-Compute (
roles/compute.admin) - אדמין באחסון (
roles/storage.admin) - אדמין IAM בפרויקט (
roles/resourcemanager.projectIamAdmin) - אדמין בחשבון שירות (
roles/iam.serviceAccountAdmin) - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) - Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
הגדרת משתני הסביבה
מגדירים את משתני האימות והסביבה של המדריך:
מגדירים את האימות:
מייצאים את משתני הסביבה שבהם משתמשים במדריך הזה:
מחליפים את מה שכתוב בשדות הבאים:
-
YOUR_PROJECT_ID: מזהה הפרויקט ב-Google Cloud . -
YOUR_REGION: אזור המחשוב שבו נמצאת קיבולת ה-A4 ושבו רוצים לפרוס את האשכול, למשלus-central1. -
YOUR_ZONE: אזור המחשוב שבו נמצאת הקיבולת של A4, למשלus-central1-b. -
YOUR_CLUSTER_NAME: השם של אשכול GKE ושל פריסת Cluster Toolkit. השתמשו בשם באורך של עד 20 תווים, כדי שמזהה חשבון השירות שנוצר למאגר הצמתים (YOUR_CLUSTER_NAME-gke-np-sa) לא יחרוג מהמגבלה של 30 תווים בניהול הזהויות והרשאות הגישה (IAM). -
YOUR_RESERVATION_NAME: השם של ההזמנה שלכם ל-A4, או הנתיב של בלוק ההזמנה המורחב בפורמטRESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK_NAME. -
YOUR_HF_TOKEN: טוקן הגישה שלכם ל-Hugging Face. -
YOUR_GCS_BUCKET: שם ייחודי גלובלי לקטגוריה של Cloud Storage שבה אתם מעבירים את משקלי המודל לשלב ביניים. הסקריפט גם מגדיר אתTERRAFORM_BUCKETלערךYOUR_GCS_BUCKET-tf-stateכדי לאחסן את המצב של Terraform ל-Cluster Toolkit.
הסקריפט גם מגדיר את
CLUSTER_TOOLKIT_VERSIONל-v1.104.0, שמציין את גרסת Cluster Toolkit שצריך להתקין. גרסהv1.104.0של Cluster Toolkit ואילך כוללת אפשרויות מובנות לצריכת קיבולת שלexamples/gke-a4/gke-a4-deployment.yaml. בגרסאות שקודמות ל-v1.104.0, צריך להוסיף את אפשרויות הקיבולת האלה באופן ידני.-
יצירת אשכול GKE
מורידים את Cluster Toolkit ומקצים אשכול GKE במצב רגיל עם שני צומתי a4-highgpu-8g, רשת GPUDirect RDMA ובקר JobSet:
מורידים ומחלצים את חבילת Cluster Toolkit שנוצרה מראש לגרסה שצוינה ב-
CLUSTER_TOOLKIT_VERSION(v1.104.0), משנים את ספריית העבודה לספרייהcluster-toolkitומאמתים את הגרסה הבינארית:אם רוצים, אפשר לראות את הפקודות והדגלים שזמינים ב-Cluster Toolkit:
יוצרים את הקטגוריה של Cloud Storage שבה מאוחסן המצב של Terraform לפריסה של Cluster Toolkit:
יוצרים את קובץ התצורה של הפריסה
examples/gke-a4/gke-a4-deployment.yamlלשני צומתיa4-highgpu-8g:כברירת מחדל, התוכנית
examples/gke-a4/gke-a4.yamlמוגדרת להשתמש בהזמנה ספציפית. אם אין לכם הזמנה ספציפית, אתם יכולים לערוך אתexamples/gke-a4/gke-a4.yamlלפני פריסת האשכול כדי להשתמש באחת מאפשרויות הצריכה הבאות:- קיבולת Spot: ודאו שיש לפרויקט מספיק מכסה של מכונות שניתן להפסיק לפני הזמן בשביל ה-GPU, הדיסקים וה-CPU. בחלק התחתון של
examples/gke-a4/gke-a4.yaml, מסמנים כהערה את הקטע--- Option 1: Specific Reservation ---ומבטלים את הסימון כהערה של הקטע--- Option 4: Spot ---. - מכונות Flex-start VM: ודאו שיש לפרויקט מספיק מכסה של מכונות שניתנות להפסקה לפני הזמן בשביל ה-GPU, הדיסקים וה-CPU. בתחתית הקובץ
examples/gke-a4/gke-a4.yaml, מסמנים כהערה את הקטע--- Option 1: Specific Reservation ---ומבטלים את הסימון כהערה של הקטע--- Option 2: DWS Flex Start ---.
- קיבולת Spot: ודאו שיש לפרויקט מספיק מכסה של מכונות שניתן להפסיק לפני הזמן בשביל ה-GPU, הדיסקים וה-CPU. בחלק התחתון של
פורסים את אשכול GKE באמצעות הפקודה
gcluster deploy:יצירת האשכול נמשכת בערך 30 עד 45 דקות. אם מריצים את
./gcluster deployבלי הדגל--auto-approve, כדי להחיל את השינויים המוצעים צריך להזיןaכשמוצגת בקשה לעשות זאת. בסיום הפריסה, הפלט מסתיים בהודעה שדומה לזו:Apply complete! Resources: 80 added, 0 changed, 0 destroyed.מגדירים את פרטי הכניסה של
kubectlכדי לתקשר עם האשכול:
העברת משקלי המודל ל-Cloud Storage
מורידים את המשקלים של DeepSeek-R1 ל-SSD המקומי של אחד מצומתי A4, ומעבירים אותם לקטגוריה של Cloud Storage כדי להעביר אותם בסטרימינג מהר בין הצמתים:
מורידים את קובצי המניפסט של Kubernetes בשביל משימת הורדת המודל, שרת ההסקה של vLLM וקבוצות ה-Pod להשוואה:
יוצרים קטגוריה ב-Cloud Storage עם הרשאות גישה אחידות ברמת הקטגוריה כדי לאחסן את משקלי המודל:
נותנים הרשאות IAM בקטגוריה לחשבון השירות שמוגדר כברירת מחדל ב-Kubernetes, לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine ולחשבון השירות של מאגר הצמתים באשכול (
${CLUSTER_NAME}-gke-np-sa):הרשאות ה-IAM שניתנות על ידי הסקריפט הקודם כוללות את התפקיד "קריאה בקטגוריה באחסון מדור קודם" (
roles/storage.legacyBucketReader), שנדרש ל---load-format runai_streamer.יוצרים סוד של Kubernetes בשם
hf-secretכדי לאחסן את טוקן הגישה של Hugging Face:בודקים את המניפסט
download_model.yaml, או יוצרים את הקובץ באופן מקומי אם לא הורדתם אותו קודם:מחליפים את שם הקטגוריה של Cloud Storage במניפסט
download_model.yamlומפעילים את משימת הורדת המודל:מחכים שה-Pod של ההורדה יתחיל, ואז מעבירים בסטרימינג את יומני המשימה:
הורדת המודל ל-SSD המקומי של NVMe בצומת והעלאת המשקלים לקטגוריה של Cloud Storage נמשכות כ-30 עד 40 דקות.
אחרי שהמשימה מסתיימת, מוודאים שכל 163 המקטעים של
.safetensorsנמצאים בקטגוריה של Cloud Storage:מוחקים את משימת ההעברה שהושלמה:
פריסת שרת vLLM עם כמה מארחים
המניפסט של עומס העבודה (deepseek_r1_server.yaml) מגדיר שירות ClusterIP (vllm-r1-leader) ו-Kubernetes JobSet (vllm-r1) שמתאמים את ההצגה בכמה מארחים בשני הצמתים של a4-highgpu-8g:
- Leader (
leader): מריץ רפליקה אחת בצומת A4 עם שמונה מעבדי NVIDIA B200 GPU, מקבל את סביבת NCCL/gIB (/usr/local/gib/scripts/set_nccl_env.sh), מפעיל את צומת ה-head של Ray ביציאה6379לאשכול עם שני צמתים, ומפעיל אתvllm serveביציאת HTTP8080. השרת מעביר משקלים בסטרימינג ישירות מ-gs://$MODEL_BUCKET/DeepSeek-R1באמצעות--load-format runai_streamer, וטוען את ה-tokenizer מנפח ה-Cloud Storage FUSE שנטען ב-/models/DeepSeek-R1. הוא פועל עם--tensor-parallel-size 16,--pipeline-parallel-size 1,--distributed-executor-backend ray,--enable-expert-parallel,--kv-cache-dtype fp8_e4m3,--async-schedulingותרשימי CUDA (FULL_AND_PIECEWISE). - Worker (
worker): מריץ רפליקה אחת ללא ממשק משתמש בצומת A4 השני עם שמונה מעבדי NVIDIA B200 GPU, מגדיר את NCCL/gIB ומצטרף לאשכול Ray של ה-Leader ב-vllm-r1-leader:6379.
פורסים את שרת ה-vLLM עם כמה מארחים ועוקבים אחריו:
בודקים את המניפסט
deepseek_r1_server.yaml, או יוצרים את הקובץ באופן מקומי אם לא הורדתם אותו קודם:כדי להרחיב את הפריסה הזו למארחים נוספים, צריך לעדכן את הפרמטרים בקובץ
deepseek_r1_server.yaml. לדוגמה, כדי להגדיל את קנה המידה ל-4 צומתי A4, עם 32 יחידות GPU מסוג NVIDIA B200 בסך הכול, מגדירים אתreplicas: 3ב-Job המשוכפלworkerומעדכנים את הארגומנטים של ה-leader באופן הבא:--ray_cluster_size=4--tensor-parallel-size=16--pipeline-parallel-size=2
מחליפים את
deepseek_r1_server.yamlבשם הקטגוריה של Cloud Storage ומחילים את המניפסט על האשכול:עוקבים אחרי היומנים של ה-Pod הראשי וה-Pod המשני עד שהשרת מסיים את ההפעלה:
מכיוון ש-
kubectl logs -fמעביר יומנים בחזית, צריך להריץ את הפקודה worker logs בסשן נפרד של הטרמינל אם רוצים לעקוב אחרי שני ה-Pods בו-זמנית. כדי להפסיק את הסטרימינג של היומנים בכל שלב, מקישים על Control+C.השלבים הראשוניים של העברת המשקלים, טעינת המודל וצילום תרשים CUDA נמשכים בערך 15 עד 20 דקות. לפני ששולחים בקשות, ממתינים עד שיופיעו ההודעות הבאות ביומני הפלט של ה-Pod הראשי:
(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
שליחת בקשות להסקת מסקנות
שולחים בקשה להשלמת צ'אט לשרת ה-vLLM שנפרס:
מעבירים את היציאה המקומית
8080לשירותvllm-r1-leaderברקע:שולחים בקשה להשלמת צ'אט לנקודת הקצה (endpoint) של
/v1/chat/completions:
הרצת עומסי עבודה להערכת ביצועים
מריצים בדיקת ביצועים של שרת DeepSeek-R1 שנפרס באמצעות vllm bench serve עם הגדרה של 8,192 טוקנים של קלט ו-1,024 טוקנים של פלט (8k/1k):
בודקים את המניפסט
deepseek_r1_8k_1k.yaml, או יוצרים את הקובץ באופן מקומי אם לא הורדתם אותו קודם:במניפסט מצוינים 8,192 טוקנים של קלט, 1,024 טוקנים של פלט, 1,280 הנחיות ורמת בו-זמניות מקסימלית של 112.
מחילים את המניפסט
deepseek_r1_8k_1k.yaml:מחכים שה-Pod של
vllm-bench-8k-1kיתחיל, ואז מעבירים בסטרימינג את יומני ההשוואה:הבדיקה נמשכת כ-15 דקות. בסיום הבדיקה, חפשו פלט שמכיל מדדים כמו:
Output token throughputTotal token throughputTTFTTPOT
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה, אתם צריכים למחוק את עומסי העבודה ב-Kubernetes, את אשכול GKE ואת הקטגוריות של Cloud Storage:
מוחקים את הפודים של נקודות ההשוואה, את ה-JobSet והשירות של שרת ה-vLLM, את משימת הורדת המודל ואת הסוד של Hugging Face:
מוחקים את הקטגוריה של Cloud Storage שבה מאוחסנים משקלי המודל שהועלו:
בספרייה
cluster-toolkit, משמידים את אשכול GKE ואת התשתית שמשויכת אליו באמצעות הפקודהgcluster destroy:מוחקים את הקטגוריה של Cloud Storage שבה מאוחסן המצב של Terraform: