このチュートリアルでは、Slurm クラスタを Compute Engine にデプロイする方法を説明します。Slurm Resource Manager は、多くのハイ パフォーマンス コンピューティング センターでよく使用されているリソース マネージャーです。ハイ パフォーマンス コンピューティングの用語とユースケースの検討については、クラウドでの大規模な技術計算にクラスタを使用するをご覧ください。
次の図は、このチュートリアルで作成する構成を示しています。
クラスタ ワークロード マネージャーとして Slurm は次の処理を行います。
- リソース(コンピューティング ノード)をユーザーに割り当てます。
- ノードで作業を開始、実行、モニタリングするための構造を提供します。
- 保留中の作業のキューを管理します。
このチュートリアル用に開発されたデプロイは、単一アプリのワークロードを実行する数人のユーザーをサポートする単純化されたクラスタ アーキテクチャです。マルチ ワークロード デプロイ、大規模な本番環境デプロイ、オンプレミス クラスタまたはマルチクラウド クラスタで動作する混合型デプロイには、他の構成を使用できますが、これらの構成はこのチュートリアルの範囲外です。
このチュートリアルでは、ログイン(ヘッド)ノードを使用してシステムを操作します。クラスタをデプロイしたら、SSH を使用してログインノードに接続し、Slurm コマンドライン ツールを使用して計算ジョブを送信します。コントローラ ノードで実行されている Slurm スケジューラは、利用可能なリソースをジョブ要件と照合してジョブのキューの予定を決め、コンピューティング ノードでのジョブの実行を管理します。NFS サーバーにファイル用の共通の共有スペースを用意します。
目標
- Terraform を使用して Slurm クラスタをデプロイします。
- Slurm を使用してジョブを実行します。
- クラスタ情報をクエリし、Slurm で実行中のジョブをモニタリングします。
- ジョブ パラメータを格納するためにノードを自動スケーリングします。
料金
このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。
このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する。
- Compute Engine and Deployment Manager API を有効にします。
-
Cloud Console で、Cloud Shell をアクティブにします。
Cloud Console の下部にある Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。
gcloud
コマンドライン ツールなどの Cloud SDK がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。
Slurm クラスタのデプロイ
このセクションでは、クラスタ構成を準備し、Deployment Manager を使用して Slurm クラスタを Google Cloud にデプロイしてから、クラスタが動作していることを確認します。
クラスタ構成を準備する
Cloud Shell で
slurm-gcp
GitHub リポジトリのクローンを作成します。git clone https://github.com/SchedMD/slurm-gcp.git
次の環境変数を定義します。
export CLUSTER_NAME="cluster-name" export CLUSTER_ZONE="cluster-zone"
以下を置き換えます。
cluster-name
: クラスタの一意の名前。cluster-zone
: クラスタをデプロイするゾーン。
slurm-gcp/tf/examples/basic
フォルダで、basic.tfvars.example
ファイルをbasic.tfvars
ファイルにコピーします。cd slurm-gcp/tf/examples/basic cp basic.tfvars.example basic.tfvars
環境の
basic.tfvars
ファイルを変更するには、sed
コマンドを使用します。sed -i "s/\(cluster_name.*= \)\"\(.*\)\"/\1\"${CLUSTER_NAME}\"/" basic.tfvars sed -i "s/<project>/$(gcloud config get-value core/project)/" basic.tfvars sed -i "s/\(zone.*= \)\"\(.*\)\"/\1\"${CLUSTER_ZONE}\"/" basic.tfvars
(省略可)テキスト エディタで、プリセットの値を変更して環境の
basic.tfvars
ファイルをカスタマイズします。machine_type
: クラスタのコンピューティング ノードに別のマシンタイプを使用するには、この値を変更します。たとえば、デフォルトのn1-standard-2
マシンタイプで使用可能な数量よりも多くの CPU コアまたはメモリを必要とする場合は、この値を変更します。詳細については、マシンタイプをご覧ください。compute_disk_type
: SSD をコンピューティング ノードで使用するには、この値をpd-ssd
に変更します。compute_disk_size_gb
: コンピューティング ノードに接続されている、サイズのより大きな、または小さなディスクを使用するには、この値を変更します。
(省略可)テキスト エディタで、追加の Terraform 変数宣言のコメントを解除して、環境に合わせて
basic.tfvars
ファイルを詳細にカスタマイズします。
Terraform を使用して Slurm クラスタをデプロイする
Cloud Shell で、Terraform の作業ディレクトリを初期化します。
terraform init
Terraform を使用してクラスタを Google Cloud にデプロイします。
terraform apply -var-file=basic.tfvars
出力は次のようになります。
terraform apply -var-file=basic.tfvars -auto-approve module.slurm_cluster_controller.data.google_compute_default_service_account.default: Refreshing state... module.slurm_cluster_login.data.google_compute_default_service_account.default: Refreshing state... module.slurm_cluster_network.google_compute_network.cluster_network[0]: Creating... module.slurm_cluster_network.google_compute_network.cluster_network[0]: Still creating... [10s elapsed] module.slurm_cluster_network.google_compute_network.cluster_network[0]: Still creating... [20s elapsed] module.slurm_cluster_network.google_compute_network.cluster_network[0]: Creation complete after 22s [id=projects/myproject/global/networks/mycluster-network] module.slurm_cluster_network.google_compute_router.cluster_router[0]: Creating... module.slurm_cluster_network.google_compute_subnetwork.cluster_subnet[0]: Creating... module.slurm_cluster_network.google_compute_firewall.cluster_iap_ssh_firewall[0]: Creating... module.slurm_cluster_network.google_compute_firewall.cluster_internal_firewall[0]: Creating... module.slurm_cluster_network.google_compute_router.cluster_router[0]: Still creating... [10s elapsed] module.slurm_cluster_network.google_compute_subnetwork.cluster_subnet[0]: Still creating... [10s elapsed] module.slurm_cluster_network.google_compute_firewall.cluster_iap_ssh_firewall[0]: Still creating... [10s elapsed] module.slurm_cluster_network.google_compute_firewall.cluster_internal_firewall[0]: Still creating... [10s elapsed] module.slurm_cluster_network.google_compute_firewall.cluster_internal_firewall[0]: Creation complete after 11s [id=projects/myproject/global/firewalls/mycluster-allow-internal] module.slurm_cluster_network.google_compute_firewall.cluster_iap_ssh_firewall[0]: Creation complete after 11s [id=projects/myproject/global/firewalls/mycluster-allow-iap] module.slurm_cluster_network.google_compute_router.cluster_router[0]: Creation complete after 11s [id=projects/myproject/regions/us-central1/routers/mycluster-router] module.slurm_cluster_network.google_compute_subnetwork.cluster_subnet[0]: Still creating... [20s elapsed] module.slurm_cluster_network.google_compute_subnetwork.cluster_subnet[0]: Creation complete after 21s [id=projects/myproject/regions/us-central1/subnetworks/mycluster-us-central1] module.slurm_cluster_network.google_compute_router_nat.cluster_nat[0]: Creating... module.slurm_cluster_login.google_compute_instance.login_node[0]: Creating... module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Creating... module.slurm_cluster_network.google_compute_router_nat.cluster_nat[0]: Still creating... [10s elapsed] module.slurm_cluster_login.google_compute_instance.login_node[0]: Still creating... [10s elapsed] module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Still creating... [10s elapsed] module.slurm_cluster_network.google_compute_router_nat.cluster_nat[0]: Still creating... [20s elapsed] module.slurm_cluster_login.google_compute_instance.login_node[0]: Still creating... [20s elapsed] module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Still creating... [20s elapsed] module.slurm_cluster_network.google_compute_router_nat.cluster_nat[0]: Creation complete after 22s [id=myproject/us-central1/mycluster-router/mycluster-nat] module.slurm_cluster_login.google_compute_instance.login_node[0]: Still creating... [30s elapsed] module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Still creating... [30s elapsed] module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Creation complete after 34s [id=projects/myproject/zones/us-central1-a/instances/mycluster-controller] module.slurm_cluster_login.google_compute_instance.login_node[0]: Creation complete after 35s [id=projects/myproject/zones/us-central1-a/instances/mycluster-login0] Apply complete! Resources: 8 added, 0 changed, 0 destroyed. Outputs: controller_network_ips = [ [ "10.0.0.2", ], ] login_network_ips = [ [ "10.0.0.3", ], ]
クラスタの構成が完了するまでに 5~0 分かかります。構成の進行状況をトラッキングします。
gcloud compute ssh ${CLUSTER_NAME}-controller \ --command "sudo journalctl -fu google-startup-scripts.service" \ --zone $CLUSTER_ZONE
スクリプトが終了すると、Slurm クラスタを使用できるようになります。出力は次の行で終了します。
Started Google Compute Engine Startup Scripts.
構成の監視を停止するには、Control+C キーを押します。
クラスタが実行中であることを検証します。
Cloud Shell で、ログインノードにログインしてクラスタの準備ができていることを確認します。
export CLUSTER_LOGIN_NODE=$(gcloud compute instances list \ --zones ${CLUSTER_ZONE} \ --filter="name ~ .*login." \ --format="value(name)" | head -n1) gcloud compute ssh ${CLUSTER_LOGIN_NODE} \ --zone $CLUSTER_ZONE
出力が次のようになると、クラスタの準備ができています。
SSSSSSS SSSSSSSSS SSSSSSSSS SSSSSSSSS SSSS SSSSSSS SSSS SSSSSS SSSSSS SSSSSS SSSSSSS SSSSSS SSSS SSSSSSSSS SSSS SSS SSSSSSSSS SSS SSSSS SSSS SSSSSSSSS SSSS SSSSS SSS SSSSSS SSSSSSSSS SSSSSS SSS SSSSSS SSSSSSS SSSSSS SSS SSSSSS SSSSSS SSS SSSSS SSSS SSSSSSS SSSS SSSSS S SSS SSSSSSSSS SSS S SSS SSSS SSSSSSSSS SSSS SSS S SSS SSSSSS SSSSSSSSS SSSSSS SSS S SSSSS SSSSSS SSSSSSSSS SSSSSS SSSSS S SSSSS SSSS SSSSSSS SSSS SSSSS S S SSS SSS SSS SSS S S S S S SSS SSS SSS SSS SSSSSSSSSSSS SSS SSSS SSSS SSSSSSSSS SSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSS SSS SSSS SSSS SSSSSSSSSS SSSSSSSSSSSSSSSSSSSSSS SSSS SSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSS SSSS SSSS SSSS SSSS SSSS SSSS SSSSSSSSSSSS SSS SSSS SSSS SSSS SSSS SSSS SSSS SSSSSSSSSSSS SSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSS SSSS SSSS SSSS SSSS SSSS SSSS SSSSSSSSSSSSS SSS SSSSSSSSSSSSSSS SSSS SSSS SSSS SSSS SSSSSSSSSSSS SSS SSSSSSSSSSSSS SSSS SSSS SSSS SSSS
クラスタを終了するには、
Control+D
を押します。クラスタの準備ができたら、ジョブが正しく動作していることを確認するスケジュールを設定します。このジョブは、クラスタ内の複数のノードで
hostname
コマンドを実行します。gcloud compute ssh ${CLUSTER_LOGIN_NODE} \ --command 'sbatch -N2 --wrap="srun hostname"' --zone $CLUSTER_ZONE gcloud compute ssh ${CLUSTER_LOGIN_NODE} \ --command 'cat slurm-*.out' --zone $CLUSTER_ZONE
出力は次のようになります。
helloworld-compute1 helloworld-compute2
これで、動作中のクラスタが作成されました。
Slurm クラスタの自動スケーリング
Slurm クラスタをデプロイするときは、max_node_count
と static_node_count
プロパティの値を指定します。max_node_count
値は、クラスタが任意の時点で実行するコンピューティングノードの最大数を決定します。static_node_count
値は、常に実行中のコンピューティング ノードの数を指定します。デフォルトでは、slurm-cluster.yaml
ファイルは 10
に max_node_count
を、2
に static_node_count
を設定します。
これら 2 つの数値の差(max_node_count
- static_node_count
)が、クラスタ内のエフェメラル ノードの数になります。エフェメラル ノードは、ジョブ スケジューリング リクエストに応答してオンデマンドで作成されます。実行するために作成されたジョブが完了すると、クラスタが他のジョブの実行に使用できない場合、ノードは破棄されます。Google Cloud では、Slurm 省電力メカニズムは必要時のみエフェメラル ノードをインスタンス化することでクラスタを自動スケーリングします。
Cloud Shell で、クラスタのログインノードにログインします。
gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone $CLUSTER_ZONE
ノード数を表示します。
sinfo
出力は次のようになります。
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 8 idle~ demo-compute[3-10] debug* up infinite 2 idle demo-compute[1-2]
出力の最初の行にある
STATE
記述子idle
の~
サフィックスは、8 つのエフェメラル ノードが省電力モードであることを示します。クラスタを自動スケーリングするには、3 つのエフェメラル ノードを作成します。
sbatch -N5 --wrap="srun hostname"
出力は次のようになります。
Submitted batch job JOB_ID
ノード数を再表示します。
sinfo
出力は次のようになります。
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 3 alloc# demo-compute[3-5] debug* up infinite 5 idle~ demo-compute[6-10] debug* up infinite 2 idle demo-compute[1-2]
出力の最初の行にある
STATE
記述子alloc
の#
サフィックスは、3 つのエフェメラル ノードが作成されたことを示します。追加のノードが作成して構成されると、ジョブが実行され、少し後に破棄されます。クラスタを終了するには、
Control+D
を押します。
クリーンアップ
課金を停止する最も簡単な方法は、チュートリアル用に作成した Cloud プロジェクトを削除することです。また、リソースを個別に削除することもできます。プロジェクトの削除
- Cloud Console で [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
Slurm クラスタを削除する
クラスタを削除します。
terraform destroy -var-file=basic.tfvars
次のステップ
- Google Cloud のその他の機能を試す。チュートリアルをご覧ください。