Compute Engine で円周率を計算する

1. はじめに

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

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

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 を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。
  • なお、3 つ目の値は、一部の API で使用される [プロジェクト番号] です。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に課金が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Google Cloud Shell

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

この Debian ベースの仮想マシンには、必要な開発ツールがすべて揃っています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。つまり、この 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 コンソール ダッシュボードで確認します。

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

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

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

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

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

gcloud compute ssh pi-codelab

これで、仮想マシンにログインしました現在のホストを確認するには、hostname コマンドを実行します。

hostname

このコマンドにより、現在のシェル環境のホスト名が表示されます。

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 プログラムは、計算する桁数である 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 万桁の pi は少し長すぎてコマンドライン コンソールで見ることができないため、出力をファイルにリダイレクトします。

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 コアがあり、各コアが合計にカウントされるためです。
  • 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 には豊富な機能があります。必要に応じて、これらのいくつかを調べることをおすすめします。

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