הקצאת משאבים דינמית היא ממשק API של Kubernetes שמאפשר לבקש ולשתף משאבים, כמו מעבדים גרפיים, בין Pods וקונטיינרים באשכולות של Google Distributed Cloud במחשב פיזי. מנהלי התקנים של צד שלישי מנהלים את המכשירים האלה, ו-Kubernetes מקצה אותם באופן דינמי, בדומה לנפחי אחסון. עומסי העבודה של ה-AI לא צריכים לטרגט צמתים ספציפיים או לבקש את המספר המדויק של המכשירים המחוברים. במאמר הזה מוסבר איך להגדיר את עומסי העבודה של ה-GPU כך שישתמשו בהקצאת משאבים דינמית.
לפני שמתחילים
לפני שמגדירים את עומסי העבודה ב-GPU לשימוש בהקצאת משאבים דינמית, צריך לוודא שהתנאים המוקדמים הבאים מתקיימים:
- אשכול ה-bare metal שלכם הוא מגרסה 1.33.0 ואילך.
- מערכת ההפעלה היא Ubuntu 22.04 או Red Hat Enterprise Linux (RHEL) 9.4.
- עדכנתם את האשכול כדי להפעיל הקצאת משאבים דינמית, כמו שמתואר במאמר הפעלת הקצאת משאבים דינמית.
- יש לכם לפחות מכונת צומת אחת עם GPU מצורף ומנהל התקן של NVIDIA GPU מותקן. מידע נוסף מופיע במאמר התקנה או הסרה של NVIDIA GPU Operator שכלול בחבילה.
- אם אתם משתמשים במפעיל ה-GPU של NVIDIA שמגיע בחבילה, גרסה 1.33.0 ואילך מפעילה את Container Device Interface (CDI) כברירת מחדל.
אם אתם משתמשים במפעיל GPU שהותקן ידנית, ודאו ש-CDI מופעל ב-
ClusterPolicy. - פעלתם לפי ההוראות במאמר מנהל ההתקן של NVIDIA DRA למעבדי GPU כדי להתקין את מנהל ההתקן של 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שנוצר בשלב הקודם.בדוגמאות הבאות של עומסי עבודה אפשר לראות איך להפנות ל-
ResourceClaimבשםgpu-claimבמרחב השמותdra-test. הקונטיינרים ב-Pod שלpod1הם דוגמאות של ארכיטקטורת מכשירים מאוחדת (CUDA) של NVIDIA, שמיועדות להרצת עומסי עבודה של CUDA במעבדי ה-GPU. כשה-Pod שלpod1מסתיים בהצלחה, זה אומר שהיכולת של הקצאת משאבים דינמית פועלת כמו שצריך, ושהקצאת המשאבים הדינמית מוכנה לנהל את משאבי ה-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 עם גרסה נתמכת של מפעיל ה-GPU של NVIDIA, ממשק המכשיר של הקונטיינר (CDI) מטפל בהזרקת המכשיר ובתיוג SELinux באופן אוטומטי. לא צריך להגדיר ידנית את מדיניות SELinux או להגדיר את pod
securityContext.התכונה הזו משתמשת בקבוצת ה-API
resource.k8s.io/v1beta1, שהיא שונה מקבוצת ה-API של Kubernetes בקוד פתוח לתכונה הזו,resource.k8s.io/v1. קבוצת ה-API בקוד פתוחv1מספקת יותר תכונות ויציבות טובה יותר מקבוצת ה-APIv1beta1.
המאמרים הבאים
- במסמכי התיעוד של Kubernetes תוכלו לקרוא מידע נוסף על הקצאת משאבים דינמית.
- איך מפעילים מודלים של LLM של צד שלישי ב-Bare Metal