次の方法で共有


Slurm

Slurm は、高度に構成可能なオープンソースワークロード マネージャーです。 概要については、 Slurm プロジェクト サイト を参照してください。

注意

CycleCloud 8.4.0 の時点で、Slurm 統合は新しい機能をサポートするように書き換えられます。 詳細については、 Slurm 3.0 のドキュメントを参照してください。

クラスター定義の構成セクションで "run_list" を変更することで、CycleCloud クラスターで Slurm を簡単に有効にすることができます。 Slurm クラスターの 2 つの基本的なコンポーネントは、Slurm ソフトウェアを実行する共有ファイルシステムを提供する 'master' (または 'scheduler') ノードと、共有ファイルシステムをマウントして送信されたジョブを実行するホストである 'execute' ノードです。 たとえば、単純なクラスター テンプレート スニペットは次のようになります。

[cluster custom-slurm]

[[node master]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A4 # 8 cores

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:master]]]
    [[[configuration]]]
    run_list = role[slurm_master_role]

[[nodearray execute]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A1  # 1 core

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:execute]]]
    [[[configuration]]]
    run_list = role[slurm_master_role]
    slurm.autoscale = true
    # Set to true if nodes are used for tightly-coupled multi-node jobs
    slurm.hpc = true
    slurm.default_partition = true

クラスター定義の構成セクションで "run_list" を変更することで、CycleCloud クラスターで Slurm を簡単に有効にすることができます。 Slurm クラスターの 2 つの基本的なコンポーネントは、Slurm ソフトウェアを実行する共有ファイルシステムを提供する "スケジューラ" ノードと、共有ファイルシステムをマウントして送信されたジョブを実行するホストである "execute" ノードです。 たとえば、単純なクラスター テンプレート スニペットは次のようになります。

[cluster custom-slurm]

[[node scheduler]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A4 # 8 cores

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:scheduler]]]
    [[[configuration]]]
    run_list = role[slurm_scheduler_role]

[[nodearray execute]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A1  # 1 core

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:execute]]]
    [[[configuration]]]
    run_list = role[slurm_scheduler_role]
    slurm.autoscale = true
    # Set to true if nodes are used for tightly-coupled multi-node jobs
    slurm.hpc = true
    slurm.default_partition = true

既存の Slurm クラスターの編集

CycleCloud バージョン 7.8 以降で実行されている Slurm クラスターでは、クラスターが複数の nodearray とパーティションを利用できるようにする、更新されたバージョンの自動スケーリング API が実装されています。 Slurm でこの機能を容易にするために、CycleCloud によってクラスター内の実行ノードが事前に設定されます。 このため、自動スケーリングの制限や VM の種類など、クラスターに変更を加えた後、Slurm スケジューラ ノードでコマンドを実行する必要があります。

クラスターの変更

CycleCloud にデプロイされた Slurm クラスターには、これを容易にするスクリプトが含まれています。 クラスターに変更を加えたら、Slurm スケジューラ ノードでルートとして (たとえば、 を実行 sudo -iして) 次を実行して、 を再構築 slurm.conf し、クラスター内のノードを更新します。

/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale

注意

CycleCloud バージョン < 7.9.10 の場合、 cyclecloud_slurm.sh スクリプトは /opt/cycle/jetpack/system/bootstrap/slurm にあります。

重要

MPI パーティション内のノード (VM サイズ、イメージ、cloud-init など) の VM に影響を与える変更を行う場合、ノードはすべて最初に終了 する必要があります 。 この場合、コマンドは remove_nodes 警告を出力しますが、エラーで終了することはありません。 実行中のノードがある場合は、新しいノードが開始されたときに の This node does not match existing scaleset attribute エラーが発生します。

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

注意

CycleCloud バージョン < 8.2 の場合、 cyclecloud_slurm.sh スクリプトは /opt/cycle/jetpack/system/bootstrap/slurm にあります。

MPI パーティション内のノード (VM サイズ、イメージ、cloud-init など) の VM に影響を与える変更を行い、ノードが実行されている場合は、新しいノードが開始されたときの This node does not match existing scaleset attribute エラーが発生します。 このため、コマンドは apply_changes ノードが終了していることを確認し、そうでない場合は次のエラー メッセージで失敗します。 変更を適用する前に、次のノードを完全に終了する必要があります

