חישוב פאי ב-Compute Engine

1. מבוא

תודה שפתחת את Codelab הזה! מוכנים לנתח כמה מספרים ב-Compute Engine?

ב-Codelab הזה נסביר איך להפעיל מכונה וירטואלית חדשה ולהריץ תוכנית לחישוב פאי.

יוצרים מכונה של Compute Engine, מורידים, הידור ומריצים תוכנה כדי לחשב את פאי. אפשר ליצור מכונה של Compute Engine מהמסוף או משורת הפקודה. בשיעור ה-Lab הזה תלמדו איך להשתמש בכלי שורת הפקודה.

ComputeEngine_128px.png

ב-Compute Engine יש מכונות וירטואליות שפועלות בצורות שונות, למשל מספרים שונים של ליבות, גודל זיכרון ונפח אחסון. אתם יכולים להשתמש במכונה עם יותר מ-100 ליבות וכמה מאותGB של זיכרון במידת הצורך, אבל בדוגמה הזו נשיק מכונה וירטואלית שהוגדרה מראש עם זיכרון בנפח 2vCPU ו-8GB.

נשתמש בסדרת מכונות N2 ב-Codelab הזה. זוהי מכונה וירטואלית לשימוש כללי, שמטרגטת את רוב עומסי העבודה הרגילים ומבוססי-הענן. סדרת N2 מספקת ביצועים גבוהים יותר לכל שרשור, ואת כל הגמישות שיש במשפחת המכונות לשימוש כללי.

שנתחיל?

2. הגדרה ודרישות

הגדרת סביבה בקצב עצמאי

  1. נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
  • Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט.
  • לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

Google Cloud Shell

אפשר להפעיל את Google Cloud ואת Compute Engine מרחוק מהמחשב הנייד, אבל ב-Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.

המכונה הווירטואלית הזו שמבוססת על Debian נטענת עם כל הכלים למפתחים שדרושים לכם. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. כלומר, כל מה שדרוש ל-Codelab הזה הוא דפדפן (כן, הוא פועל ב-Chromebook).

  1. כדי להפעיל את Cloud Shell ממסוף Cloud, לוחצים על Activate Cloud Shell b125d9eb26a46cc5.png (ההקצאה וההתחברות לסביבה אמורות להימשך כמה דקות).

1067942a9a93f70.png

צילום מסך מתאריך 2017-06-14 בשעה 22:13.43.png

אחרי ההתחברות ל-Cloud Shell, אתם אמורים לראות שכבר בוצע אימות ושהפרויקט כבר מוגדר ל-PROJECT_ID שלכם.

gcloud auth list

פלט הפקודה

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

פלט הפקודה

[core]
project = <PROJECT_ID>

אם מסיבה כלשהי הפרויקט לא מוגדר, פשוט מריצים את הפקודה הבאה:

gcloud config set project <PROJECT_ID>

רוצה למצוא את ה-PROJECT_ID שלך? אתם יכולים לבדוק באיזה מזהה השתמשתם בשלבי ההגדרה או לחפש אותו במרכז הבקרה של מסוף Cloud:

cc3895eeac80db2c.png

Cloud Shell גם מגדירה משתני סביבה כברירת מחדל, והוא יכול להיות שימושי כשמריצים פקודות עתידיות.

echo $GOOGLE_CLOUD_PROJECT

פלט הפקודה

<PROJECT_ID>
  1. בשלב האחרון, מגדירים את ברירת המחדל של האזור והפרויקט.
gcloud config set compute/zone us-central1-f

אפשר לבחור מגוון אזורים שונים. מידע נוסף זמין במאמר אזורים ו אזורים.

3. יצירת מכונה של Compute Engine

קודם כול, ניצור מכונה וירטואלית באמצעות כלי שורת הפקודה של Google Cloud. אם אתם מעדיפים, אתם יכולים גם להשתמש במסוף, אבל קל יותר לחזור על שורת הפקודה ולהסביר עליה.

