2017-06-27 9 views
0

こんにちは、私は、complex_mマスター、GPUとcomplex_mを持つ4人の作業者からなるカスタム層でMLエンジンを使用しています。GPUワーカーを使用したMLエンジン

モデルはCNNを訓練しています。しかし、労働者には問題があるようです。 これはログの画像ですhttps://i.stack.imgur.com/VJqE0.png

セッションチェックポイントが保存されているため、マスターがまだ動作しているように見えますが、これは速度に近いところです。

complex_mワーカーでは、このモデルが機能します。それはちょうどモデルが最初に準備ができているのを待っているだけです(マスターがグローバル変数を初期化し、私が間違っていると私を修正してから正常に動作するまで)。しかし、GPUではタスクに問題があるようです。

どこでもtf.Device()関数を使用していませんでしたが、クラウドではGPUが使用可能な場合にデバイスが自動的に設定されていると思っていました。

私はCensusの例に従い、TF_CONFIG環境変数をロードしました。

tf.logging.info('Setting up the server') 
tf_config = os.environ.get('TF_CONFIG') 

# If TF_CONFIG is not available run local 
if not tf_config: 
    return run('', True, *args, **kwargs) 

tf_config_json = json.loads(tf_config) 

cluster = tf_config_json.get('cluster') 
job_name = tf_config_json.get('task', {}).get('type') 
task_index = tf_config_json.get('task', {}).get('index') 

# If cluster information is empty run local 
if job_name is None or task_index is None: 
    return run('', True, *args, **kwargs) 

cluster_spec = tf.train.ClusterSpec(cluster) 
server = tf.train.Server(cluster_spec, 
         job_name=job_name, 
         task_index=task_index) 

# Wait for incoming connections forever 
# Worker ships the graph to the ps server 
# The ps server manages the parameters of the model. 
if job_name == 'ps': 
    server.join() 
    return 
elif job_name in ['master', 'worker']: 
    return run(server.target, job_name == 'master', *args, **kwargs) 

次に、メイングラフを定義する前にtf.replica_device_setterを使用しました。

セッションとして、私はtf.train.MonitoredTrainingSessionを使用しています。これは、変数の初期化とチェックポイント保存を処理する必要があります。私は、労働者が変数が初期化されていないと言っている理由を知らない。初期化する

変数すべての変数です:https://i.stack.imgur.com/hAHPL.png

オプティマイザ:AdaDelta

私は助けに感謝!

+0

作業員1人あたり4 GPUを使用していることを正しく理解しましたか? – rhaertel80

+0

いいえ、1つのGPUを持つ4人のワーカー – MarkCutajar

+0

1つのパラメータサーバーがあり、デバイスを設定していないことがわかります。どのオプティマイザを使用していますか?また、ロードされていない変数の名前を提供することも可能です(スクリーンショットから切り離されました - おそらく意図的に)。 – rhaertel80

答えて

1

コメントで、あなた自身の質問に答えているようです(replica_setterのcluster_specを使用)。私はCPUのクラスタ対GPUのクラスタのスループットの問題に対処することができます。

GPUはかなり強力です。通常、複数のマシンにそれぞれ1つのGPUを搭載するのではなく、複数のGPUを搭載した単一のマシンを使用することで、より高いスループットを実現します。これは、通信オーバーヘッドがボトルネックになるためです(同じマシン上のメインメモリへの帯域幅とレイテンシは、リモートマシン上のパラメータサーバーとの通信よりもずっと優れています)。

GPUがCPUよりも遅い理由は、メインメモリからGPUにデータをコピーして戻す必要があるGPUの余分なオーバーヘッドが原因である可能性があります。並列化可能な計算をたくさん行っている場合、このコピーは無視できます。あなたのモデルはGPU上であまり働いていない可能性があり、オーバーヘッドが実際の計算を揺るがす可能性があります。

高性能モデルの構築の詳細については、this guideを参照してください。一方

は、私はそれができますかどうかを確認するために以上のGPUを単一のマシンを使用することをお勧め:

{ 
    "scaleTier": "CUSTOM", 
    "masterType": "complex_model_l_gpu", 
    ... 
} 

ちょうどあなたが右のGPUにOPSを割り当てるためにコードを変更する必要がありますことを、注意してください、おそらくtowersを使用しています。

関連する問題