Tính số Pi trên Compute Engine

1. Giới thiệu

Cảm ơn bạn đã mở lớp học lập trình này! Bạn đã sẵn sàng xử lý một số dữ liệu trên Compute Engine chưa?

Trong lớp học lập trình này, chúng ta sẽ tìm hiểu cách khởi động một máy ảo mới và chạy một chương trình để tính số pi.

Bạn sẽ tạo một phiên bản Compute Engine, tải xuống, biên dịch và chạy một chương trình để tính số pi. Bạn có thể tạo một phiên bản Compute Engine từ Bảng điều khiển hoặc dòng lệnh. Phòng thí nghiệm này sẽ hướng dẫn bạn cách sử dụng các công cụ dòng lệnh.

ComputeEngine_128px.png

Compute Engine cung cấp các máy ảo chạy ở nhiều hình dạng, chẳng hạn như số lượng lõi, dung lượng bộ nhớ và bộ nhớ khác nhau. Bạn có thể sử dụng một máy có hơn 100 lõi và bộ nhớ vài trăm GB nếu cần, nhưng trong ví dụ này, chúng ta sẽ khởi chạy một máy ảo có 2 vCPU và bộ nhớ 8 GB được xác định trước.

Chúng ta sẽ dùng dòng máy N2 trong lớp học lập trình này. Đây là một VM thuộc dòng máy đa năng, nhắm đến hầu hết các khối lượng công việc tiêu chuẩn và khối lượng công việc gốc trên đám mây. Dòng N2 có hiệu suất trên mỗi luồng cao hơn và tất cả tính linh hoạt mà dòng máy đa năng mang lại.

Giờ thì chúng ta cùng bắt đầu nào!

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án.
  • Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.

Google Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud và Compute Engine từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.

Máy ảo dựa trên Debian này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Điều này có nghĩa là bạn chỉ cần một trình duyệt (có, trình duyệt này hoạt động trên Chromebook) cho lớp học lập trình này.

  1. Để kích hoạt Cloud Shell từ Bảng điều khiển Cloud, bạn chỉ cần nhấp vào Kích hoạt Cloud Shell b125d9eb26a46cc5.png (mất vài phút để cung cấp và kết nối với môi trường).

1067942a9a93f70.png

Screen Shot 2017-06-14 at 10.13.43 PM.png

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành PROJECT_ID.

gcloud auth list

Đầu ra của lệnh

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

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu vì lý do nào đó mà dự án chưa được thiết lập, bạn chỉ cần đưa ra lệnh sau:

gcloud config set project <PROJECT_ID>

Bạn đang tìm PROJECT_ID? Kiểm tra mã nhận dạng bạn đã dùng trong các bước thiết lập hoặc tìm mã nhận dạng đó trong trang tổng quan của Cloud Console:

cc3895eeac80db2c.png

Cloud Shell cũng đặt một số biến môi trường theo mặc định, có thể hữu ích khi bạn chạy các lệnh trong tương lai.

echo $GOOGLE_CLOUD_PROJECT

Đầu ra của lệnh

<PROJECT_ID>
  1. Cuối cùng, hãy đặt cấu hình dự án và vùng mặc định.
gcloud config set compute/zone us-central1-f

Bạn có thể chọn nhiều múi giờ khác nhau. Để biết thêm thông tin, hãy xem phần Khu vực và vùng.

3. Tạo một phiên bản Compute Engine

Trước tiên, chúng ta sẽ tạo một máy ảo bằng công cụ dòng lệnh gcloud. Bạn cũng có thể sử dụng Bảng điều khiển nếu muốn, nhưng dòng lệnh sẽ dễ lặp lại và giải thích hơn.

Trước tiên, hãy tạo một phiên bản n2-standard-2 có tên là pi-codelab với Debian 11 làm hệ điều hành. Chúng ta cũng sẽ sử dụng Ổ đĩa lưu trữ dài lâu (PD) cân bằng cho ổ đĩa khởi động. PD cân bằng được hỗ trợ bởi ổ đĩa thể rắn (SSD) và cân bằng hiệu suất cũng như chi phí. Hệ thống sẽ hỏi bạn muốn sử dụng vùng nào nếu bạn chưa chọn vùng mặc định trong phần Thiết lập và yêu cầu.

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

Kết quả của lệnh sẽ có dạng như sau:

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

Xin lưu ý rằng các trường INTERNAL_IP và EXTERNAL_IP sẽ thay đổi mỗi khi bạn tạo một VM mới.

Nếu bạn muốn tìm hiểu thêm về lệnh gcloud compute instances create, vui lòng truy cập vào trang tham khảo.

4. SSH vào phiên bản

Để SSH vào phiên bản từ dòng lệnh, hãy chạy lệnh sau.

gcloud compute ssh pi-codelab

Vậy là xong! Giờ đây, bạn đang ở trên máy ảo. Bạn có thể xác nhận máy chủ lưu trữ hiện tại bằng cách chạy lệnh tên máy chủ.

hostname

Lệnh này sẽ hiển thị tên máy chủ của môi trường shell hiện tại.

pi-codelab

5. Cài đặt phần phụ thuộc

Bây giờ, chúng ta sẽ cài đặt các phần phụ thuộc cần thiết để biên dịch chương trình tính toán số pi.

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

