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
次のように変更します。
ここから先は
¥ 300
この記事が気に入ったらサポートをしてみませんか?