我正在研究改善TensorFlow Serving实例的延迟和/或吞吐量的方法。我看过“Serving Inception”手册和三个 GitHub 问题(2、3、4 ),但它们似乎都为每台服务器创建了一个单独的 TensorFlow Serving 实例,然后在客户端选择服务器。问题4实际上是关于在这些东西前面添加一些负载均衡器,而 TensorFlow Serving 本身目前不存在这些负载均衡器。
但是,还有一个“分布式 TensorFlow”教程,它展示了如何将一组机器加入一个固定的集群,然后手动将一些计算“固定”到一些机器上,如果模型是“宽”的,这可以提高延迟和吞吐量,并且可以并行化好。但是,我在任何一个文档中都没有看到将其与 TensorFlow Serving 结合的任何提及。
问题是:是否可以将 TensorFlow Serving 配置为使用分布式 TensorFlow 集群?
我能够通过一些技巧使其创建和使用 gRPC 会话(而不是本地会话):
- 通过修改文件使
tensorflow/core/distributed_runtime/rpc:grpc_session
目标公开可见(默认情况下它是 tensorflow 包的内部) 。BUILD
- 将其作为依赖项添加到
tensorflow_serving/model_servers:tensorflow_model_server
目标。 - 添加一个额外的标志来
tensorflow_model_server
调用在.--session_target
session_bundle_config.session_target()
main.cc
- 使用 运行二进制文件
--session_target=grpc://localhost:12345
,其中localhost:12345
是用于创建主会话的任意节点。 - 查看我的集群代表 TensorFlow Serving 执行一些计算。
但是,由于以下三个原因,这组 hack 看起来不足以“实际使用”:
grpc_session
由于某种原因,目标可能是内部的。- 正如我在另一个问题中所注意到的,当计算被手动“固定”到特定机器上时,分布式 TensorFlow 会更好地工作。因此,如果我们使用 TensorFlow Serving,我们需要一种方法来保存这些“引脚”,并且模型的结构会与集群的结构联系在一起。我不确定此信息是否与
Exporter
/Saver
一起导出。 tensorflow_model_server
创建会话一次 - 在引导期间。如果集群的主节点宕机然后恢复,服务服务器仍然保持“旧”会话,无法处理进一步的请求。
总而言之,看起来这个场景还没有得到官方的支持,但我不确定。