ML-Engine与GPU工人错误

时间:2017-06-27 21:53:33

标签: google-cloud-ml-engine

您好我正在使用ML Engine,其中包含一个由complex_m主服务器组成的自定义层,四个工作站每个都有一个GPU,一个complex_m作为参数服务器。

该模型正在培训CNN。但是,工人们似乎遇到了麻烦。 这是日志https://i.stack.imgur.com/VJqE0.png的图像。

主人似乎仍在工作,因为有会话检查点被保存,但是,现在它已接近应该的速度。

使用complex_m worker,该模型可以正常工作。它只是等待模型在开始时准备就绪(我假设直到主人初始化全局变量,如果我错了就纠正我)然后正常工作。但是使用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

我很感激帮助!

1 个答案:

答案 0 :(得分:1)

在评论中,您似乎回答了自己的问题(在replica_setter中使用cluster_spec)。请允许我解决一组CPU与一组GPU的吞吐量问题。

GPU非常强大。通常,您可以通过使用具有许多GPU的单台计算机获得更高的吞吐量,而不是让每台计算机都使用单个GPU。这是因为通信开销成为瓶颈(同一台机器上主内存的带宽和延迟远远好于与远程机器上的参数服务器通信)。

GPU比CPU慢的原因可能是由于需要将数据从主存储器复制到GPU并返回的GPU的额外开销。如果你正在做很多可并行化的计算,那么这个副本可以忽略不计。你的模型可能在GPU上做得太少,开销可能会影响实际计算。

有关构建高性能模型的详细信息,请参阅this guide

与此同时,我建议使用一台具有更多GPU的计算机来查看是否有帮助:

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

请注意,您必须修改代码才能将操作分配给正确的GPU,可能使用towers