2

私はPBSベースのクラスターを使用しており、ノードのセット上でIPythonを並列に実行しています。各ノードは、24または32コアで、メモリは24Gから72Gの範囲です。この不均一性は、クラスターに履歴があるためです。さらに、さまざまなリソース要件(コアとメモリ)を持つIPythonクラスターに送信するジョブがあります。リソース要件と使用可能なエンジンのリソース要件を知っているジョブをipythonクラスターに送信する方法を探しています。IPython機能を使用してこの状況に適切に対処する方法があると思いますが、私はそれを見つけていません。続行する方法について何か提案はありますか?

4

1 に答える 1

5

すでに取得していることを示すグラフの依存関係に加えて、IPythonタスクは機能的な依存関係を持つことができます。これらは、タスク自体のように、任意の関数にすることができます。機能依存関係は実際のタスクの前に実行され、Falseを返すか、特別なparallel.UnmetDependency例外が発生した場合、タスクはそのエンジンで実行されず、別の場所で再試行されます。

したがって、これを使用するには、必要なメトリックをチェックする関数が必要です。たとえば、最小限のメモリを備えたノードでのみタスクを実行したいとします。システムの合計メモリ(バイト単位)をチェックする関数は次のとおりです。

def minimum_mem(limit):
    import sys
    if sys.platform == 'darwin': # or BSD in general?
        from subprocess import check_output
        mem = int(check_output(['sysctl', '-n', 'hw.memsize']))
    else: # linux
        with open("/proc/meminfo") as f:
            for line in f:
                if line.startswith("MemTotal"):
                    mem = 1024 * int(line.split()[1])
                    break
    return mem >= limit

kB = 1024.
MB = 1024 * kB
GB = 1024 * MB

したがってminimum_mem(4 * GB)、システムに少なくとも4GBのメモリがある場合は、Trueが返されます。合計メモリではなく使用可能なメモリを確認する場合は、/ proc / meminfoのMemFree値とInactive値を使用して、まだ使用されていないものを判別できます。

@parallel.dependこれで、デコレータを適用することにより、十分なRAMを備えたエンジンにのみタスクを送信できます。

@parallel.depend(minimum_mem, 8 * GB)
def big_mem_task(n):
    import os, socket
    return "big", socket.gethostname(), os.getpid(), n

amr = view.map(big_mem_task, range(10))

同様に、CPUの数に基づいて制限を適用できます(multiprocessing.cpu_countそこでは便利な機能です)。

これは、これらを使用していくつかのダムタスクの割り当てを制限するノートブックです。

通常、モデルはコアごとに(ノードごとではなく)1つのIPythonエンジンを実行することですが、特定のマルチコアタスクがある場合は、より少ない数(N/2またはN/4など)を使用することをお勧めします。タスクが非常に大きい場合は、実際にはノードごとに1つのエンジンに制限することをお勧めします。ノードごとにより多くのエンジンを実行している場合は、リソースの多いタスクを一緒に実行する場合は少し注意が必要です。私が書いたように、これらのチェックでは同じノード上の他のタスクは考慮されないため、ノードが16 GBのRAMであり、それぞれに10が必要なタスクが2つある場合は、どのように処理するかについてさらに注意する必要があります。利用可能なリソースを追跡します。

于 2013-01-27T00:00:24.760 に答える