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

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

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

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

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

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

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

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

目標

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

費用

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

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

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

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

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

  3. Google 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_DEPLOY_NAME="cluster-deployment-name"
    export CLUSTER_NAME="cluster-name"
    export CLUSTER_REGION="cluster-region"
    export CLUSTER_ZONE="cluster-zone"
    

    次のように置き換えます。

    • cluster-deployment-name: クラスタ デプロイの一意の名前。
    • cluster-name: クラスタの一意の名前。
    • cluster-region: クラスタをデプロイするリージョン。ロケーションに近いリージョンを選択します。詳細については、リージョンとゾーンをご覧ください。
    • cluster-zone: クラスタをデプロイするゾーン。
  3. slurm-gcp フォルダで、slurm-cluster.yaml ファイルを ${CLUSTER_DEPLOY_NAME}.yaml ファイルにコピーします。

    cd slurm-gcp
    cp slurm-cluster.yaml ${CLUSTER_DEPLOY_NAME}.yaml
    
  4. テキスト エディタで、環境に合わせて ${CLUSTER_DEPLOY_NAME}.yaml ファイルを変更します。default_users 値を除くすべての構成プロパティに許可されるデフォルト値と使用可能な値を指定する slurm.jinja.schema ファイルで定義されているタイプを使用します。次のとおり必要な変更を行います。

    • cluster_name: クラスタの名前を cluster-name に変更します。
    • regionzone: cluster-regioncluster-zone に置き換えます。
    • compute_machine_type: (省略可)別のマシンタイプを使用する場合は、compute_machine_type 値を変更します。たとえば、デフォルト設定の n1-standard-2 で使用可能な CPU コアやメモリよりも多くが必要な場合は、n1-standard-4 を選択します。詳細については、マシンタイプをご覧ください。
    • vpc_netvpc_subnet: (省略可)既存の Virtual Private Cloud(VPC)ネットワークと VPC サブネットを使用します。ネットワークとサブネットの要件については、slurm.jinja.schema ファイルで説明します。値を指定しない場合、クラスタ用に新しいネットワークまたはサブネットが作成されます。詳細については、VPC ネットワークをご覧ください。
  5. ファイルを保存します。

Deployment Manager を使用した Slurm クラスタのデプロイ

  1. Cloud Shell で、Deployment Manager を使用してクラスタを Google Cloud にデプロイします。

    gcloud deployment-manager deployments \
        --project="$(gcloud config get-value core/project)" \
        create $CLUSTER_DEPLOY_NAME \
        --config ${CLUSTER_DEPLOY_NAME}.yaml
    

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

    The fingerprint of the deployment is VWVaIYX1mFpjv9UDhzalYQ==
    Waiting for create [operation-1582142432278-59ef33da8f6fa-f5785d68-21feb545]...done.
    Create operation operation-1582142432278-59ef33da8f6fa-f5785d68-21feb545 completed successfully.
    NAME                                   TYPE                   STATE       ERRORS  INTENT
    helloworld-all-internal-firewall-rule  compute.v1.firewall    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-compute-image               compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-compute1                    compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-compute2                    compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-controller                  compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-login1                      compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-router                      compute.v1.router      IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-slurm-network               compute.v1.network     IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-slurm-subnet                compute.v1.subnetwork  IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-ssh-firewall-rule           compute.v1.firewall    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    
  2. クラスタの構成が完了するまでに 5~10 分かかります。構成の進行状況をトラッキングします。

    gcloud compute ssh ${CLUSTER_NAME}-controller \
        --command "sudo journalctl -fu google-startup-scripts.service" \
        --zone $CLUSTER_ZONE
    

    スクリプトが終了すると、Slurm クラスタを使用できるようになります。出力は次の行で終了します。

    Started Google Compute Engine Startup Scripts.
    
  3. 構成の監視を停止するには、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_NAME}-login1 \
        --command 'sbatch -N2 --wrap="srun hostname"' --zone $CLUSTER_ZONE
    
    gcloud compute ssh ${CLUSTER_NAME}-login1 \
        --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 で、ノード数を表示します。

    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 つのエフェメラル ノードが省電力モードであることを示します。

  2. クラスタを自動スケーリングするには、3 つのエフェメラル ノードを作成します。

    sbatch -N5 --wrap="srun hostname"
    

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

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

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

クリーンアップ

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

プロジェクトの削除

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

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

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

Slurm クラスタを削除する

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

    gcloud deployment-manager deployments delete slurm
    

次のステップ