נתחיל ליצור מכונה n2-standard-2 בשם pi-codelab, ו-Debian 11 היא מערכת ההפעלה. נשתמש גם בדיסק אחסון מתמיד (persistent disk) מאוזן (PD) לנפח האתחול. מכשירי PD מאוזנים מגובים בכונני SSD, עם איזון בין הביצועים לבין העלות. בהודעה תתבקשו לבחור באיזה אזור להשתמש, אם לא בחרתם אזור ברירת מחדל בקטע 'הגדרה ודרישות'.

gcloud compute instances create pi-codelab \
--machine-type=n2-standard-2 \
--image-project=debian-cloud \
--image-family=debian-11 \
--boot-disk-type=pd-balanced

תוצאת הפקודה אמורה להיראות כך:

Created [https://www.googleapis.com/compute/v1/projects/xxx/zones/us-central1-f/instances/pi-codelab].
NAME: pi-codelab
ZONE: us-central1-f
MACHINE_TYPE: n2-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.XX
EXTERNAL_IP: XX.XX.XX.XX
STATUS: RUNNING

חשוב לשים לב שהשדות INTERNAL_IP ו-EXTERNAL_IP משתנים בכל פעם שיוצרים VM חדשה.

מידע נוסף על הפקודה gcloud compute instances create זמין בדף העזר.

4. SSH למכונה

כדי להיכנס למכונה באמצעות SSH משורת הפקודה, מריצים את הפקודה הבאה.

gcloud compute ssh pi-codelab

זהו! עכשיו אנחנו משתמשים במכונה הווירטואלית. אפשר לאשר את המארח הנוכחי על ידי הרצת הפקודה של שם המארח.

hostname

הפקודה תציג את שם המארח של סביבת המעטפת הנוכחית.

pi-codelab

5. יחסי תלות בהתקנות

עכשיו נתקין את יחסי התלות שדרושים כדי להדר את התוכנה לחישוב פאי.

sudo apt update
sudo apt -y install build-essential libgmp-dev libmpfr-dev libfmt-dev

התהליך יימשך כמה דקות. עכשיו נבדוק אם יש לכם מהדר (compiler) C++ פעיל.

c++ --version

הפקודה הזו תפיק פרטי גרסה של המהדר אם היא תותקן כראוי.

c++ (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

6. עריכת התוכנית

עכשיו נקמפל את התוכנית C++ כדי לחשב את פאי. זה פשוט יותר מכפי שזה נשמע, גם אם לא פיתחתם בעבר ב-C++. כל הדרישות המוקדמות מותקנות בשלב הקודם, לכן עלינו רק לאחזר ולהרכיב את קוד המקור.

קודם כול, מאחזרים את קוד המקור ושומרים אותו. בשלב הזה המערכת מורידה קובץ מקור מ-GitHub ושומרת אותו בתור pi.cc בספרייה הנוכחית.

curl -OL https://raw.githubusercontent.com/GoogleCloudPlatform/pi-delivery/main/codelab/pi.cc

לאחר מכן, מריצים את המהדר (compiler) C++ כדי להדר את קוד המקור שנשמר.

c++ -opi pi.cc -std=c++17 -O3 -march=native -lgmp -lmpfr -lpthread -lfmt

המהדר לא יפיק כלום במקרה של הצלחה. בודקים אם קובץ ההפעלה נמצא אצלכם:

ls pi

פקודת ה-ls הזו אמורה להציג את שם הקובץ של התוכנה, אם יש כזו.

pi

7. חשבו את פאי

הפונקציה pi מחשבת ארגומנט אחד, שהוא מספר הספרות. לדוגמה, בואו נחשב את 100 הספרות הראשונות של פאי.

./pi 100

התוכנית תסתיים תוך פחות משנייה ותפלט בערך כך:

Calculating 100 digits of pi...
Internal precision = 348 bits
Number of terms = 9, digits per term = 14.181647462725477
Summation series complete. Final steps...
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

השורה האחרונה היא 100 הספרות הראשונות של פאי. ברכותינו, המחשב מבצע את החישובים בשבילך!

התוכנית יכולה לחשב יותר ספרות (כרגע ההגבלה היא 100 מיליארד ספרות). עכשיו נחשב 10 מיליון ספרות ונמדוד כמה זמן זה לוקח. אנחנו מפנים מחדש את הפלט לקובץ, כי 10 מיליון ספרות של פאי ארוכות מדי להצגה במסוף שורת הפקודה.

time ./pi 10000000 > pi10m.txt

הפלט של התוכנה אמור להיראות כך:

Calculating 10000000 digits of pi...
Internal precision = 33219296 bits
Number of terms = 705138, digits per term = 14.181647462725477
Summation series complete. Final steps...

real    0m9.702s
user    0m14.839s
sys     0m0.364s

הוא לא כולל את הספרות הפעם כי הן שמורות בקובץ pi10m.txt. בשלוש השורות האחרונות מתואר משך זמן ההפעלה של התוכנית וכמות המעבד שלה.

  • ממש: הזמן בפועל מתחילתו ועד סופו, כלומר לקחה 9.7 שניות כדי לחשב 10 מיליון ספרות של פאי בדוגמה שלמעלה.
  • user: כמה זמן מעבד (CPU) נוצל, גדול יותר מזמן המעבד (CPU) כי למכונה יש שתי ליבות של מעבד (CPU) וכל ליבה נחשבת כחלק מהסכום הכולל.
  • sys: משך הזמן שמערכת ההפעלה שנדרשת כדי להפעיל את התוכנית כדי לעבד משימות מערכת, כגון רשת וקלט/פלט. הפעם זה ארך כ-0.4 שניות, וזה בעיקר הזמן לכתוב את התוצאה בדיסק.

ניתן לבחון את pi10m.txt ולראות את 100 הספרות הראשונות והאחרונות כל אחת.

בואו נבדוק את הספרות הראשונות. הפלט של הפקודה הזו הוא 100 הספרות העשרוניות הראשונות (ו-3 הנקודה העשרונית הראשונה).

head -c 102 pi10m.txt

התוצאה אמורה להיראות כך.

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

הפקודה הבאה תפיק את 100 הספרות האחרונות.

tail -c 100 pi10m.txt

התוצאה אמורה להיראות כך.

610515549257985759204553246894468742702504639790565326553194060999469787333810631719481735348955897

8. ניקוי האשכול

חשוב לזכור להשבית את המכונה של Compute Engine, אחרת היא תמשיך לפעול ולצבור עלויות.

אם משתמשים ב-VM (מחוברת באמצעות SSH), צריך להתנתק קודם על ידי הרצת פקודת היציאה.

exit

לאחר מכן, מריצים את פקודת gcloud compute instances delete הבאה כדי למחוק את המכונה ואת הדיסקים המשויכים אליה. תופיע בקשה לאשר את מחיקת המשאב.

gcloud compute instances delete pi-codelab

9. מה השלב הבא?

כל הכבוד, השלמת את ה-codelab ב-Compute Engine וחישבת 10 מיליון ספרות פאי!

השתמשנו באותה תשתית כדי לחשב 100 טריליון ספרות של פאי בשנת 2022. בהודעה תוכלו לראות את סטטוס הטיפול שלנו. התוצאות המלאות זמינות באתר ההדגמה pi.delivery.

בבלוג של Google Cloud תוכלו להתעדכן בחדשות האחרונות לגבי Compute ו-High Performance Computeing.

תכונות נוספות של Compute Engine

Compute Engine כולל מגוון עשיר של תכונות. מומלץ להתעמק בחלק מהנושאים הבאים :

נשמח לקבל ממך משוב

  • כדאי למלא את הסקר הקצר מאוד שלנו