Quá trình này mất vài phút để hoàn tất. Bây giờ, hãy kiểm tra xem bạn có trình biên dịch C++ đang hoạt động hay không.

c++ --version

Lệnh này sẽ xuất thông tin phiên bản của trình biên dịch nếu được cài đặt đúng cách.

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. Biên dịch chương trình

Bây giờ, hãy biên dịch chương trình C++ để tính số pi. Việc này đơn giản hơn bạn nghĩ, ngay cả khi bạn chưa từng phát triển bằng C++. Tất cả các điều kiện tiên quyết đều được cài đặt ở bước trước, vì vậy, chúng ta chỉ cần tìm nạp và biên dịch mã nguồn.

Trước tiên, hãy tìm nạp và lưu mã nguồn. Bước này tải một tệp nguồn xuống từ GitHub và lưu tệp đó dưới dạng pi.cc trong thư mục hiện tại.

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

Tiếp theo, hãy chạy trình biên dịch C++ để biên dịch mã nguồn đã lưu.

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

Trình biên dịch không xuất ra bất kỳ nội dung nào trong trường hợp thành công. Hãy kiểm tra để đảm bảo bạn có tệp thực thi:

ls pi

Lệnh ls này sẽ xuất tên tệp của chương trình nếu có.

pi

7. Tính số Pi

Chương trình pi lấy một đối số, đó là số lượng chữ số cần tính. Ví dụ: hãy tính 100 chữ số thập phân đầu tiên của số pi.

./pi 100

Chương trình sẽ hoàn tất trong vòng chưa đầy một giây và xuất ra nội dung như sau:

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

Dòng cuối cùng là 100 chữ số thập phân đầu tiên của số pi. Xin chúc mừng, bạn vừa yêu cầu máy tính tính toán cho mình!

Chương trình có thể tính toán nhiều chữ số hơn (hiện tại giới hạn ở 100 tỷ chữ số). Bây giờ, hãy tính 10 triệu chữ số và đo thời gian cần thiết. Chúng ta chuyển hướng đầu ra đến một tệp vì 10 triệu chữ số của số pi là quá dài để xem trong bảng điều khiển dòng lệnh.

time ./pi 10000000 > pi10m.txt

Chương trình sẽ xuất ra nội dung như sau:

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

Lần này, hệ thống không bao gồm các chữ số vì chúng được lưu trong tệp pi10m.txt. Ba dòng cuối cùng mô tả thời gian chạy chương trình và mức sử dụng CPU.

  • thực: thời gian thực từ đầu đến cuối, tức là mất 9,7 giây để tính 10 triệu chữ số của số pi trong ví dụ trên.
  • user: thời gian CPU mà ứng dụng đã sử dụng, lớn hơn thời gian "thực" vì máy có 2 lõi CPU và mỗi lõi đều được tính vào tổng thời gian.
  • sys: thời gian mà hệ điều hành cần để chạy chương trình nhằm xử lý các tác vụ hệ thống như mạng và I/O. Lần này, thời gian là khoảng 0,4 giây, chủ yếu là thời gian để ghi kết quả vào ổ đĩa.

Chúng ta có thể xem pi10m.txt và xem 100 chữ số đầu tiên và cuối cùng của mỗi chữ số.

Hãy kiểm tra các chữ số đầu tiên. Lệnh này xuất ra 100 chữ số thập phân đầu tiên (và 3 chữ số đầu tiên cùng dấu thập phân).

head -c 102 pi10m.txt

Kết quả sẽ có dạng như sau.

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

Lệnh tiếp theo sẽ xuất ra 100 chữ số thập phân cuối cùng.

tail -c 100 pi10m.txt

Kết quả sẽ có dạng như sau.

610515549257985759204553246894468742702504639790565326553194060999469787333810631719481735348955897

8. Dọn dẹp Cụm

Đừng quên tắt phiên bản Compute Engine, nếu không phiên bản này sẽ tiếp tục chạy và tích luỹ chi phí.

Nếu bạn đang dùng máy ảo (kết nối bằng SSH), trước tiên hãy đăng xuất bằng cách chạy lệnh thoát.

exit

Sau đó, hãy chạy lệnh gcloud compute instances delete sau đây để xoá phiên bản và các đĩa liên kết. Thao tác này sẽ yêu cầu bạn xác nhận việc xoá tài nguyên.

gcloud compute instances delete pi-codelab

9. Tiếp theo là gì?

Xin chúc mừng, bạn đã hoàn thành lớp học lập trình này về Compute Engine và tính được 10 triệu chữ số của số pi!

Chúng tôi đã sử dụng cùng một cơ sở hạ tầng để tính 100 nghìn tỷ chữ số của số pi vào năm 2022. Hãy đọc thông báo để xem chúng tôi đã làm được những gì. Bạn có thể xem toàn bộ kết quả trên trang web minh hoạ pi.delivery của chúng tôi.

Luôn cập nhật tin tức mới nhất về Điện toánĐiện toán hiệu suất cao trên Blog Google Cloud!

Nhiều tính năng khác của Compute Engine

Compute Engine có nhiều tính năng. Bạn có thể muốn tìm hiểu kỹ một số vấn đề sau :

Gửi ý kiến phản hồi cho chúng tôi

  • Vui lòng dành chút thời gian để hoàn thành bản khảo sát rất ngắn của chúng tôi