分布式 Tensorflow:工人因 OOM 而死亡
Distributed Tensorflow: worker killed due to OOM
我正在 运行 类似于 Inception sample code 的分布式张量流训练,但使用此设备 setter:
with tf.device(tf.train.replica_device_setter(ps_tasks=1,
worker_device="/job:worker/task:%d" % FLAGS.task_id,
cluster=cluster_spec)):
机器有 4 个 GPU 和 64 GB RAM。 ps
作业仅在 CPU 上是 运行,并且在 2 个独立的 GPU 上有两个 worker
作业 运行。两个 worker 作业的 res 内存占用逐渐增加,直到大约 3000 步,首席 worker 被 OOM 杀死(两个 worker 在崩溃前占用了大约 49% 的 RAM)。我也试过一个工人,那个工人也被杀了。 ps
作业占用空间小得多。
我试过禁用摘要操作、模型保护器、变量平均器、减少 reader 线程,但无济于事。
我通过在 image_processing.py
中调用 batch_inputs
时评论 with tf.device('/cpu:0'):
规范来解决这个问题。这可能发生在我的设置中的一个原因虽然不完全清楚是我使用
with tf.device(tf.train.replica_device_setter(ps_tasks=1,
worker_device="/job:worker/task:%d" % FLAGS.task_id,
cluster=cluster_spec)):
而不是
# Ops are assigned to worker by default.
with tf.device('/job:worker/task:%d' % FLAGS.task_id):
# Variables and its related init/assign ops are assigned to ps.
with slim.scopes.arg_scope(
[slim.variables.variable, slim.variables.global_step],
device=slim.variables.VariableDeviceChooser(num_parameter_servers)):
作为调用批处理的最外层训练范围 (inception_distributed_train.py
)。
不确定为什么这会成为我修改后的设置的问题(由于没有关于如何进行设备分配的机制的文档),但现在内存增加趋势至少减少了十倍,并且经过测试运行 100 个纪元。
如果没有此 CPU 设备规范,也许原始代码也能正常工作。
我正在 运行 类似于 Inception sample code 的分布式张量流训练,但使用此设备 setter:
with tf.device(tf.train.replica_device_setter(ps_tasks=1,
worker_device="/job:worker/task:%d" % FLAGS.task_id,
cluster=cluster_spec)):
机器有 4 个 GPU 和 64 GB RAM。 ps
作业仅在 CPU 上是 运行,并且在 2 个独立的 GPU 上有两个 worker
作业 运行。两个 worker 作业的 res 内存占用逐渐增加,直到大约 3000 步,首席 worker 被 OOM 杀死(两个 worker 在崩溃前占用了大约 49% 的 RAM)。我也试过一个工人,那个工人也被杀了。 ps
作业占用空间小得多。
我试过禁用摘要操作、模型保护器、变量平均器、减少 reader 线程,但无济于事。
我通过在 image_processing.py
中调用 batch_inputs
时评论 with tf.device('/cpu:0'):
规范来解决这个问题。这可能发生在我的设置中的一个原因虽然不完全清楚是我使用
with tf.device(tf.train.replica_device_setter(ps_tasks=1,
worker_device="/job:worker/task:%d" % FLAGS.task_id,
cluster=cluster_spec)):
而不是
# Ops are assigned to worker by default.
with tf.device('/job:worker/task:%d' % FLAGS.task_id):
# Variables and its related init/assign ops are assigned to ps.
with slim.scopes.arg_scope(
[slim.variables.variable, slim.variables.global_step],
device=slim.variables.VariableDeviceChooser(num_parameter_servers)):
作为调用批处理的最外层训练范围 (inception_distributed_train.py
)。
不确定为什么这会成为我修改后的设置的问题(由于没有关于如何进行设备分配的机制的文档),但现在内存增加趋势至少减少了十倍,并且经过测试运行 100 个纪元。
如果没有此 CPU 设备规范,也许原始代码也能正常工作。