Slurm クラスタを Compute Engine にデプロイする

このチュートリアルでは、Slurm クラスタを Compute Engine にデプロイする方法を説明します。Slurm Resource Manager は、多くのハイ パフォーマンス コンピューティング センターでよく使用されているリソース マネージャーです。ハイ パフォーマンス コンピューティングの用語とユースケースの検討については、クラウドでの大規模な技術計算にクラスタを使用するをご覧ください。

次の図は、このチュートリアルで作成する構成を示しています。

Compute Engine にインストールされた Slurm クラスタを示すアーキテクチャ図。

クラスタ ワークロード マネージャーとして Slurm は次の処理を行います。

  • リソース(コンピューティング ノード)をユーザーに割り当てます。
  • ノードで作業を開始、実行、モニタリングするための構造を提供します。
  • 保留中の作業のキューを管理します。

このチュートリアル用に開発されたデプロイは、単一アプリのワークロードを実行する数人のユーザーをサポートする単純化されたクラスタ アーキテクチャです。マルチ ワークロード デプロイ、大規模な本番環境デプロイ、オンプレミス クラスタまたはマルチクラウド クラスタで動作する混合型デプロイには、他の構成を使用できますが、これらの構成はこのチュートリアルの範囲外です。

このチュートリアルでは、ログイン(ヘッド)ノードを使用してシステムを操作します。クラスタをデプロイしたら、SSH を使用してログインノードに接続し、Slurm コマンドライン ツールを使用して計算ジョブを送信します。コントローラ ノードで実行されている Slurm スケジューラは、利用可能なリソースをジョブ要件と照合してジョブのキューの予定を決め、コンピューティング ノードでのジョブの実行を管理します。NFS サーバーにファイル用の共通の共有スペースを用意します。

目標

  • Terraform を使用して Slurm クラスタをデプロイします。
  • Slurm を使用してジョブを実行します。
  • クラスタ情報をクエリし、Slurm で実行中のジョブをモニタリングします。
  • ジョブ パラメータを格納するためにノードを自動スケーリングします。

料金

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Compute Engine and Deployment Manager API を有効にします。

    API を有効にする

  5. Cloud Console で、Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

    Cloud Console の下部にある Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。gcloud コマンドライン ツールなどの Cloud SDK がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

Slurm クラスタのデプロイ

このセクションでは、クラスタ構成を準備し、Deployment Manager を使用して Slurm クラスタを Google Cloud にデプロイしてから、クラスタが動作していることを確認します。

クラスタ構成を準備する

  1. Cloud Shell で slurm-gcp GitHub リポジトリのクローンを作成します。

    git clone https://github.com/SchedMD/slurm-gcp.git
    
  2. 次の環境変数を定義します。

    export CLUSTER_NAME="cluster-name"
    export CLUSTER_ZONE="cluster-zone"
    

    以下を置き換えます。

    • cluster-name: クラスタの一意の名前。
    • cluster-zone: クラスタをデプロイするゾーン
  3. slurm-gcp/tf/examples/basic フォルダで、basic.tfvars.example ファイルを basic.tfvars ファイルにコピーします。

    cd slurm-gcp/tf/examples/basic
    cp basic.tfvars.example basic.tfvars
    
  4. 環境の 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
    
  5. (省略可)テキスト エディタで、プリセットの値を変更して環境の basic.tfvars ファイルをカスタマイズします。

    • machine_type: クラスタのコンピューティング ノードに別のマシンタイプを使用するには、この値を変更します。たとえば、デフォルトの n1-standard-2 マシンタイプで使用可能な数量よりも多くの CPU コアまたはメモリを必要とする場合は、この値を変更します。詳細については、マシンタイプをご覧ください。
    • compute_disk_type: SSD をコンピューティング ノードで使用するには、この値を pd-ssd に変更します。
    • compute_disk_size_gb: コンピューティング ノードに接続されている、サイズのより大きな、または小さなディスクを使用するには、この値を変更します。
  6. (省略可)テキスト エディタで、追加の Terraform 変数宣言のコメントを解除して、環境に合わせて basic.tfvars ファイルを詳細にカスタマイズします。

Terraform を使用して Slurm クラスタをデプロイする

  1. Cloud Shell で、Terraform の作業ディレクトリを初期化します。

    terraform init
    
  2. 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",
      ],
    ]
    
  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.
    
  4. 構成の監視を停止するには、Control+C キーを押します。

クラスタが実行中であることを検証します。

  1. 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
    
  2. クラスタを終了するには、Control+D を押します。

  3. クラスタの準備ができたら、ジョブが正しく動作していることを確認するスケジュールを設定します。このジョブは、クラスタ内の複数のノードで 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_countstatic_node_count プロパティの値を指定します。max_node_count 値は、クラスタが任意の時点で実行するコンピューティングノードの最大数を決定します。static_node_count 値は、常に実行中のコンピューティング ノードの数を指定します。デフォルトでは、slurm-cluster.yaml ファイルは 10max_node_count を、2static_node_count を設定します。

これら 2 つの数値の差(max_node_count - static_node_count)が、クラスタ内のエフェメラル ノードの数になります。エフェメラル ノードは、ジョブ スケジューリング リクエストに応答してオンデマンドで作成されます。実行するために作成されたジョブが完了すると、クラスタが他のジョブの実行に使用できない場合、ノードは破棄されます。Google Cloud では、Slurm 省電力メカニズムは必要時のみエフェメラル ノードをインスタンス化することでクラスタを自動スケーリングします。

  1. Cloud Shell で、クラスタのログインノードにログインします。

    gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone $CLUSTER_ZONE
    
  2. ノード数を表示します。

    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. クラスタを自動スケーリングするには、3 つのエフェメラル ノードを作成します。

    sbatch -N5 --wrap="srun hostname"
    

    出力は次のようになります。

    Submitted batch job JOB_ID
    
  4. ノード数を再表示します。

    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 つのエフェメラル ノードが作成されたことを示します。追加のノードが作成して構成されると、ジョブが実行され、少し後に破棄されます。

  5. クラスタを終了するには、Control+D を押します。

クリーンアップ

課金を停止する最も簡単な方法は、チュートリアル用に作成した Cloud プロジェクトを削除することです。また、リソースを個別に削除することもできます。

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

Slurm クラスタを削除する

  • クラスタを削除します。

    terraform destroy -var-file=basic.tfvars
    

次のステップ