見出し画像

Distributed Tensorflow を試してみた

Tensorflow について

Googleが開発しているTensorFlowは機械学習に用いるためのソフトウェアライブラリです。

次の情報を参考にして distributed tensorflow を試してみました。

TensorFlowクラスタで ディープラーニングの分散処理環境を構築してみる
稲葉 明彦 - NTTデータ先端技術研究所

ここで説明されているコードには次の問題点があります。

● そもそもここに書いているとおりに実行できない
● 分散トレーニングにGPUを使っていない
● 分散トレーニングにGPUを使おうとするとエラーになる
● TypeError: 'NoneType' object is not callable のエラー

書いてあるとおりに実行できない

稲葉氏の記事通りにワーカー(Worker)を起動していくと、
次のメッセージがパラメタサーバー(Paramater Server)で
表示されてプログラムが実行しません。

CreateSession still waiting for response from worker

tensorflow ではワーカーを起動するときに、
他のワーカーと連携するためにすべてのワーカーと接続確認ができないと、
プログラムが実行されません。

これは、train.MonitoredTrainingSession() の is_chief を、
ワーカーのタスクIDがゼロのときにTrue、
そうでないときに Flase となるように呼び出せていないことと、
そもそもこの train.MinitoredTrainingSession() を使っていないためです。

これについては、もともとのCIFAR10のコードに原因があるのですが、
ワーカーのジョブ名を変更してすべてのタスクIDをゼロとしてサーバーを
準備することで回避できます。

実行環境が次のマシンであったとします。

パラメターサーバー: 10.0.1.25
worker0: 10.0.1.28
worker1: 10.0.1.29

それぞれ次のようにサーバーを起動します。

パラメターサーバー

python grpc_tensorflow_server.py \
    --cluster_spec  \
'master|10.0.1.25:2222,worker0|10.0.1.28:2222,worker1|10.0.1.29:2222'  \
--job_name='master' --task_id=0

Worker0

python grpc_tensorflow_server.py \
    --cluster_spec  \
'master|10.0.1.25:2222,worker0|10.0.1.28:2222,worker1|10.0.1.29:2222'  \
--job_name='worker0' --task_id=0

Worker1

python grpc_tensorflow_server.py \
    --cluster_spec  \
'master|10.0.1.25:2222,worker0|10.0.1.28:2222,worker1|10.0.1.29:2222'  \
--job_name='worker1' --task_id=0

分散トレーニングでGPUを使っていない

ワーカー側のデバイスを指定している箇所では次のようになっています。

with tf.device('/job:worker/task:%d/cpu:0' % i):

CPUを使うように指示しています。

前述のすべてのワーカーのタスクIDがゼロになるようにサーバーを準備している修正を加えると次のようになります。

with tf.device('/job:worker%d/task:0/gpu:0' % i):

これで、それぞれのワーカーが実行するマシンにあるGPUが使われるようになります。

ただし、このままでは実行時にエラーがでてしまいます。

実行時のエラー

CUDA_ERROR_OUT_OF_MEMORY
このエラーは無視して構いません。
GPU上のメモリに載せられるように、
0.9倍ずつ減らしながら自動で調整しているだけです。

2019-03-07 08:17:37.177695: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 1.86G (2000753152 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY

GPUを使おうとするとエラーになる

稲葉氏の資料では cifar10 のデータセットにある cifar10_multi_gpu_train.py を修正して分散処理させています。

ここで、誤った修正をしてしまっていることが残念です。

オリジナルでは、次のようにセッションを作成しています。

    sess = tf.Session(config=tf.ConfigProto(                                    
          allow_soft_placement=True,
          log_device_placement=FLAGS.log_device_placement))
   coord = tf.train.Coordinator()
   sess.run(init)

これが、次のように修正されています。

    sess = tf.Session("grpc://%s:2222" % PS_NODE)

このまま、GPUを使って実行しようとすると、
次のエラーがでてしまい実行できません。

 Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available.

オリジナルでは、Tensorflowが自動的にサポートされている
デバイスを選択して操作を実行するようにオプションを与えて
セッションを作成しているのに削除してしまっているからです。

allow_soft_placement = True

次のように変更します。

ここから先は

8,781字

¥ 300

この記事が気に入ったらサポートをしてみませんか?