0

私のワークフローは、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 で動的ルールを作成する自分のプロジェクトを指摘しました。次に、これらの線に沿って何かを試します。

理想的なソリューションは、一連の出力ファイルを生成する単一のルールですが、それらのファイルをバッチで生成できます。バッチの数は、構成パラメーターによって設定されます。

ここで誰かが同様の状況に遭遇しましたか? どんな考えやアイデアでも大歓迎です!

4

1 に答える 1