web-dev-qa-db-ja.com

SlurmクラスターでTensorFlowを実行していますか?

コンピューティングクラスター、具体的には、 Slurm Workload Manager で実行されている2つの12コアCPUを備えた1つのノードにアクセスできました。

そのシステムで TensorFlow を実行したいのですが、残念ながら、これを行う方法や、これが可能かどうかについての情報を見つけることができませんでした。私はこれに不慣れですが、私が理解している限り、Slurmジョブを作成してTensorFlowを実行する必要があり、sshを介してpython/tensorflowを直接実行することはできません。

このトピックに関するアイデア、チュートリアル、または何らかの情報源はありますか?

17
daniel451

比較的簡単です。

ホストごとに1つのプロセスを要求するという単純化された仮定の下で、slurmは、環境変数、特にSLURM_PROCID、SLURM_NPROCS、およびSLURM_NODELISTで必要なすべての情報を提供します。

たとえば、次のように、タスクインデックス、タスク数、およびノー​​ドリストを初期化できます。

from hostlist import expand_hostlist
task_index  = int( os.environ['SLURM_PROCID'] )
n_tasks     = int( os.environ['SLURM_NPROCS'] )
tf_hostlist = [ ("%s:22222" % Host) for Host in
                expand_hostlist( os.environ['SLURM_NODELIST']) ]  

Slurmは、圧縮された形式( "myhost [11-99]"など)でホストリストを提供するため、展開する必要があることに注意してください。 KentEngströmによるモジュールhostlistを使用してこれを行います。ここから入手できます https://pypi.python.org/pypi/python-hostlist

その時点で、すぐに先に進んで、利用可能な情報を使用してTensorFlowクラスター仕様とサーバーを作成できます。例:

cluster = tf.train.ClusterSpec( {"your_taskname" : tf_hostlist } )
server  = tf.train.Server( cluster.as_cluster_def(),
                           job_name   = "your_taskname",
                           task_index = task_index )

そして、あなたは準備ができています!これで、通常の構文を使用して、割り当ての特定のホストでTensorFlowノードの配置を実行できます。

for idx in range(n_tasks):
   with tf.device("/job:your_taskname/task:%d" % idx ):
       ...

上記のコードの欠陥は、すべてのジョブがTensorflowに固定ポート22222でリッスンするサーバーをインストールするように指示することです。同じノードに複数のそのようなジョブがスケジュールされている場合、2番目のジョブは22222をリッスンできません。

より良い解決策は、slurmに各ジョブのポートを予約させることです。 slurm管理者を参加させ、-resv-portsオプションを使用してポートを要求できるようにslurmを構成するように依頼する必要があります。実際には、これには、slurm.confに次のような行を追加するように依頼する必要があります。

MpiParams=ports=15000-19999

Slurm adminにバグを報告する前に、どのオプションがすでに構成されているかを確認してください。

scontrol show config | grep MpiParams

サイトですでに古いバージョンのOpenMPIが使用されている場合は、このようなオプションがすでに用意されている可能性があります。

次に、最初のコードスニペットを次のように修正します。

from hostlist import expand_hostlist
task_index  = int( os.environ['SLURM_PROCID'] )
n_tasks     = int( os.environ['SLURM_NPROCS'] )
port        = int( os.environ['SLURM_STEP_RESV_PORTS'].split('-')[0] )
tf_hostlist = [ ("%s:%s" % (Host,port)) for Host in
                expand_hostlist( os.environ['SLURM_NODELIST']) ]  

幸運を!

23
scarpaz

このようなsbatchコマンドを使用して、バッチスクリプトをslurmに渡すだけです。

sbatch --partition=part start.sh

使用可能なパーティションの一覧表示は、sinfoを使用して実行できます。

start.sh(可能な構成)

#!/bin/sh
#SBATCH -N 1      # nodes requested
#SBATCH -n 1      # tasks requested
#SBATCH -c 10      # cores requested
#SBATCH --mem=32000  # memory in Mb
#SBATCH -o outfile  # send stdout to outfile
#SBATCH -e errfile  # send stderr to errfile
python run.py

一方、run.pyには、slurmで実行するスクリプト(テンソルフローコード)が含まれています。

詳細はこちらで確認できます: https://slurm.schedmd.com/sbatch.html

4
timtody