

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Slurm メモリベースのスケジューリング
<a name="slurm-mem-based-scheduling-v3"></a>

バージョン 3.2.0 以降、 は / [`SlurmSettings`](Scheduling-v3.md#Scheduling-v3-SlurmSettings) [`EnableMemoryBasedScheduling`](Scheduling-v3.md#yaml-Scheduling-SlurmSettings-EnableMemoryBasedScheduling)クラスター設定パラメータを使用したSlurmメモリベースのスケジューリング AWS ParallelCluster をサポートしています。

**注記**  
 AWS ParallelCluster バージョン 3.7.0 以降では、インスタンスで[複数のインスタンスタイプを設定すると、 ](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-Instances)を有効に`EnableMemoryBasedScheduling`できます。  
 AWS ParallelCluster バージョン 3.2.0 から 3.6.*x* では、インスタンスで[複数のインスタンスタイプを設定した場合、 ](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-Instances)を有効にする`EnableMemoryBasedScheduling`ことはできません。

**警告**  
`EnableMemoryBasedScheduling` が有効になっている Slurm キューコンピューティングリソースで複数のインスタンスタイプを指定すると、`RealMemory` の値はすべてのインスタンスタイプで使用できる最小メモリ量になります。これにより、メモリ容量が大きく異なるインスタンスタイプを指定すると、大量の未使用メモリが発生する可能性があります。

`EnableMemoryBasedScheduling: true` では、Slurm スケジューラは各ジョブが各ノードで必要とするメモリ量を追跡します。次に、Slurm スケジューラはこの情報を使用して、同じコンピューティングノード上の複数のジョブをスケジュールします。ノード上でジョブが必要とするメモリの合計量は、使用可能なノードメモリを超えることはできません。スケジューラは、ジョブが、ジョブ送信時に要求された量よりも多くのメモリを使用するのを防ぎます。

`EnableMemoryBasedScheduling: false` を使用すると、ジョブが共有ノード上のメモリを奪い合い、ジョブの失敗や `out-of-memory` のイベントが発生する可能性があります。

**警告**  
Slurm ラベルには MB や GB などの 2 のべき乗表記を使用します。これらのラベルをそれぞれ MiB と GiB として読み取ります。

## Slurm 設定とメモリベースのスケジューリング
<a name="slurm-mem-based-scheduling-config-v3"></a>

`EnableMemoryBasedScheduling: true` では、Slurm は以下の Slurm 設定パラメータを設定します。
+ [https://slurm.schedmd.com/slurm.conf.html#OPT_CR_CPU_Memory](https://slurm.schedmd.com/slurm.conf.html#OPT_CR_CPU_Memory)」(`slurm.conf`) を参照してください。このオプションは、ノードメモリを Slurm で消費可能なリソースとして設定します。
+ Slurm `cgroup.conf` の[https://slurm.schedmd.com/cgroup.conf.html#OPT_ConstrainRAMSpace](https://slurm.schedmd.com/cgroup.conf.html#OPT_ConstrainRAMSpace)。このオプションでは、ジョブのメモリへのアクセスは、ジョブが送信時に要求したメモリ量に制限されます。

**注記**  
これら 2 つのオプションを設定すると、Slurm スケジューラとリソースマネージャの動作に影響する Slurm 設定パラメータが他にもいくつかあります。詳細については、[Slurm のドキュメント](https://slurm.schedmd.com/documentation.html) を参照してください。

## Slurm スケジューラとメモリベースのスケジューリング
<a name="slurm-mem-based-scheduling-scheduler-v3"></a>

**`EnableMemoryBasedScheduling: false` (デフォルト)**

デフォルトで `EnableMemoryBasedScheduling` は false に設定されます。false の場合、Slurm はスケジューリングアルゴリズムにメモリをリソースとして含めず、ジョブが使用するメモリも追跡しません。ユーザーは、ジョブに必要なノードあたりの最小メモリ量を設定する `--mem MEM_PER_NODE` オプションを指定できます。これにより、スケジューラはジョブをスケジューリングするときに、`RealMemory` 値が少なくとも `MEM_PER_NODE` のノードを選択する必要があります。

例えば、ユーザーが `--mem=5GB` のジョブを 2 つ送信したとします。CPU や GPU などの要求されたリソースが使用可能な場合、ジョブは 8 GiB のメモリのノードで同時に実行できます。この 2 つのジョブは、`RealMemory` が 5 GiB 未満のコンピューティングノードではスケジュールされません。

**警告**  
メモリベースのスケジューリングが無効になっている場合、Slurm はジョブが使用するメモリ量を追跡しません。同じノードで実行されるジョブがメモリリソースを奪い合い、他のジョブが失敗する可能性があります。  
メモリベースのスケジューリングが無効になっている場合、[https://slurm.schedmd.com/srun.html#OPT_mem-per-cpu](https://slurm.schedmd.com/srun.html#OPT_mem-per-cpu) または [https://slurm.schedmd.com/srun.html#OPT_mem-per-gpu](https://slurm.schedmd.com/srun.html#OPT_mem-per-gpu) オプションを指定しないことをお勧めします。これらのオプションにより、[Slurm のドキュメント](https://slurm.schedmd.com/documentation.html)に記載している内容とは異なる動作が発生する場合があります。

**`EnableMemoryBasedScheduling: true`**

`EnableMemoryBasedScheduling` を true に設定すると、Slurm は各ジョブのメモリ使用量を追跡し、ジョブが `--mem` 送信オプションで要求された量よりも多くのメモリを使用するのを防ぎます。

前述の例を使用して、ユーザーは `--mem=5GB` のジョブを 2 つ送信します。メモリが 8 GiB のノードでは、ジョブを同時に実行することはできません。これは、必要なメモリの合計量がノードで使用可能なメモリ量よりも多いためです。

メモリベースのスケジューリングが有効になっている場合は、`--mem-per-cpu` と `--mem-per-gpu` は「Slurm documentation」に記載されている内容と一貫した動作をします。例えば、ジョブは `--ntasks-per-node=2 -c 1 --mem-per-cpu=2GB` で送信されます。この場合、Slurm はジョブに合計 4 GiB をノードごとに割り当てます。

**警告**  
メモリベースのスケジューリングが有効になっている場合は、ジョブを送信する際に `--mem` 仕様を含めることをお勧めします。に含まれているSlurmデフォルト設定では AWS ParallelCluster、メモリオプション (`--mem`、、または `--mem-per-gpu`) が含まれていない場合`--mem-per-cpu`、 CPUs は CPU や GPU などの他のリソースの一部のみをリクエストしても、割り当てられたノードのメモリ全体をジョブにSlurm割り当てます。 GPUs これにより、他のジョブに使用できるメモリがなくなるため、ジョブが終了するまでノードを共有できなくなります。これは、ジョブの送信時にメモリ仕様が提供されていないとき、Slurm がジョブのノードあたりのメモリを [https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerNode](https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerNode) に設定するためです。このパラメータのデフォルト値は 0 で、ノードのメモリに無制限にアクセスできるようになっています。  
メモリ量の異なる複数のタイプのコンピューティングリソースが同じキューにある場合、メモリオプションなしで送信されたジョブには、異なるノードに異なる量のメモリが割り当てられる可能性があります。これは、スケジューラがどのノードをジョブに使用できるようにするかによって異なります。ユーザーは、Slurm 設定ファイルのクラスターまたはパーティションレベルで、`DefMemPerNode` や [https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerCPU](https://slurm.schedmd.com/slurm.conf.html#OPT_DefMemPerCPU) のようなオプションのカスタム値を定義して、この動作を防ぐことができます。

## Slurm RealMemory と AWS ParallelCluster SchedulableMemory
<a name="slurm-mem-based-scheduling-realmemory-v3"></a>

に同梱されているSlurm設定では AWS ParallelCluster、 Slurm は [RealMemory](https://slurm.schedmd.com/slurm.conf.html#OPT_RealMemory) をジョブで使用できるノードあたりのメモリ量として解釈します。バージョン 3.2.0 以降、デフォルトでは、 `RealMemory`は [Amazon EC2 インスタンスタイプ](https://aws.amazon.com/ec2/instance-types)にリストされ、Amazon EC2 API [DescribeInstanceTypes](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTypes.html) によって返されるメモリの 95% AWS ParallelCluster に設定します。

メモリベースのスケジューリングが無効な場合、`--mem` を指定したジョブをユーザーが送信すると、Slurm スケジューラは `RealMemory` を使用しノードをフィルタリングします。

メモリーベースのスケジューリングが有効な場合、Slurm スケジューラは `RealMemory` をコンピューティングノード上で実行中のジョブに使用可能な最大メモリー容量と解釈します。

デフォルト設定は、すべてのインスタンスタイプに最適であるとは限りません。
+ この設定は、ノードが実際にアクセスできるメモリ量よりも多い場合があります。これは、コンピューティングノードが小さいインスタンスタイプである場合に発生する可能性があります。
+ この設定は、ノードが実際にアクセスできるメモリ量よりも少ない場合があります。これは、コンピューティングノードが大きいインスタンスタイプの場合に発生し、大量のメモリが未使用のままになる可能性があります。

[`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues) /[`ComputeResources`](Scheduling-v3.md#Scheduling-v3-SlurmQueues-ComputeResources)/ を使用して、コンピューティングノード AWS ParallelCluster 用に によって`RealMemory`設定された の値を[`SchedulableMemory`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-SchedulableMemory)微調整できます。デフォルトをオーバーライドするには、クラスター設定専用に `SchedulableMemory` のカスタム値を定義します。

コンピューティングノードの実際に使用可能なメモリを確認するには、ノード上で `/opt/slurm/sbin/slurmd -C` コマンドを実行します。このコマンドは、[https://slurm.schedmd.com/slurm.conf.html#OPT_RealMemory](https://slurm.schedmd.com/slurm.conf.html#OPT_RealMemory) 値を含むノードのハードウェア設定を返します。詳細については、「[https://slurm.schedmd.com/slurmd.html#OPT_-C](https://slurm.schedmd.com/slurmd.html#OPT_-C)」を参照してください。

コンピューティングノードのオペレーティングシステムプロセスに十分なメモリがあることを確認してください。そのためには、`SchedulableMemory` 値を、`slurmd -C` コマンドが返した `RealMemory` 値よりも小さく設定してジョブが使用できるメモリを制限します。