MPI ノードの VM プロパティに影響しない変更を行う場合は、最初に実行中のノードを終了する必要はありません。 この場合は、次の 2 つのコマンドを使用して変更を行うことができます。

/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale

注意

このコマンドは apply_changes CycleCloud 8.3 以降にのみ存在するため、以前のバージョンで変更を行う唯一の方法は、上記 remove_nodes + scale のコマンドを使用することです。 コマンドで、終了する remove_nodes 必要があるノードに関する警告が出力されていないことを確認します。

追加のパーティションの作成

Azure CycleCloud に付属する既定のテンプレートには、2 つのパーティション (hpchtc) があり、Slurm パーティションに直接マップするカスタム nodearray を定義できます。 たとえば、GPU パーティションを作成するには、クラスター テンプレートに次のセクションを追加します。

    [[nodearray gpu]]
    MachineType = $GPUMachineType
    ImageName = $GPUImageName
    MaxCoreCount = $MaxGPUExecuteCoreCount
    Interruptible = $GPUUseLowPrio
    AdditionalClusterInitSpecs = $ExecuteClusterInitSpecs

        [[[configuration]]]
        slurm.autoscale = true
        # Set to true if nodes are used for tightly-coupled multi-node jobs
        slurm.hpc = false

        [[[cluster-init cyclecloud/slurm:execute:2.0.1]]]
        [[[network-interface eth0]]]
        AssociatePublicIpAddress = $ExecuteNodesPublic

メモリ設定

CycleCloud では、スケジュール設定のために Slurm で使用できるメモリの量が自動的に設定されます。 使用可能なメモリの量は、Linux カーネルオプションが異なるためにわずかに変化する可能性があり、OS と VM はジョブで使用できる少量のメモリを使い切ることができるため、CycleCloud は Slurm 構成のメモリ量を自動的に減らします。 既定では、CycleCloud は VM で報告された使用可能なメモリの 5% を保持しますが、この値は、保持するメモリの割合に設定 slurm.dampen_memory することで、クラスター テンプレートでオーバーライドできます。 たとえば、VM のメモリの 20% を保持するには、次のようにします。

    slurm.dampen_memory=20

特定のノードまたはパーティションの自動スケーリングを無効にする

組み込みの CycleCloud "KeepAlive" 機能は現在、Slurm クラスターでは機能しませんが、slurm.conf ファイルを直接編集することで、実行中の Slurm クラスターの自動スケーリングを無効にすることができます。 個々のノードまたはパーティション全体を自動スケーリングから除外できます。

ノードの除外

ノードまたは複数のノードを自動スケーリングから除外するには、Slurm 構成ファイルに を追加 SuspendExcNodes=<listofnodes> します。 たとえば、ノード 1 と 2 を hpc パーティションから除外するには、 に /sched/slurm.conf次を追加します。

SuspendExcNodes=hpc-pg0-[1-2]

次に、 slurmctld 新しい構成を有効にするためにサービスを再起動します。

パーティションの除外

自動スケーリングからパーティション全体を除外することは、ノードの除外と似ています。 パーティション全体 hpc を除外するには、 に次を追加します。 /sched/slurm.conf

SuspendExcParts=hpc

その後、slurmctld サービスを再起動します。

トラブルシューティング

Slurm ユーザーと Munge ユーザーの UID の競合

既定では、このプロジェクトでは、Slurm ユーザーには UID と GID 11100、Munge ユーザーには 11101 が使用されます。 これにより、別のユーザーまたはグループとの競合が発生した場合、これらの既定値がオーバーライドされる可能性があります。

UID と GID をオーバーライドするには、両方のノードの編集ボタンを scheduler クリックします。

スケジューラの編集スケジューラ

スケジューラの編集スケジューラ

execute nodearray: Nodearray の編集 nodearray

次の属性を セクションに Configuration 追加します。

