KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

SLURMのメモリ指定(管理)

登録日 :2024/07/24 19:38
カテゴリ :SLURM

[#SBATCH --mem=0 ]は、SLURMジョブスクリプトにおいて特別な意味を持つメモリ指定です。

この設定の意味と効果は以下の通りです:
無制限のメモリ使用:
--mem=0 は、ジョブに対してメモリ制限を設定しないことを意味します。つまり、ジョブは利用可能な全てのメモリを使用することができます。
ノード全体のメモリ:
この設定は、ジョブがノード上の全てのメモリにアクセスできることを示します。実際に利用可能なメモリ量は、ノードの物理的なメモリ容量に依存します。
排他的ノード使用:
多くの場合、この設定はノード全体を排他的に使用することを意味します。他のジョブがそのノードで同時に実行されることはありません。
リソース管理の注意点:
この設定は慎重に使用する必要があります。不適切な使用は、システムの安定性に影響を与える可能性があります。
共有環境では、この設定の使用が制限または禁止されている場合があります。
適用例:
大規模なデータ処理や、メモリ要求が動的に変化するジョブに適しています。
メモリ使用量が予測困難な場合に使用されることがあります。
システム管理者の設定:
一部のシステムでは、管理者がこの設定の使用を制限している場合があります。
実際の動作はクラスタの設定に依存する場合があります。
代替設定:
特定のメモリ量を指定する(例:--mem=100G)方が、リソース管理の観点からは推奨されます。
--mem=0 の使用は、ジョブの要件とシステムのポリシーに応じて慎重に検討する必要があります。可能な限り、具体的なメモリ要求を指定することが推奨されます

[#SBATCH --mem=0 の記述がない場合]

以下のようになります:
デフォルト値の適用:
SLURMは通常、デフォルトのメモリ制限を適用します。これは一般的に非常に低く設定されています(例:100MB/ノード)。
システム設定の使用:
クラスタの設定によっては、特定のパーティションやQoS(Quality of Service)に基づいたデフォルトのメモリ制限が適用される場合があります。
制限された実行:
ジョブが利用可能なメモリを超えて使用しようとすると、「Exceeded job memory limit」というエラーで終了する可能性があります。
パフォーマンスの影響:
メモリ制限が低すぎる場合、ジョブのパフォーマンスが著しく低下したり、予期せず終了したりする可能性があります。
スケジューリングへの影響:
明示的なメモリ要求がないため、SLURMスケジューラがジョブを効率的に配置できない可能性があります。
ユーザーの責任:
適切なメモリ要求を指定することは、ジョブの正常な実行とシステムリソースの効率的な利用のために重要です。
したがって、#SBATCH --mem=0 の記述がない場合、ジョブに十分なメモリが割り当てられない可能性があります。ジョブの要件に応じて適切なメモリ量を指定することが推奨されます。例えば、#SBATCH --mem=4000 のように具体的な値を指定することで、ジョブに4000MBのメモリを割り当てることができます

--mem=0を指定しない場合のデフォルトのメモリ割り当て

SLURMの設定やクラスタの構成によって異なります。一般的には以下のようになります:
システムデフォルト値:
多くのシステムでは、デフォルトで非常に低い値(例:100MB/ノード)が設定されています。
パーティション/QoSベースの設定:
クラスタの設定によっては、特定のパーティションやQuality of Service (QoS)に基づいたデフォルトのメモリ制限が適用される場合があります。
ノードの利用可能メモリ:
一部のシステムでは、ノードの利用可能なメモリ全体がデフォルトで割り当てられることがあります。ただし、これはシステムの設定に大きく依存します。
明示的な指定の重要性:
デフォルト値が低く設定されている場合が多いため、ジョブの要件に応じて適切なメモリ量を明示的に指定することが推奨されます。
システム管理者による設定:
具体的なデフォルト値は、システム管理者によって設定されており、クラスタごとに異なる可能性があります。
したがって、--mem=0を指定しない場合のデフォルトのメモリ割り当ては、システムによって大きく異なる可能性があります。ジョブの正常な実行とシステムリソースの効率的な利用のために、ジョブの要件に応じて適切なメモリ量を明示的に指定することが強く推奨されます。
具体的なデフォルト値については、使用しているクラスタのドキュメントを確認するか、システム管理者に問い合わせることが最も確実な方法です。

SLURMシステムのデフォルト設定を確認するには、以下の方法があります:

scontrol コマンドの使用:

scontrol show config 

コマンドを実行すると、現在のSLURMの設定情報が表示されます。
これには、デフォルトのパーティション、メモリ制限、時間制限などの情報が含まれます。
slurmd -C コマンドの使用:
計算ノード上で

slurmd -C 

コマンドを実行すると、そのノードの設定情報(CPUコア数、メモリ量など)が表示されます。
sinfo コマンドの使用:
sinfo コマンドを使用すると、パーティションの情報やノードの状態を確認できます。
例えば、

sinfo -o "%P %l %c %m" 

とすると、パーティション名、時間制限、CPUコア数、メモリ量が表示されます。
slurm.conf ファイルの確認:
通常 /etc/slurm/slurm.conf にある設定ファイルを直接確認することで、システム全体の設定を見ることができます。
sacctmgr コマンドの使用:

sacctmgr show qos format=name,maxtresperuser%30,priority 

のようなコマンドを使用して、Quality of Service (QoS) の設定を確認できます。
scontrol show partition コマンド:

scontrol show partition 

コマンドを使用すると、各パーティションの詳細な設定を確認できます。
これらのコマンドを使用することで、SLURMシステムのデフォルト設定や現在の設定状況を確認することができます。ただし、一部のコマンドは管理者権限が必要な場合があるため、一般ユーザーが使用できない場合もあります。

appendix

scontrol show configコマンドの出力では、メモリのシステム上限を直接示す項目はありません。しかし、関連する情報を以下の項目から推測することができます:
MaxMemPerCPU:
これはCPUあたりの最大メモリ量を示します。システム全体のメモリ上限ではありませんが、ノードあたりのメモリ制限の目安になります。
MaxMemPerNode:
ノードあたりの最大メモリ量を示します。これもシステム全体の上限ではありませんが、ノードレベルでの制限を把握するのに役立ちます。
RealMemory:
各ノードの実際のメモリ量を示します。これはノードごとに設定される可能性があり、システム全体のメモリ容量を計算するための基礎になります。
TotalRealMemory:
クラスタ全体の実メモリ総量を示します。これがシステム全体で利用可能なメモリの最大値に最も近い値となります。
システム全体のメモリ上限を正確に知るためには、以下の方法を組み合わせるのが良いでしょう:
scontrol show configの出力を確認する
sinfo -o "%n %m"コマンドを使用して各ノードのメモリ情報を取得する
slurm.confファイルを直接確認する
システム管理者に問い合わせる
これらの情報を総合的に判断することで、システムのメモリ上限をより正確に把握することができます。

Sample

[root@headnode ~]# scontrol show config | grep Mem
DefMemPerNode = UNLIMITED
MaxMemPerNode = UNLIMITED
[root@headnode ~]#

この出力結果は、システム上でメモリに関する制限が設定されていないことを示しています。
DefMemPerNode = UNLIMITED
これは、ノードあたりのデフォルトのメモリ割り当てが無制限であることを意味します。
ジョブがメモリ要求を明示的に指定しない場合、理論上はノードの全メモリを使用できます。
MaxMemPerNode = UNLIMITED
これは、ノードあたりの最大メモリ割り当てが無制限であることを示しています。
ジョブは理論上、ノードの物理的な最大メモリまで使用することができます。
この設定の意味するところ:
柔軟性:ジョブは必要に応じて利用可能な全メモリを使用できます。
リスク:メモリ使用量の制御が個々のジョブに委ねられるため、1つのジョブが過剰にメモリを消費する可能性があります。
管理の重要性:ユーザーやジョブスクリプトでの適切なメモリ管理が重要になります。
注意点:
実際のメモリ使用量は、ノードの物理的なメモリ容量によって制限されます。
システム全体の安定性のために、個々のジョブで適切なメモリ要求を指定することが推奨されます。
管理者が他の方法(例:cgroups)でメモリ制限を実装している可能性もあるため、完全に制限がないわけではない場合もあります。
このような設定では、ユーザーが責任を持ってメモリリソースを適切に管理することが重要です。