במדריך הזה מוסבר איך לפרוס ולהציג את Llama 3.1 405B (nvidia/Llama-3.1-405B-Instruct-FP8), מודל עם 405 מיליארד פרמטרים שעבר כוונון לפי הוראות וקוונטיזציה ל-FP8, ב-Google Kubernetes Engine (GKE) ב- Google Cloud. הפריסה משתמשת ב-Cluster Toolkit, בשתי מכונות וירטואליות (VM) מסוג A4 (a4-highgpu-8g) עם 16 מעבדי NVIDIA B200 GPU, ב-NVIDIA Dynamo וב-SGLang serving framework עם הפרדה של prefill-decode (PD) במארח יחיד.
בהגדרת הפריסה שמתוארת במדריך הזה, משתמשים ב-Cluster Toolkit כדי להקצות אשכול GKE במצב Standard. האשכול מכיל שני צומתי a4-highgpu-8g שמחוברים באמצעות רשת GPUDirect Remote Direct Memory Access (RDMA). לאחר מכן מתקינים את KAI Scheduler ואת פלטפורמת NVIDIA Dynamo עם תזמון קבוצתי של Grove.
בשלב האחרון, פורסים משאב מותאם אישית של DynamoGraphDeployment שמפריד בין מילוי מראש לבין פענוח בשני וורקרים עם מארח יחיד ו-8 מעבדי GPU, עם מקביליות של טנזורים ומטמון KV של FP8.
מטרות
- מתקינים את Cluster Toolkit ומקצים אשכול GKE עם שני צמתים מסוג A4 במצב רגיל.
- מתקינים באשכול את פלטפורמת KAI Scheduler ו-NVIDIA Dynamo עם תזמון Grove gang.
- פריסת שרת הסקת מסקנות SGLang עם הפרדת PD, עם וורקר אחד למילוי מראש ב-A4 במארח יחיד ווורקר אחד לפענוח ב-A4 במארח יחיד.
- שליחת בקשה להשלמת צ'אט לנתב החזיתי של Dynamo.
- מריצים עומס עבודה להערכת ביצועים של מילוי בקשות.
- מחיקת המשאבים שנפרסו.
עלויות
במסמך הזה משתמשים ברכיבים הבאים שלGoogle Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את העלויות בהתאם לשימוש הצפוי, אתם יכולים להשתמש במחשבון העלויות.
לפני שמתחילים
מגדירים את הסביבה למדריך:
- מתקינים ומאתחלים את Google Cloud CLI, ומתקינים את
kubectlואת Helm (גרסה 3.10 ואילך). אם אתם משתמשים ב-Cloud Shell, הכלים האלה מותקנים מראש. - אם אתם מריצים את המדריך הזה מתחנת עבודה של Linux או macOS ולא מ-Cloud Shell, תצטרכו להתקין את יחסי התלות הנדרשים של Cluster Toolkit, כמו Terraform ו-Git.
מפעילים את ממשקי ה-API הבאים בפרויקט ב- Google Cloud : Kubernetes Engine API, Compute Engine API, Cloud Storage API, ניהול זהויות והרשאות גישה (IAM) API, Cloud Resource Manager 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. -
YOUR_BUCKET_NAME: שם ייחודי גלובלי לקטגוריה של Cloud Storage שבה מאוחסן המצב של Terraform ל-Cluster Toolkit. -
YOUR_HF_TOKEN: טוקן הגישה שלכם ל-Hugging Face.
יצירת אשכול GKE
מורידים את Cluster Toolkit ומקצים אשכול GKE במצב רגיל עם שני צומתי a4-highgpu-8g, רשת GPUDirect RDMA ותמיכה ב-DRA:
נכנסים ל-Google Cloud CLI ויוצרים Application Default Credentials ל-Terraform:
מורידים ומחלצים את חבילת Cluster Toolkit שנוצרה מראש לגרסה שצוינה ב-
CLUSTER_TOOLKIT_VERSION(v1.104.0):אם אתם מריצים את הפקודה הזו ב-macOS או בתחנת עבודה של
arm64, צריך להגדיר אתOS="mac"או אתARCH="arm64"בהתאם לפלטפורמה.כדי לאחסן את מצב Terraform של פריסת Cluster Toolkit, צריך ליצור קטגוריה של Cloud Storage שמופעל בה ניהול גרסאות של אובייקטים:
יוצרים את קובץ התצורה
cluster-toolkit/examples/gke-a4/gke-a4-deployment.yamlלפריסה של שני צומתיa4-highgpu-8g:כברירת מחדל, קובץ הפריסה מוגדר לצרוך הזמנה ספציפית. אם אין לכם מקום שמור ספציפי, לפני פריסת האשכול אתם יכולים לעדכן את
cluster-toolkit/examples/gke-a4/gke-a4-deployment.yamlכדי להשתמש באפשרות צריכה חלופית, כמו VM במודל Spot או Flex-start VM. הוראות להגדרה מופיעות במאמר אפשרויות צריכה של GKE.עוברים לספרייה
cluster-toolkit, פורסים את אשכול GKE באמצעות הפקודהgcluster deployוחוזרים לספריית העבודה:יצירת האשכול נמשכת כ-20 עד 30 דקות. אם מריצים את
./gcluster deployבלי הדגל--auto-approve, כדי להחיל את השינויים המוצעים צריך להזיןaכשמוצגת בקשה לעשות זאת.מגדירים את פרטי הכניסה של
kubectlכדי לתקשר עם האשכול:
התקנת KAI Scheduler ו-NVIDIA Dynamo
מכינים את האשכול על ידי יצירת סוד של Hugging Face והתקנת KAI Scheduler ופלטפורמת NVIDIA Dynamo עם תזמון קבוצתי של Grove:
יוצרים סוד של Kubernetes בשם
hf-secretכדי לאחסן את טוקן הגישה של Hugging Face:מורידים את תרשים ה-Helm של פלטפורמת NVIDIA Dynamo (
v1.5.0), מתקינים את KAI Scheduler ומתקינים את פלטפורמת Dynamo עם Grove:
פריסת שרת SGLang מבוזר במארח יחיד
מניפסט עומס העבודה (llama3.1-405b-singlehost-a4.yaml) מגדיר ResourceClaimTemplate של Kubernetes (all-mrdma), שמקצה את מכשירי ה-RDMA עם multi-NIC של הצומת (mrdma.google.com) באמצעות DRA, ו-DynamoGraphDeployment של NVIDIA Dynamo (llama3-405b-a4-disagg) עם תזמון קבוצתי של Grove. הפריסה כוללת את הרכיבים הבאים:
- רכיב קצה קדמי (
Frontend): מריץ רפליקה אחת של נתב שמקבלת בקשות מהלקוח, מגלה את ה-workers הרשומים למילוי מראש ולפענוח, ומתאמת את הניתוב של הבקשות המפורקות. - Prefill worker (
Prefill): מריץ וורקר של מארח יחיד בצומתa4-highgpu-8gאחד עם שמונה מעבדי NVIDIA B200 GPU. בזמן ההפעלה, ה-Pod מקבל את סביבת NCCL/gIB, מוריד את נקודת הבדיקהnvidia/Llama-3.1-405B-Instruct-FP8מ-Hugging Face Hub ל-Local NVMe SSD של הצומת, ומפעיל אתpython3 -m dynamo.sglangב---disaggregation-mode prefillעם הדגלים הבאים:--tensor-parallel-size 8--kv-cache-dtype fp8_e4m3--context-length 16384--mem-fraction-static 0.85
- Decode worker (
Decode): מריץ וורקר של מארח יחיד בצומת השני שלa4-highgpu-8gעם שמונה מעבדי GPU מסוג NVIDIA B200. בזמן ההפעלה, ה-Pod שומר במטמון את משקלי המודל ב-SSD המקומי של NVMe של הצומת, ומפעיל אתpython3 -m dynamo.sglangב---disaggregation-mode decodeעם הדגלים הבאים:--tensor-parallel-size 8--kv-cache-dtype fp8_e4m3--context-length 16384--mem-fraction-static 0.85
פורסים את שרת ההסקה המבוזר ועוקבים אחריו:
מורידים את מניפסט עומס העבודה של
llama3.1-405b-singlehost-a4.yaml:אפשר גם ליצור קובץ בשם
llama3.1-405b-singlehost-a4.yamlעם התוכן הבא:מחילים את המניפסט של עומס העבודה על האשכול:
כדי לעקוב אחרי הורדת המשקלים וההפעלה של השרת, מציגים את ה-Pods באשכול ומזרימים את היומנים של ה-Pods למילוי מראש ולפענוח:
מחליפים את
YOUR_POD_NAMEבשם של ה-Pod למילוי מראש או ה-Pod לפענוח מהפלט שלkubectl get pods.בהפעלה הראשונה, נדרשות כ-10 עד 20 דקות כדי להוריד את משקלי המודל 405B FP8 ולאתחל את שרתי SGLang. לפני ששולחים בקשות, מחכים עד שבעמודה
READYשלkubectl get podsיופיע הערך1/1לפודים של ממשק המשתמש, המילוי מראש והפענוח:NAME READY STATUS RESTARTS AGE llama3-405b-a4-disagg-0-decode-tgl7q 1/1 Running 0 15m llama3-405b-a4-disagg-0-frontend-wrxq5 1/1 Running 0 15m llama3-405b-a4-disagg-0-prefill-67h5s 1/1 Running 0 15m
שליחת בקשות להסקת מסקנות
שולחים בקשה להשלמת צ'אט לשירות Llama 3.1 405B שנפרס:
מעבירים את היציאה המקומית
8000לשירותllama3-405b-a4-disagg-frontend:משאירים את העברה ליציאה אחרת פועלת בסשן הטרמינל הזה, או מריצים את הפקודה ברקע.
בסשן שני של הטרמינל, שולחים בקשה להשלמת צ'אט לנקודת הקצה (endpoint) של
/v1/chat/completions:
הרצת עומס עבודה להערכת ביצועים
מריצים את sglang.bench_serving כדי לבדוק את הביצועים של שרת Llama 3.1 405B שנפרס מ-Dynamo frontend Pod. מגדירים את ההערכה ל-1,024 טוקנים של קלט, 1,024 טוקנים של פלט (1k/1k), 2,048 הנחיות ו-512 בקשות בו-זמניות לכל היותר:
אחרי שהבדיקה מסתיימת, מחפשים פלט שמכיל מדדים כמו:
Output token throughputTotal token throughputTTFTTPOT
הסרת המשאבים
כדי להימנע מחיובים שוטפים נוספים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה, אתם צריכים למחוק את עומסי העבודה ב-Kubernetes, את אשכול GKE ואת הקטגוריה של Cloud Storage:
מוחקים את המשאבים DynamoGraphDeployment ו-ResourceClaimTemplate:
מסירים את גרסאות ה-Helm של פלטפורמת NVIDIA Dynamo ושל KAI Scheduler:
מוחקים את הסוד של Hugging Face ב-Kubernetes:
בספרייה
cluster-toolkit, משמידים את אשכול GKE ואת התשתית שמשויכת אליו באמצעות הפקודהgcluster destroy:כדי למחוק את הקטגוריה של Cloud Storage שבה מאוחסן המצב של Terraform, משתמשים בפקודה
gcloud storage rm:gcloud storage rm --recursive "gs://${GCS_BUCKET}"