構成の編集 構成

    slurm.user.name = slurm
    slurm.user.uid = 11100
    slurm.user.gid = 11100
    munge.user.name = munge
    munge.user.uid = 11101
    munge.user.gid = 11101

自動スケール

CycleCloud では、Slurm の エラスティック コンピューティング機能が 使用されます。 自動スケーリングの問題をデバッグするには、スケジューラ ノードにいくつかのログをチェックできます。 1 つ目は、 をチェック /var/log/slurmctld/slurmctld.logして、省電力再開呼び出しが行われていることを確認します。 次のような行が表示されます。

[2019-12-09T21:19:03.400] power_save: pid 8629 waking nodes htc-1

チェックするもう 1 つのログは です/var/log/slurmctld/resume.log。 再開ステップが失敗した場合は、 もあります /var/log/slurmctld/resume_fail.log。 不明または無効なノード名に関するメッセージがある場合は、上記の「クラスターの変更」セクションの手順に従わずに、クラスターにノードを追加していないことを確認してください。

Slurm 構成リファレンス

以下に、機能をカスタマイズするために切り替えることができる Slurm 固有の構成オプションを示します。

Slurm 固有の構成オプション 説明
slurm.version 既定値: '18.08.7-1' です。 これは、インストールして実行する Slurm バージョンです。 これは現在、既定の 唯一 のオプションです。 今後、Slurm ソフトウェアの追加バージョンがサポートされる可能性があります。
slurm.autoscale 既定値: 'false' です。 これは、Slurm がこの nodearray 内のノードを自動的に停止および開始するかどうかを制御する nodearray ごとの設定です。
slurm.hpc 既定値: 'true' です。 これは、nodearray 内のノードを同じ配置グループに配置するかどうかを制御する nodearray ごとの設定です。 主に InfiniBand で VM ファミリを使用する nodearray に使用されます。 slurm.autoscale が 'true' に設定されている場合にのみ適用されます。
slurm.default_partition 既定値: 'false' です。 これは、nodearray がパーティションを明示的に要求しないジョブの既定のパーティションにするかどうかを制御する nodearray ごとの設定です。
slurm.dampen_memory 既定値: '5' です。 OS/VM のオーバーヘッドを抑えるメモリの割合。
slurm.suspend_timeout 既定値は '600' です。 中断呼び出しから、そのノードを再度使用できるまでの時間 (秒単位)。
slurm.resume_timeout 既定値: '1800'。 ノードが正常に起動するまでの時間 (秒単位)。
slurm.install 既定値: 'true' です。 ノードの起動時に Slurm がインストールされているかどうかを判断します ('true')。 Slurm がカスタム イメージにインストールされている場合は、これを 'false' に設定する必要があります。 (proj バージョン 2.5.0 以降)
slurm.use_pcpu 既定値: 'true' です。 これは、ハイパースレッド化された vcpu を使用してスケジュールを制御するための nodearray ごとの設定です。 cyclecloud.conf で CPU=vcpus を設定するには、'false' に設定します。
slurm.user.name 既定値: 'slurm'。 これは、使用する Slurm サービスのユーザー名です。
slurm.user.uid 既定値は '11100' です。 Slurm ユーザーに使用するユーザー ID。
slurm.user.gid 既定値は '11100' です。 Slurm ユーザーに使用するグループ ID。
munge.user.name 既定値: 'munge'。 これは、MUNGE 認証サービスで使用するユーザー名です。
munge.user.uid 既定値: '11101'。 MUNGE ユーザーに使用するユーザー ID。
munge.user.gid 既定値: '11101'。 MUNGE ユーザーに使用するグループ ID。

CycleCloud では、スケジューラ間で自動停止属性の標準セットがサポートされています。

属性 説明
cyclecloud.cluster.autoscale.stop_enabled このノードで自動停止は有効になっていますか? [true/false]
cyclecloud.cluster.autoscale.idle_time_after_jobs ノードがスケールダウンされるまでのジョブの完了後にアイドル状態になる時間 (秒単位)。
cyclecloud.cluster.autoscale.idle_time_before_jobs ノードがスケールダウンされるまでのジョブを完了するまでのアイドル状態の時間 (秒単位)。