אימון מודל עם GPUs במצב GKE Standard
במדריך למתחילים הזה נסביר איך לפרוס מודל אימון עם מעבדי GPU ב-Google Kubernetes Engine (GKE) ולאחסן את החיזויים ב-Cloud Storage. במדריך הזה משתמשים במודל TensorFlow ובאשכולות GKE Standard. אפשר גם להריץ את עומסי העבודה האלה באשכולות Autopilot עם פחות שלבי הגדרה. הוראות מפורטות מופיעות במאמר אימון מודל עם GPUs במצב אוטומטי של GKE.
המסמך הזה מיועד לאדמינים ב-GKE שיש להם אשכולות Standard קיימים ורוצים להריץ עומסי עבודה של GPU בפעם הראשונה.
לפני שמתחילים
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud 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 Google Cloud project.
Enable the Kubernetes Engine and Cloud Storage APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
מפעילים את Cloud Shell במסוף Google Cloud .
בחלק התחתון של מסוף Google Cloud יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות לאימון מודל ב-GPU, בקשו מהאדמין להקצות לכם את התפקידים הבאים ב-IAM בפרויקט:
-
ניהול אשכולות GKE:
אדמין של Kubernetes Engine (
roles/container.admin) -
ניהול קטגוריות של Cloud Storage:
אדמין של Storage (
roles/storage.admin) -
הקצאת תפקידי IAM בפרויקט: אדמין IAM של פרויקט (
roles/resourcemanager.projectIamAdmin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
שכפול המאגר לדוגמה
ב-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
יצירת אשכול במצב Standard ומאגר צומתי GPU
אתם יכולים להשתמש ב-Cloud Shell כדי:
יוצרים אשכול Standard שמשתמש באיחוד זהויות של עומסי עבודה ל-GKE ומתקינים את מנהל ההתקן של Cloud Storage FUSE:
gcloud container clusters create gke-gpu-cluster \ --addons GcsFuseCsiDriver \ --location=us-east4 \ --num-nodes=1 \ --workload-pool=PROJECT_ID.מחליפים את
PROJECT_IDבמזהה הפרויקט ב- Google Cloud.יצירת האשכול עשויה להימשך כמה דקות.
יוצרים מאגר צומתי 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-east4 \ --cluster=gke-gpu-cluster
יצירת קטגוריה של Cloud Storage
נכנסים לדף Create a bucket במסוף Google Cloud :
בשדה Name your bucket, מזינים את השם הבא:
PROJECT_ID-gke-gpu-bucketלוחצים על Continue.
בשדה Location type, בוחרים באפשרות Region.
ברשימה Region, בוחרים את
us-east4 (Northern Virginia)ולוחצים על Continue.בקטע 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
כדי לאפשר לאשכול לגשת לקטגוריה של Cloud Storage:
- יוצרים ServiceAccount של Kubernetes באשכול.
- מקצים תפקידי IAM ל-Kubernetes ServiceAccount.
יצירת Kubernetes ServiceAccount באשכול
ב-Cloud Shell, מבצעים את הפעולות הבאות:
יוצרים מרחב שמות של Kubernetes:
kubectl create namespace gke-ai-namespaceיוצרים ServiceAccount של Kubernetes במרחב השמות:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
הקצאת תפקידי IAM ל-Kubernetes ServiceAccount
ב-Cloud Shell, מקצים את התפקידים "אדמין של אובייקטים באחסון" (roles/storage.objectAdmin) ו"שירות איסוף תובנות לגבי אחסון" (roles/storage.insightsCollectorService) לחשבון השירות של Kubernetes:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID./subject/ns/gke-ai-namespace/sa/gpu-k8s-sa" \
--role=roles/storage.objectAdmin \
--condition=None
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID./subject/ns/gke-ai-namespace/sa/gpu-k8s-sa" \
--role=roles/storage.insightsCollectorService \
--condition=None
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . -
PROJECT_NUMBER: מספר הפרויקט ב- Google Cloud .
איך מוודאים של-Pods יש גישה לקטגוריה של Cloud Storage
ב-Cloud Shell, יוצרים את משתני הסביבה הבאים:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucketמחליפים את
PROJECT_IDבמזהה הפרויקט ב- Google Cloud.יוצרים 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.
הסרת המשאבים
כדי להימנע מצבירת חיובים בחשבון Google Cloud על המשאבים שיצרתם במדריך הזה, אתם יכולים לבצע אחת מהפעולות הבאות:
- שמירת אשכול GKE: מחיקת המשאבים ב-Kubernetes באשכול ומשאבי Google Cloud
- שמירת הפרויקט ב- Google Cloud : מחיקת אשכול GKE והמשאבים ב- Google Cloud
- מחיקת הפרויקט
מוחקים את המשאבים ב-Kubernetes באשכול ואת המשאבים ב- Google Cloud
מוחקים את מרחב השמות של 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ולוחצים על מחיקה.
מחיקת אשכול GKE והמשאבים של Google Cloud
מוחקים את אשכול GKE:
נכנסים לדף Clusters:
מסמנים את התיבה של
gke-gpu-cluster.לוחצים על מחיקה.
כדי לאשר את המחיקה, מקלידים
gke-gpu-clusterולוחצים על מחיקה.
מוחקים את הקטגוריה של Cloud Storage:
נכנסים לדף Buckets:
מסמנים את התיבה של
PROJECT_ID-gke-gpu-bucket.לוחצים על מחיקה.
כדי לאשר את המחיקה, מקלידים
DELETEולוחצים על מחיקה.
מחיקת הפרויקט
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.