حساب Pi على Compute Engine

1. مقدمة

شكرًا على فتح هذا الدرس التطبيقي حول الترميز. هل أنت مستعد لمعالجة بعض الأرقام على Compute Engine؟

في هذا الدرس التطبيقي حول الترميز، سنشرح كيفية بدء تشغيل جهاز افتراضي جديد وتنفيذ برنامج لحساب قيمة pi.

ستنشئ مثيلاً من Compute Engine، ثم ستنزّل برنامجًا وتجمّعه وتشغّله لاحتساب قيمة pi. يمكنك إنشاء مثيل Compute Engine من "وحدة التحكّم" أو سطر الأوامر. سيرشدك هذا الدرس التطبيقي إلى كيفية استخدام أدوات سطر الأوامر.

ComputeEngine_128px.png

توفّر خدمة Compute Engine أجهزة افتراضية تعمل بأشكال مختلفة، مثل عدد مختلف من النوى وحجم الذاكرة ومساحة التخزين. يمكنك استخدام جهاز يحتوي على أكثر من 100 نواة وعدة مئات من غيغابايت من الذاكرة إذا لزم الأمر، ولكن في هذا المثال، سنطلق جهازًا افتراضيًا محدّدًا مسبقًا يحتوي على وحدتَي معالجة مركزية افتراضيتَين وذاكرة بسعة 8 غيغابايت.

سنستخدم سلسلة آلات N2 في هذا الدرس التطبيقي. وهي آلة افتراضية من عائلة الآلات للأغراض العامة تستهدف معظم أحمال العمل العادية وأحمال العمل المتوافقة مع السحابة الإلكترونية. تتميّز السلسلة N2 بأداء أعلى لكل سلسلة محادثات وجميع الميزات المرنة التي توفّرها عائلة الأجهزة للأغراض العامة.

لنبدأ الآن!

2. الإعداد والمتطلبات

إعداد البيئة بالسرعة التي تناسبك

  1. سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
  • رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك لمعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع.
  • للعلم، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بأكمله. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

Google Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud وCompute Engine عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

يتم تحميل هذا الجهاز الافتراضي المستند إلى Debian بجميع أدوات التطوير التي تحتاج إليها. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. وهذا يعني أنّ كل ما تحتاجه لهذا الدرس التطبيقي حول الترميز هو متصفّح (نعم، يمكن استخدامه على جهاز Chromebook).

  1. لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على تفعيل Cloud Shell b125d9eb26a46cc5.png (يستغرق توفير البيئة والاتصال بها بضع لحظات فقط).

1067942a9a93f70.png

Screen Shot 2017-06-14 at 10.13.43 PM.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 Console:

cc3895eeac80db2c.png

يضبط Cloud Shell أيضًا بعض متغيرات البيئة تلقائيًا، ما قد يكون مفيدًا عند تنفيذ الأوامر المستقبلية.

echo $GOOGLE_CLOUD_PROJECT

ناتج الأمر

<PROJECT_ID>
  1. أخيرًا، اضبط المنطقة التلقائية وإعدادات المشروع.
gcloud config set compute/zone us-central1-f

يمكنك اختيار مجموعة متنوعة من المناطق المختلفة. لمزيد من المعلومات، يُرجى الاطّلاع على الأقاليم والمناطق.

3- إنشاء مثيل في Compute Engine

أولاً، سننشئ جهازًا افتراضيًا باستخدام أداة سطر الأوامر gcloud. يمكنك أيضًا استخدام وحدة التحكّم إذا كنت تفضّل ذلك، ولكن من الأسهل تكرار سطر الأوامر وشرحه.

