Compute Engine で円周率を計算する

1. はじめに

この Codelab を開いていただきありがとうございます。Compute Engine で数値を処理する準備はできましたか?

この Codelab では、新しい仮想マシンを起動して pi を計算するプログラムを実行する方法について説明します。

Compute Engine インスタンスを作成し、円周率を計算するプログラムをダウンロード、コンパイル、実行します。Compute Engine インスタンスは、コンソールまたはコマンドラインから作成できます。このラボでは、コマンドライン ツールを使用する手順について説明します。

ComputeEngine_128px.png

Compute Engine は、さまざまな形状(コア数、メモリサイズ、ストレージなど)で実行される仮想マシンを提供します。必要に応じて、100 個を超えるコアと数百 GB のメモリを備えたマシンを使用できますが、この例では、事前定義された 2 個の vCPU と 8 GB のメモリを備えた仮想マシンを起動します。

この Codelab では、N2 マシンシリーズを使用します。これは、ほとんどの標準ワークロードとクラウドネイティブ ワークロードを対象とする汎用マシン ファミリー VM です。N2 シリーズは、スレッドごとのパフォーマンスが高く、汎用マシン ファミリーが提供する柔軟性をすべて備えています。

それでは始めましょう。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この設定はいつでも変更できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Google Cloud Shell

Google Cloud と Compute Engine はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

この Debian ベースの仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。つまり、この Codelab に必要なのはブラウザだけです(Chromebook でも動作します)。

  1. Cloud Console から Cloud Shell を有効にするには、[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 が見つからない場合は、設定手順で使用した 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 コマンドライン ツールを使用して仮想マシンを作成します。必要に応じて コンソールを使用することもできますが、コマンドラインの方が繰り返しやすく、説明もしやすいです。

まず、オペレーティング システムとして Debian 11 を使用して、pi-codelab という名前の n2-standard-2 インスタンスを作成します。ブート ボリュームには、バランス永続ディスク(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

新しい VM を作成するたびに、INTERNAL_IP フィールドと EXTERNAL_IP フィールドが変更されることに注意してください。

gcloud compute instances create コマンドの詳細については、リファレンス ページをご覧ください。

4. インスタンスに SSH 接続する

コマンドラインからインスタンスに SSH 接続するには、次のコマンドを実行します。

gcloud compute ssh pi-codelab

これで、これで仮想マシンにアクセスできました。hostname コマンドを実行すると、現在のホストを確認できます。

hostname

このコマンドを実行すると、現在のシェル環境のホスト名が表示されます。

pi-codelab

5. 依存関係をインストールする

次に、円周率を計算するプログラムをコンパイルするために必要な依存関係をインストールします。

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++ プログラムをコンパイルします。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 プログラムは、計算する桁数を引数として 1 つ受け取ります。たとえば、円周率の小数点以下 100 桁を計算してみましょう。

./pi 100

プログラムは 1 秒以内に終了し、次のような出力が表示されます。

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 桁の小数です。おめでとうございます。これで、コンピュータに計算をさせることができました。

このプログラムでは、より多くの桁数を計算できます(現在は 1,000 億桁が上限です)。次に、1,000 万桁を計算し、かかる時間を測定します。円周率の 1,000 万桁はコマンドライン コンソールで表示するには長すぎるため、出力をファイルにリダイレクトします。

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 に保存されているため、含まれていません。最後の 3 行は、プログラムの実行時間と CPU 使用量を示しています。

  • real: 開始から終了までの実際の時間。上記の例では、円周率の 1, 000 万桁の計算に 9.7 秒かかったことを意味します。
  • user: 使用した CPU 時間。マシンに 2 つの CPU コアがあり、各コアが合計にカウントされるため、「real」よりも大きくなります。
  • sys: ネットワークや I/O などのシステムタスクを処理するために、オペレーティング システムがプログラムを実行するのに必要な時間。今回は約 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 コマンドを実行してログアウトします。

exit

次の gcloud compute instances delete コマンドを実行して、インスタンスと関連付けられたディスクを削除します。リソースの削除を確認するよう求められます。

gcloud compute instances delete pi-codelab

9. 次のステップ

お疲れさまでした。これで、この Compute Engine Codelab は終了です。円周率の 1, 000 万桁を計算できました。

2022 年には、同じインフラストラクチャを使用して 100 兆桁の円周率を計算しました。詳しくは、お知らせをご覧ください。結果の全体は、pi.delivery デモサイトで確認できます。

Google Cloud ブログで、コンピューティングハイ パフォーマンス コンピューティングに関する最新ニュースをご確認ください。

Compute Engine のその他の機能

Compute Engine には豊富な機能が用意されています。以下のような項目について詳しく説明します。

フィードバックをお寄せください