אימון מודל עם יחידות GPU במצב רגיל של GKE
במדריך למתחילים הזה נסביר איך פורסים מודל אימון עם מעבדי GPU ב-Google Kubernetes Engine (GKE) ומאחסנים את התחזיות ב-Cloud Storage. במדריך הזה משתמשים במודל TensorFlow ובאשכולות GKE Standard. אפשר גם להריץ את עומסי העבודה האלה באשכולות של Autopilot עם פחות שלבי הגדרה. הוראות מפורטות זמינות במאמר אימון מודל באמצעות GPU במצב GKE Autopilot.
המסמך הזה מיועד לאדמינים של GKE שיש להם אשכולות רגילים קיימים ורוצים להריץ עומסי עבודה של GPU בפעם הראשונה.
לפני שמתחילים
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.
-
Verify that billing is enabled for your Cloud de Confiance project.
Enable the Kubernetes Engine and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
במסוף Cloud de Confiance , מפעילים את Cloud Shell.
בחלק התחתון של Cloud de Confiance המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות לאימון מודל ב-GPU, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
-
ניהול אשכולות GKE:
Kubernetes Engine Admin (
roles/container.admin) -
ניהול קטגוריות של Cloud Storage:
אדמין אחסון (
roles/storage.admin) -
הקצאת תפקידי IAM בפרויקט:
אדמין IAM בפרויקט (
roles/resourcemanager.projectIamAdmin) -
יצירה והקצאה של תפקידים בחשבונות שירות ב-IAM:
אדמין של חשבון שירות (
roles/iam.serviceAccountAdmin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
שכפול המאגר לדוגמה
ב-Cloud Shell, מריצים את הפקודה הבאה:
git clone https://github.com/GoogleCloudPlatform/ai-on-gke/ ai-on-gke
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
יצירת אשכול במצב רגיל ומאגר צמתים של GPU
אפשר להשתמש ב-Cloud Shell כדי:
יוצרים אשכול Standard שמשתמש באיחוד זהויות של עומסי עבודה ל-GKE ומתקינים את הדרייבר של Cloud Storage FUSE:
gcloud container clusters create gke-gpu-cluster \ --addons GcsFuseCsiDriver \ --location=us-central1 \ --num-nodes=1 \ --workload-pool=PROJECT_ID.s3ns.svc.id.googמחליפים את
PROJECT_IDבמזהה הפרויקט ב- Cloud de Confiance.יצירת האשכול עשויה להימשך כמה דקות.
יוצרים מאגר צמתים של GPU:
gcloud container node-pools create gke-gpu-pool-1 \ --accelerator=type=nvidia-tesla-t4,count=1,gpu-driver-version=default \ --machine-type=n1-standard-16 --num-nodes=1 \ --location=us-central1 \ --cluster=gke-gpu-cluster
יצירת קטגוריה של Cloud Storage
נכנסים לדף Create a bucket במסוף Cloud de Confiance :
בשדה Name your bucket (שם הקטגוריה), מזינים את השם הבא:
PROJECT_ID-gke-gpu-bucketלוחצים על Continue.
בקטע Location type, בוחרים באפשרות Region.
ברשימה אזור בוחרים באפשרות
us-central1 (Iowa)ולוחצים על המשך.בקטע Choose a storage class for your data (בחירת סוג אחסון לנתונים), לוחצים על Continue (המשך).
בקטע Choose how to control access to objects, בוחרים באפשרות Uniform בשביל בקרת גישה.
לוחצים על יצירה.
בתיבת הדו-שיח Public access will be prevented, מוודאים שתיבת הסימון Enforce public access prevention on this bucket מסומנת, ולוחצים על Confirm.
הגדרת גישה לדלי באמצעות איחוד זהויות של עומסי עבודה ל-GKE
כדי לאפשר ל-cluster לגשת לקטגוריה של Cloud Storage, מבצעים את הפעולות הבאות:
- יוצרים Cloud de Confiance חשבון שירות.
- יוצרים ServiceAccount של Kubernetes באשכול.
- מקשרים את חשבון השירות של Kubernetes לחשבון השירות Cloud de Confiance .
יצירה של Cloud de Confiance חשבון שירות
במסוף Cloud de Confiance , נכנסים לדף יצירת חשבון שירות:
בשדה מזהה חשבון שירות, מזינים
gke-ai-sa.לוחצים על Create and continue.
ברשימה Role בוחרים בתפקיד Cloud Storage > Storage Insights Collector Service.
לוחצים על הוספת תפקיד נוסף.
ברשימה Select a role, בוחרים בתפקיד Cloud Storage > Storage Object Admin.
לוחצים על המשך ואז על סיום.
יצירת חשבון שירות של Kubernetes באשכול
ב-Cloud Shell, מבצעים את הפעולות הבאות:
יוצרים מרחב שמות של Kubernetes:
kubectl create namespace gke-ai-namespaceיוצרים חשבון שירות של Kubernetes במרחב השמות:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
קישור חשבון השירות של Kubernetes לחשבון השירות Cloud de Confiance
ב-Cloud Shell, מריצים את הפקודות הבאות:
מוסיפים קישור IAM ל Cloud de Confiance חשבון השירות:
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.s3ns.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"הדגל
--memberמספק את הזהות המלאה של חשבון השירות ב-Kubernetes ב- Cloud de Confiance.הוספת הערה ל-ServiceAccount ב-Kubernetes:
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com
בדיקה אם ל-Pods יש גישה לקטגוריה של Cloud Storage
ב-Cloud Shell, יוצרים את משתני הסביבה הבאים:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucketמחליפים את
PROJECT_IDבמזהה הפרויקט ב- Cloud de Confiance.יוצרים Pod עם קונטיינר TensorFlow:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-ai-namespace apply -f -הפקודה הזו מחליפה את משתני הסביבה שיצרתם בהפניות התואמות במניפסט. אפשר גם לפתוח את המניפסט בכלי לעריכת טקסט ולהחליף את
$K8S_SA_NAMEואת$BUCKET_NAMEבערכים המתאימים.יוצרים קובץ לדוגמה בקטגוריה:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucketמחכים שה-Pod יהיה מוכן:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-ai-namespace --timeout=180sכשה-Pod מוכן, הפלט הוא:
pod/test-tensorflow-pod condition metפותחים מעטפת במאגר TensorFlow:
kubectl -n gke-ai-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bashמנסים לקרוא את קובץ הדוגמה שיצרתם:
ls /dataהפלט מציג את קובץ הדוגמה.
בודקים את היומנים כדי לזהות את ה-GPU שמצורף ל-Pod:
python3 -m pip install 'tensorflow[and-cuda]' python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"הפלט מציג את ה-GPU שמצורף ל-Pod, באופן דומה לזה:
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')יוצאים מהקונטיינר:
exitמוחקים את ה-Pod לדוגמה:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-namespace
אימון וחיזוי באמצעות מערך הנתונים MNIST
בקטע הזה מריצים עומס עבודה של אימון על מערך הנתונים לדוגמה MNIST.
מעתיקים את הנתונים לדוגמה לקטגוריה של Cloud Storage:
gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursiveיוצרים את משתני הסביבה הבאים:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucketבודקים את משימת האימון:
פורסים את משימת האימון:
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-ai-namespace apply -f -הפקודה הזו מחליפה את משתני הסביבה שיצרתם בהפניות התואמות במניפסט. אפשר גם לפתוח את המניפסט בכלי לעריכת טקסט ולהחליף את
$K8S_SA_NAMEואת$BUCKET_NAMEבערכים המתאימים.מחכים עד שהסטטוס של העבודה יהיה
Completed:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-training-job --timeout=180sהפלט אמור להיראות כך:
job.batch/mnist-training-job condition metבודקים את היומנים מהקונטיינר של TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-ai-namespaceבפלט מוצגים האירועים הבאים:
- התקנת חבילות Python נדרשות
- הורדת מערך הנתונים MNIST
- אימון המודל באמצעות GPU
- שמירת המודל
- הערכת המודל
... Epoch 12/12 927/938 [============================>.] - ETA: 0s - loss: 0.0188 - accuracy: 0.9954 Learning rate for epoch 12 is 9.999999747378752e-06 938/938 [==============================] - 5s 6ms/step - loss: 0.0187 - accuracy: 0.9954 - lr: 1.0000e-05 157/157 [==============================] - 1s 4ms/step - loss: 0.0424 - accuracy: 0.9861 Eval loss: 0.04236088693141937, Eval accuracy: 0.9861000180244446 Training finished. Model savedמחיקת עומס העבודה של האימון:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
פריסת עומס עבודה של הסקה
בקטע הזה תפרסו עומס עבודה של היקשים שמקבל מערך נתונים לדוגמה כקלט ומחזיר חיזויים.
מעתיקים את התמונות לחיזוי לקטגוריה:
gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursiveבודקים את עומס העבודה של ההסקה:
פריסת עומס העבודה של ההסקה:
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-ai-namespace apply -f -הפקודה הזו מחליפה את משתני הסביבה שיצרתם בהפניות התואמות במניפסט. אפשר גם לפתוח את המניפסט בכלי לעריכת טקסט ולהחליף את
$K8S_SA_NAMEואת$BUCKET_NAMEבערכים המתאימים.מחכים עד שהסטטוס של העבודה יהיה
Completed:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180sהפלט אמור להיראות כך:
job.batch/mnist-batch-prediction-job condition metבודקים את היומנים מהקונטיינר של TensorFlow:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-ai-namespaceהפלט הוא החיזוי לכל תמונה ורמת הסמך של המודל בחיזוי, בדומה למה שמוצג כאן:
Found 10 files belonging to 1 classes. 1/1 [==============================] - 2s 2s/step The image /data/mnist_predict/0.png is the number 0 with a 100.00 percent confidence. The image /data/mnist_predict/1.png is the number 1 with a 99.99 percent confidence. The image /data/mnist_predict/2.png is the number 2 with a 100.00 percent confidence. The image /data/mnist_predict/3.png is the number 3 with a 99.95 percent confidence. The image /data/mnist_predict/4.png is the number 4 with a 100.00 percent confidence. The image /data/mnist_predict/5.png is the number 5 with a 100.00 percent confidence. The image /data/mnist_predict/6.png is the number 6 with a 99.97 percent confidence. The image /data/mnist_predict/7.png is the number 7 with a 100.00 percent confidence. The image /data/mnist_predict/8.png is the number 8 with a 100.00 percent confidence. The image /data/mnist_predict/9.png is the number 9 with a 99.65 percent confidence.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Cloud de Confiance על המשאבים שיצרתם במדריך הזה, אפשר לבצע אחת מהפעולות הבאות:
- אם רוצים לשמור את אשכול GKE: מוחקים את משאבי Kubernetes באשכול ואת משאבי Cloud de Confiance
- שמירת הפרויקט: מחיקת אשכול GKE והמשאבים Cloud de Confiance Cloud de Confiance
- מחיקת הפרויקט
מחיקת משאבי Kubernetes באשכול ובמשאבים Cloud de Confiance
מוחקים את מרחב השמות של Kubernetes ואת עומסי העבודה שפרסתם:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-ai-namespaceמוחקים את הקטגוריה של Cloud Storage:
נכנסים לדף Buckets:
מסמנים את התיבה
PROJECT_ID-gke-gpu-bucket.לוחצים על מחיקה.
כדי לאשר את המחיקה, מקלידים
DELETEולוחצים על מחיקה.
מוחקים את Cloud de Confiance חשבון השירות:
עוברים לדף Service accounts:
בוחרים את הפרויקט הרצוי.
מסמנים את התיבה
gke-ai-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com.לוחצים על מחיקה.
לוחצים על מחיקה כדי לאשר.
מחיקת אשכול GKE והמשאבים Cloud de Confiance
מחיקת אשכול GKE:
עוברים לדף Clusters:
מסמנים את התיבה של
gke-gpu-cluster.לוחצים על מחיקה.
כדי לאשר את המחיקה, מקלידים
gke-gpu-clusterולוחצים על מחיקה.
מוחקים את הקטגוריה של Cloud Storage:
נכנסים לדף Buckets:
מסמנים את התיבה
PROJECT_ID-gke-gpu-bucket.לוחצים על מחיקה.
כדי לאשר את המחיקה, מקלידים
DELETEולוחצים על מחיקה.
מוחקים את Cloud de Confiance חשבון השירות:
עוברים לדף Service accounts:
בוחרים את הפרויקט הרצוי.
מסמנים את התיבה
gke-ai-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com.לוחצים על מחיקה.
לוחצים על מחיקה כדי לאשר.
מחיקת הפרויקט
- במסוף Cloud de Confiance , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.