لنبدأ أولاً بإنشاء آلة افتراضية n2-standard-2 باسم pi-codelab مع استخدام Debian 11 كنظام تشغيل. سنستخدم أيضًا "القرص الدائم المتوازن" (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 يتغيّران في كل مرة تنشئ فيها آلة افتراضية جديدة.

إذا أردت معرفة المزيد عن الأمر gcloud compute instances create، يُرجى الانتقال إلى صفحة المرجع.

4. استخدام بروتوكول النقل الآمن (SSH) للوصول إلى الجهاز الافتراضي

لإجراء عملية SSH في الجهاز الظاهري من سطر الأوامر، نفِّذ الأمر التالي.

gcloud compute ssh pi-codelab

هذا كل شيء! أنت الآن على الجهاز الافتراضي. يمكنك تأكيد المضيف الحالي من خلال تنفيذ أمر اسم المضيف.

hostname

سيعرض الأمر اسم المضيف لبيئة shell الحالية.

pi-codelab

5- تثبيت الحِزم التابعة

الآن، سنثبّت التبعيات اللازمة لتجميع البرنامج من أجل حساب قيمة pi.

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

تستغرق العملية بضع دقائق. والآن، لنرى ما إذا كان لديك برنامج مترجم 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++ إلى رمز آلي لحساب قيمة pi. هذه العملية أبسط مما تبدو عليه حتى إذا لم يسبق لك التطوير بلغة C++. تم تثبيت جميع المتطلبات الأساسية في الخطوة السابقة، لذا ما علينا سوى استرداد رمز المصدر وتجميعه.

أولاً، استرجِع رمز المصدر واحفظه. تنزّل هذه الخطوة ملفًا مصدرًا من GitHub وتحفظه باسم pi.cc في الدليل الحالي.

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

بعد ذلك، شغِّل برنامج تجميع C++ لتجميع رمز المصدر المحفوظ.

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

لا يعرض المترجم أي نتائج في حال النجاح. لنتأكّد من توفّر الملف القابل للتنفيذ:

ls pi

من المفترض أن يعرض الأمر ls اسم ملف البرنامج إذا كان متوفّرًا.

pi

7. احتساب قيمة Pi

يأخذ البرنامج 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. تصف الأسطر الثلاثة الأخيرة مقدار الوقت الذي استغرقه تشغيل البرنامج ومقدار وحدة المعالجة المركزية التي استخدمها.

  • الوقت الفعلي: هو الوقت الفعلي من البداية إلى النهاية، ما يعني أنّ حساب 10 ملايين رقم من أرقام باي استغرق 9.7 ثانية في المثال أعلاه.
  • user: مقدار وقت وحدة المعالجة المركزية الذي تم استخدامه، وهو أكبر من "الوقت الفعلي" لأنّ الجهاز يحتوي على نواتَي وحدة معالجة مركزية ويتم احتساب كل نواة ضمن الإجمالي.
  • ‫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، وإلا سيستمر في العمل وتراكم التكاليف.

إذا كنت تستخدم الجهاز الافتراضي (متصلاً باستخدام SSH)، سجِّل الخروج أولاً عن طريق تنفيذ الأمر exit أولاً.

exit

بعد ذلك، شغِّل الأمر gcloud compute instances delete التالي لحذف الجهاز الافتراضي والأقراص المرتبطة به. سيُطلب منك تأكيد حذف المرجع.

gcloud compute instances delete pi-codelab

9- ما هي الخطوات التالية؟

تهانينا، لقد أكملت هذا الدرس التطبيقي حول الترميز في Compute Engine وحسبت 10 ملايين رقم من أرقام باي.

استخدمنا البنية الأساسية نفسها لحساب 100 تريليون رقم من أرقام باي في عام 2022. يمكنك الاطّلاع على الإشعار لمعرفة كيف كان أداؤنا. تتوفّر النتائج الكاملة على موقعنا الإلكتروني التجريبي pi.delivery.

يمكنك الاطّلاع على آخر الأخبار حول الحوسبة والحوسبة عالية الأداء في مدونة Google Cloud.

المزيد من ميزات Compute Engine

تتضمّن خدمة Compute Engine مجموعة شاملة من الميزات. ننصحك بالاطّلاع على بعض هذه الموارد :

تقديم ملاحظاتك

  • يُرجى تخصيص بعض الوقت لإكمال الاستطلاع القصير جدًا.