tensorflow - 是否可以将 TensorFlow Serving 与分布式 TensorFlow 集群结合使用来提高吞吐量/延迟?

标签 tensorflow tensorflow-serving horizontal-scaling

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

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

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

我能够通过一些技巧让它创建和使用 gRPC session (而不是本地):

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

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

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

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

最佳答案

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

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

关于问题:

  • 工作人员分配是通过图形 .pbtxt 中的 device 字段完成的。一些进口商/导出商清除这些分配并具有 clear_devices 标志。您可以打开图形定义(.pbtxt 文件或等效的 str(tf.get_default_graph().as_graph_def() 和 grep for device 字符串进行检查)

  • 如果任何工作进程重新启动,或者存在一些临时网络连接,您的 sess.run 将失败并出现错误(不可用),并且您需要重新创建 session 。这是由 tf.train 中的 MonitoredTrainingSession 自动处理的,但您需要通过服务自行处理。

  • 关于tensorflow - 是否可以将 TensorFlow Serving 与分布式 TensorFlow 集群结合使用来提高吞吐量/延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41845379/

    相关文章:

    tensorflow - 如何使用 Tensorflow 将一个张量的每一列乘以另一个张量的所有列?

    tensorflow - Keras 中的 math_ops.floor 等效项

    tensorflow - 如何分析在 tf-serving 上运行的 tensorflow 模型?

    node.js - 在 Heroku 和 Node.js 上扩展 websocket

    Kubernetes 水平 pod 自动缩放初始延迟?

    python - Tensorflow:使用不同的 "call"函数创建 LSTM 单元的自定义子类

    tensorflow - 在 tensorflow estimator 中,num_epochs 为 None 意味着什么?

    tensorflow - 如何命名要在 Tensorflow Serving 中使用的 Tensorflow 模型?

    TensorFlow 跨设备通信

    javascript - HighCharts:水平条形图的对数刻度