2

我正在研究改善TensorFlow Serving实例的延迟和/或吞吐量的方法。我看过“Serving Inception”手册和三个 GitHub 问题(2、3、4 它们似乎都为每台服务器创建了一个单独的 TensorFlow Serving 实例,然后在客户端选择服务器。问题4实际上是关于在这些东西前面添加一些负载均衡器,而 TensorFlow Serving 本身目前不存在这些负载均衡器。

但是,还有一个“分布式 TensorFlow”教程,它展示了如何将一组机器加入一个固定的集群,然后手动将一些计算“固定”到一些机器上,如果模型是“宽”的,这可以提高延迟和吞吐量,并且可以并行化好。但是,我在任何一个文档中都没有看到将其与 TensorFlow Serving 结合的任何提及。

问题是:是否可以将 TensorFlow Serving 配置为使用分布式 TensorFlow 集群?

我能够通过一些技巧使其创建和使用 gRPC 会话(而不是本地会话):

  1. 通过修改文件使tensorflow/core/distributed_runtime/rpc:grpc_session目标公开可见(默认情况下它是 tensorflow 包的内部) 。BUILD
  2. 将其作为依赖项添加到tensorflow_serving/model_servers:tensorflow_model_server目标。
  3. 添加一个额外的标志来tensorflow_model_server调用在.--session_targetsession_bundle_config.session_target()main.cc
  4. 使用 运行二进制文件--session_target=grpc://localhost:12345,其中localhost:12345是用于创建主会话的任意节点。
  5. 查看我的集群代表 TensorFlow Serving 执行一些计算。

但是,由于以下三个原因,这组 hack 看起来不足以“实际使用”:

  1. grpc_session由于某种原因,目标可能是内部的。
  2. 正如我在另一个问题中所注意到的,当计算被手动“固定”到特定机器上时,分布式 TensorFlow 会更好地工作。因此,如果我们使用 TensorFlow Serving,我们需要一种方法来保存这些“引脚”,并且模型的结构会与集群的结构联系在一起。我不确定此信息是否与Exporter/Saver一起导出。
  3. tensorflow_model_server创建会话一次 - 在引导期间。如果集群的主节点宕机然后恢复,服务服务器仍然保持“旧”会话,无法处理进一步的请求。

总而言之,看起来这个场景还没有得到官方的支持,但我不确定。

4

2 回答 2

1

如果您的模型不使用图像,或者不是太大,则每次推理/服务不需要太多计算,我说的是使用 Inception-v# 需要大约 1 秒来响应Google Cloud Platform n1-standard-1 机器上的图像。

话虽如此,也许您需要扩大吞吐量,这是一个不同的问题。此时,您最好的扩展选择是使用 Docker Swarm & Compose 以及 Kubernetes 来帮助扩展并为您的推理“微服务”提供服务。如果您的用例需要,您也可以使用烧瓶来迭代一系列请求。

于 2017-07-20T06:19:25.183 回答
1

如果您的模型适合单台机器,那么很难看出将其分布在多台机器上将如何提高吞吐量。本质上,您正在进行可以独立完成的计算并添加依赖项。如果您的其中一台机器运行缓慢或崩溃,它不会使某些查询变慢,而是会使所有查询播种。

也就是说,值得进行基准测试,看看它是否有帮助,在这种情况下,要求官方支持这个用例是有意义的。

关于问题:

  1. 工人分配是通过device图中的字段完成的.pbtxt。一些进口商/出口商清除了这些分配并有clear_devices标记。您可以打开图形定义(.pbtxtfile 或等效的 str(tf.get_default_graph().as_graph_def() 和 grepdevice以检查要检查的字符串)

  2. 如果任何工作人员重新启动,或者存在一些临时网络连接,您的 sess.run 将失败并出现错误(不可用),您需要重新创建会话。这由MonitoredTrainingSessionin自动处理tf.train,但您需要通过服务自己处理。

于 2017-01-25T17:52:11.320 回答