SLURMの `srun`と` sbatch`およびそれらのパラメーター


100

SLURMsrunsbatchコマンドの違いを理解しようとしています。以下の質問に対する具体的な回答ではなく、一般的な説明に満足しますが、ここでは、出発点となり、私が探しているもののアイデアを与えることができるいくつかの具体的な混乱のポイントを示します。

ドキュメントによると、srunはジョブsbatchを送信するためのものであり、後で実行するためにジョブを送信するためのものですが、実際の違いは私にはわかりません。それらの動作は同じようです。たとえば、それぞれ2つのCPUを備えた2つのノードを持つクラスターがあります。srun testjob.sh &5xを続けて実行すると、CPUが使用可能になるまで、5番目のジョブがうまくキューに入れられますsbatch testjob.sh

質問をより具体的にするために、私は始めるのに良い場所かもしれないと思います:私が他ではできないことの1つで私ができることは何ですか、そしてなぜですか?

両方のコマンドの引数の多くは同じです。最も関連性の高いように見えるものがあります--ntasks--nodes--cpus-per-task--ntasks-per-nodeこれらは互いにどのように関連しており、srunvsではどのように異なりますsbatchか?

1つの特定の違いは、実行可能権限がないsrun場合、testjob.shつまりchmod +x testjob.sh、実行可能ファイルsbatchを正常に実行するとエラーが発生することです。これを引き起こす「内部」で何が起こっているのでしょうか。

ドキュメントにsrunは、sbatchスクリプト内で一般的に使用されるものについても記載されています。これは、次の質問につながります。それらはどのように相互作用し、それぞれの「標準的な」ユースケースは何ですか?具体的にはsrun、単独で使用することはありますか?

回答:


116

ドキュメントには

srun is used to submit a job for execution in real time

一方

sbatch is used to submit a job script for later execution.

これらは両方とも、実質的に同じパラメータのセットを受け入れます。主な違いは、srunインタラクティブでブロッキング(端末で結果を取得し、完了するまで他のコマンドを記述できない)であるのに対しsbatch、バッチ処理と非ブロッキング(結果はファイルに書き込まれ、他のコマンドを送信できる)です。直ちに)。

srunバックグラウンドで&記号を使用して使用する場合は、の「ブロック」機能を削除しますsrun。これはインタラクティブになりますが、非ブロックになります。ただし、それでもインタラクティブです。つまり、出力によって端末が乱雑になり、srunプロセスが端末にリンクされます。切断すると、それらの制御が失われるか、(stdout基本的に使用するかどうかに応じて)殺される可能性があります 。また、ジョブを送信するために接続するマシンが再起動されると、それらは強制終了されます。

を使用する場合はsbatch、ジョブを送信すると、Slurmによって処理されます。切断したり、端末を強制終了したりすることはできますが、影響はありません。ジョブは実行中のプロセスにリンクされなくなりました。

一方ではできること、もう一方ではできないことは何ですか?その理由は何ですか?

利用できる機能と利用できsbatchない機能srunは、仕事の延滞です。srun内で使用できるsbatchスクリプト、あなたが行うことができないということは何もありませんsbatch

これらは互いにどのように関連しており、srunとsbatchではどのように異なりますか?

すべてのパラメータは--ntasks--nodes--cpus-per-task--ntasks-per-nodeどちらのコマンドで同じ意味を持ちます。これは、--exclusive。を除いて、ほぼすべてのパラメータに当てはまります。

これを引き起こす「内部」で何が起こっているのでしょうか。

srunスクリプトをリモートホストですぐに実行し、スクリプトをsbatch内部ストレージにコピーして、ジョブの開始時に計算ノードにアップロードします。これは、送信後に送信スクリプトを変更することで確認できます。変更は考慮されません(これを参照)。

それらはどのように相互作用し、それぞれの「標準的な」ユースケースは何ですか?

通常sbatch、ジョブの送信に使用し、送信srunスクリプトでSlurmが呼び出すジョブステップを作成します。srunプロセスを起動するために使用されます。プログラムが並列MPIプログラムの場合は、srunすべてのMPIプロセスの作成を処理します。そうでない場合は、オプションでsrun指定された回数だけプログラムを実行し--ntasksます。あなたのプログラムを並列か、実行時間の長い時間を持っているか、特に指定しない限り、など、単一の実行可能かどうかで構成されていないかどうかに応じて、多くのユースケース、がありsrun、デフォルトで継承の適切なオプションsbatchsalloc、それが実行されます下(ここから)。

