我正在研究改善 TensorFlow Serving 的延迟和/或吞吐量的方法实例。我见过"Serving Inception"手册和三个 GitHub 问题( 2 、 3 、 4 ),但它们似乎都为每个服务器创建了一个单独的 TensorFlow Serving 实例,然后在客户端上选择服务器。问题4实际上是在这些东西前面添加一些负载均衡器,这在 TensorFlow Serving 本身中目前是不存在的。
不过,还有"Distributed TensorFlow"教程展示了如何将一组机器加入到固定集群中,然后手动将一些计算“固定”到某些机器上,如果模型“宽”并且可以很好地并行化,则可以提高延迟和吞吐量。但是,我在这两个文档中都没有看到任何提及将其与 TensorFlow Serving 相结合的内容。
问题是:是否可以配置 TensorFlow Serving 以使用分布式 TensorFlow 集群?
我能够通过一些技巧让它创建和使用 gRPC session (而不是本地):
- 通过修改
BUILD
文件,使tensorflow/core/distributed_runtime/rpc:grpc_session
目标公开可见(默认情况下,它位于 tensorflow 包的内部)。 - 将其作为依赖项添加到
tensorflow_serving/model_servers:tensorflow_model_server
目标。 - 向
tensorflow_model_server
添加一个名为--session_target
的额外标志,用于在main.cc< 中设置
。session_bundle_config.session_target()
/ - 使用
--session_target=grpc://localhost:12345
运行二进制文件,其中localhost:12345
是用于创建主 session 的任意节点。 - 查看我的集群代表 TensorFlow Serving 执行一些计算。
但是,由于以下三个原因,这组 hack 看起来不足以“实际使用”:
grpc_session
目标可能出于某种原因是内部的。- 正如我在 other question 中注意到的那样,当计算手动“固定”到特定机器时,分布式 TensorFlow 效果更好。因此,如果我们使用 TensorFlow Serving,我们需要一种方法来保存这些“引脚”,并将模型的结构与集群的结构联系起来。我不确定这些信息是否是通过
Exporter
/Saver
导出的。 tensorflow_model_server
创建一次 session - 在引导期间。如果集群的主节点宕机然后恢复,服务服务器仍保留“旧” session ,无法处理进一步的请求。
总而言之,这个场景似乎还没有得到官方支持,但我不确定。
最佳答案
如果您的模型适合单台机器,那么很难看出将其分布在多台机器上将如何提高吞吐量。本质上,您正在进行可以独立完成的计算并添加依赖项。如果您的一台机器速度缓慢或崩溃,它不会使某些查询变慢,而是会使所有查询变慢。
也就是说,值得进行基准测试来看看它是否有帮助,在这种情况下,要求官方支持此用例是有意义的。
关于问题:
工作人员分配是通过图形
.pbtxt
中的device
字段完成的。一些进口商/导出商清除这些分配并具有clear_devices
标志。您可以打开图形定义(.pbtxt
文件或等效的 str(tf.get_default_graph().as_graph_def() 和 grep fordevice
字符串进行检查)如果任何工作进程重新启动,或者存在一些临时网络连接,您的 sess.run 将失败并出现错误(不可用),并且您需要重新创建 session 。这是由
tf.train
中的MonitoredTrainingSession
自动处理的,但您需要通过服务自行处理。
关于tensorflow - 是否可以将 TensorFlow Serving 与分布式 TensorFlow 集群结合使用来提高吞吐量/延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41845379/