בהקצאת משאבים דינמית, מערכת Kubernetes מתזמנת את ה-Pods על סמך הגדרת המכשיר שאליו יש הפניה. מפעילים של אפליקציות לא צריכים לבחור צמתים ספציפיים בעומסי העבודה שלהם, ולא צריכים לוודא שכל Pod מבקש בדיוק את מספר המכשירים שמצורפים לצמתים האלה. התהליך הזה דומה להקצאת נפחי אחסון.
היכולת הזו עוזרת לכם להריץ עומסי עבודה של AI על ידי הקצאה דינמית ומדויקת של משאבי ה-GPU באשכולות ה-Bare Metal, וכך לשפר את ניצול המשאבים והביצועים של עומסי עבודה תובעניים.
הדף הזה מיועד לאדמינים, לארכיטקטים ולמפעילים שמנהלים את מחזור החיים של תשתית הטכנולוגיה הבסיסית. מידע נוסף על תפקידים נפוצים ודוגמאות למשימות שאנחנו מתייחסים אליהן בתוכן זמין במאמר תפקידי משתמשים ומשימות נפוצים ב-GKE. Google Cloud
לפני שמתחילים
לפני שמגדירים את עומסי העבודה של ה-GPU לשימוש בהקצאת משאבים דינמית, צריך לוודא שמתקיימים התנאים המוקדמים הבאים:
- הגרסה של אשכול ה-bare metal היא 1.33.0 ואילך.
- מערכת ההפעלה שלכם היא Ubuntu 22.04 או Red Hat Enterprise Linux (RHEL) 9.4.
- עדכנתם את האשכול כדי להפעיל הקצאת משאבים דינמית, כפי שמתואר במאמר הפעלת הקצאת משאבים דינמית.
- יש לכם לפחות מכונת צומת אחת עם GPU מצורף ומנהל ההתקן (דרייבר) של NVIDIA GPU מותקן. מידע נוסף זמין במאמר בנושא התקנה או הסרה של NVIDIA GPU Operator.
- אם אתם משתמשים באופרטור NVIDIA GPU שצורף, גרסה 1.33.0 ואילך מאפשרת את Container Device Interface (CDI) כברירת מחדל.
אם אתם משתמשים באופרטור GPU שהותקן באופן ידני, צריך לוודא ש-CDI מופעל
ב-
ClusterPolicy. - פעלתם לפי ההוראות במאמר NVIDIA DRA Driver for GPUs כדי להתקין את הדרייבר של NVIDIA DRA בכל הצמתים שמחוברים ל-GPU.
יצירת עומסי עבודה של GPU שמשתמשים בהקצאת משאבים דינמית
כדי שעומסי העבודה של ה-GPU יוכלו לנצל את היתרונות של הקצאת משאבים דינמית ולבקש יחידות GPU, הם צריכים להיות במרחב שמות משותף עם ResourceClaim שמתאר את הבקשה להקצאת מכשיר GPU. עומסי העבודה צריכים להפנות אל ResourceClaim כדי שמערכת Kubernetes תקצה משאבי GPU.
בשלבים הבאים מוגדרת סביבה שבה עומסי העבודה משתמשים בהקצאת משאבים דינמית כדי לבקש משאבי GPU:
כדי ליצור משאבים שקשורים להקצאת משאבים דינמית, יוצרים
Namespaceחדש באשכול:cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Namespace metadata: name: NAMESPACE_NAME EOFמחליפים את מה שכתוב בשדות הבאים:
CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig של אשכול המשתמשים.
NAMESPACE_NAMEבשם של מרחב השמות להקצאת משאבים דינמית.
יוצרים
ResourceClaimכדי לתאר את הבקשה לגישה ל-GPU:cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: resource.k8s.io/v1beta1 kind: ResourceClaim metadata: namespace: NAMESPACE_NAME name: RESOURCE_CLAIM_NAME spec: devices: requests: - name: gpu deviceClassName: gpu.nvidia.com EOFמחליפים את
RESOURCE_CLAIM_NAMEבשם של בקשת המשאבים שלכם לבקשות GPU.יוצרים עומסי עבודה שמפנים אל
ResourceClaimשנוצר בשלב הקודם.בדוגמאות הבאות של עומסי עבודה אפשר לראות איך מפנים אל
ResourceClaimgpu-claimבשםdra-test. הקונטיינרים ב-Podpod1הם דוגמאות של CUDA (ארכיטקטורת מכשיר מאוחדת לחישוב) של NVIDIA שנועדו להריץ עומסי עבודה של CUDA במעבדי ה-GPU. כשה-Podpod1מסתיים בהצלחה, זה מצביע על כך שהיכולת של הקצאת משאבים דינמית פועלת בצורה תקינה, ושהקצאת משאבים דינמית מוכנה לנהל משאבי GPU באשכול.Ubuntu
משתמשים בפקודה הבאה כדי להחיל את המניפסט על האשכול:
cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Pod metadata: name: pod1 namespace: dra-test spec: restartPolicy: OnFailure resourceClaims: - name: gpu resourceClaimName: gpu-claim containers: - name: ctr0 image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0 resources: claims: - name: gpu - name: ctr1 image: nvcr.io/nvidia/k8s/cuda-sample:devicequery resources: claims: - name: gpu EOF
RHEL
משתמשים בפקודה הבאה כדי להחיל את המניפסט על האשכול:
cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Pod metadata: name: pod1 namespace: dra-test spec: restartPolicy: OnFailure resourceClaims: - name: gpu resourceClaimName: gpu-claim containers: - name: ctr0 image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0 resources: claims: - name: gpu - name: ctr1 image: nvcr.io/nvidia/k8s/cuda-sample:devicequery resources: claims: - name: gpu EOF
מגבלות
כשמשתמשים בהקצאת משאבים דינמית, חשוב להביא בחשבון את המגבלות הבאות:
כשמשתמשים במערכת הפעלה RHEL עם גרסה נתמכת של NVIDIA GPU operator, Container Device Interface (CDI) מטפל בהחדרת מכשירים ובתיוג SELinux באופן אוטומטי. לא נדרש להשתמש בהגדרה ידנית של מדיניות SELinux או להגדיר את pod
securityContext.התכונה הזו משתמשת בקבוצת ה-API
resource.k8s.io/v1beta1, ששונה מקבוצת ה-API של Kubernetes בקוד פתוח עבור התכונה הזו,resource.k8s.io/v1. קבוצת ה-API שלv1קוד פתוח מספקת יותר תכונות ורמת יציבות טובה יותר מקבוצת ה-API שלv1beta1.
המאמרים הבאים
- מידע נוסף על הקצאה דינמית של משאבים זמין במאמרי העזרה של Kubernetes.
- הדרכה: איך להכניס לשימוש בסביבת הייצור מודלים גדולים של שפה (LLM) של צד שלישי בשרת Bare Metal