具体的には、srunを単独で使用することはありますか?

小規模なテストを除いて、いいえ。一般的な使用法はsrun --pty bash、計算ジョブでシェルを取得することです。


6
答えてくれてありがとう、これは私が望んでいた何よりも良いです。これは私の最初の混乱のポイントの1つだったので、1つのフォローアップ:なぜ送信srunスクリプト内でわざわざ呼び出すのですか?おそらく私は「仕事のステップ」の意味について混乱しています。たとえば、runjob.shを含むと呼ばれるスクリプト#!/bin/bash srun myjob.shがある場合、sbatch runjob.sh(a)と(b)sbatch myjob.shと(c)srun myjob.shと(d)の呼び出しには実際的な違いがありsrun runjob.shますか?(明らかに最後のものはばかげていますが、私は興味があります)。
dkv 2017

3
送信スクリプト内でsrunがどのように使用されるかについてのアイデアについて、最近配信したトレーニングセッションのスライドを参照できます:cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf
damienfrancois 2017

5
スライドのすべての例(およびCECIページのチュートリアル)は、送信スクリプトsrun内で使用されているようですsbatch。ただし、srun送信スクリプトに含まれていないコマンドも同じように実行されることがわかりました。私が上で述べた4つの呼び出しの間に実際に違いはありますか?
dkv 2017

9
すべての例は、(1)割り当てが1つのCPUに対するものであり、(2)プログラムが純粋にシーケンシャルである場合にのみ、同じ方法で実行されます。違いを確認するには、複数のタスクをリクエストしてください。もう1つの違いは、sbatchでsrunを使用しない場合、sstatコマンドは有用な情報を返さないことです
damienfrancois 2017年

1
@Atcoldこのバージョンはより最新の可能性があります:github.com/damienfrancois/slurm-helper/blob/master/slurm.vim
damienfrancois

5

これは実際には質問に完全に答えるものではありませんが、将来誰かに役立つかもしれないと私が見つけたいくつかの情報があります:


私が同様の質問で見つけ関連スレッドから:

簡単に言うと、sbatchとsallocはリソースをジョブに割り当て、srunはそれらのリソース間で並列タスクを起動します。srunは、ジョブ割り当て内で呼び出されると、割り当てられたリソースの一部またはすべてで並列タスクを起動します。その場合、srunは、デフォルトで、実行されるsbatchまたはsallocの関連オプションを継承します。次に、(通常)srunにさまざまなオプションを提供して、デフォルトで受け取るものをオーバーライドできます。ジョブ内でsrunを呼び出すたびに、ジョブステップと呼ばれます。

srunは、ジョブ割り当ての外部で呼び出すこともできます。その場合、srunはリソースを要求し、それらのリソースが付与されると、単一のジョブおよびジョブステップとしてそれらのリソース全体でタスクを起動します。

-Bおよび--exclusiveオプションに関してより詳細に説明している比較的新しいWebページがあります。

doc / html / cpu_management.shtml


SLURMFAQページからの追加情報。

srunコマンドには、2つの異なる動作モードがあります。まず、既存のジョブ内で実行されていない場合(つまり、sallocまたはsbatchによって作成されたSlurmジョブ割り当て内にない場合)、ジョブ割り当てが作成され、アプリケーションが生成されます。既存の割り当て内で実行された場合、srunコマンドはアプリケーションを生成するだけです。この質問では、最初の操作モードについてのみ説明し、sbatchコマンドとsrunコマンドを使用してジョブ割り当てを作成する方法を比較します。

srunコマンドは、誰かが出力を監視するインタラクティブな使用のために設計されています。アプリケーションの出力は、通常はユーザーの端末でsrunコマンドの出力として表示されます。sbatchコマンドは、後で実行するためにスクリプトを送信するように設計されており、その出力はファイルに書き込まれます。ジョブ割り当てで使用されるコマンドオプションはほとんど同じです。オプションの最も顕著な違いは、sbatchコマンドがジョブ配列の概念をサポートしているのに対し、srunはサポートしていないことです。もう1つの重要な違いは、フォールトトレランスです。sbatchジョブに関連する障害は通常、ジョブが再キューイングされて再度実行される結果になりますが、srunに関連する障害は通常、ユーザーが適切な方法で応答することを期待してエラーメッセージが生成される結果になります。


ここで別の関連する会話

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.