私のワークフローは、2 つの異なるクラスターで実行する必要があります。最初のクラスターは、リソースの可用性に基づいてジョブをノードにスケジュールします。2 番目のクラスターは、特定のジョブ用にノード全体を予約し、ジョブ スクリプト内でそれらの複数のコアを効率的に使用するようユーザーに要求します。2 番目のクラスターでは、少数のジョブを送信し、プロセスをバックグラウンドでスタックすることが一般的です。
おもちゃの例として、作成したい 4 つのファイルがあるとします。
SAMPLES = [1, 2, 3, 4]
rule all:
input:
expand("sample.{sample}", sample=SAMPLES)
rule normal_create_files:
input:
output:
expand("sample.{sample}", sample=SAMPLES)
shell:
"touch {output}"
これは、サンプルごとに 1 つのジョブで並行して実行できます。
それぞれ 1 つのファイルを作成する 4 つのジョブに加えて、それぞれ 2 つのファイルを作成する 2 つのジョブを使用できるようにしたいと考えています。
私はいくつかのアイデアを試しましたが、あまりうまくいきませんでした。次のワークフローは、バッチを作成し、各バッチ内のバックグラウンド プロセスとしてジョブを起動する点を除いて、上記と同じです。
rule all:
input:
expand("sample.{sample}", sample=SAMPLES)
rule stacked_create_files:
input:
output:
"sample.{sample}"
run:
import subprocess as sp
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]
pids = []
for chunk in chunks({output}.pop(), 2):
for sample in chunk:
pids.append(sp.Popen(["touch", sample]))
exit_codes = [p.wait() for p in pids]
ただし、これでも 4 つのジョブが作成されます。
また、関連するトピックに関するメーリング リストで、Karel Brinda の応答に出くわしました。彼は、Python で動的ルールを作成する自分のプロジェクトを指摘しました。次に、これらの線に沿って何かを試します。
理想的なソリューションは、一連の出力ファイルを生成する単一のルールですが、それらのファイルをバッチで生成できます。バッチの数は、構成パラメーターによって設定されます。
ここで誰かが同様の状況に遭遇しましたか? どんな考えやアイデアでも大歓迎です!