首页 文章

是否可以将TensorFlow服务与分布式TensorFlow集群一起使用以提高吞吐量/延迟?

提问于
浏览
2

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

但是,还有"Distributed TensorFlow"教程,其中显示了如何将一组计算机连接到一个固定的集群,然后手动"pin"对某些计算机进行一些计算,如果模型是"wide"并且可以很好地并行化,这可以改善延迟和吞吐量 . 但是,我没有看到任何提及将这与TensorFlow服务结合在任一文档中 .

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

我能够创建和使用gRPC会话(而不是本地)与一些黑客:

  • 通过修改 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 是将用于创建主会话的任意节点 .

  • 参见我的集群代表TensorFlow服务执行一些计算 .

但是,由于以下三个原因,这套黑客攻击看起来不够“实际使用”:

  • grpc_session 目标可能是内部原因 .

  • 正如我的other question中所注意到的,当计算手动"pinned"到特定机器时,分布式TensorFlow工作得更好 . 因此,如果我们使用TensorFlow服务,我们需要一种方法来保存那些"pins"和模型's structure becomes tied with cluster'的结构 . 我不确定这些信息是否与 Exporter / Saver 一起导出 .

  • tensorflow_model_server 创建一次会话 - 在引导期间 . 如果群集的主节点关闭然后恢复,则服务器仍然保持"old"会话,并且无法处理进一步的请求 .

总而言之,看起来这个场景尚未得到官方支持,但我不确定 .

2 回答

  • 1

    如果你的模型没有使用图像,或者不是太大,你不应该为每个推理/服务需要太多的计算,我说这是使用Inception-v#,需要约1秒来响应Google Cloud Platform n1-standard-1计算机上的图像 .

    现在可以说,也许它是你需要扩大规模的吞吐量,这是一个不同的问题 . 此时扩展的最佳选择是使用Docker Swarm和Compose,以及Kubernetes来帮助扩展并提供推理“微服务” . 如果您的用例需要保证,您也可以使用flask来迭代一系列请求 .

  • 1

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

    也就是说,值得进行基准测试以确定它是否有用,在这种情况下,要求正式支持此用例是有意义的 .

    关于问题:

    • Worker 分配通过图 .pbtxt 中的 device 字段完成 . 一些进口商/出口商清除这些分配并拥有 clear_devices 标志 . 您可以打开图形定义( .pbtxt 文件或等效地,str(tf.get_default_graph() . as_graph_def(),以及要检查的 device 字符串的grep)

    • 如果任何工作者重新启动,或者存在某些临时网络连接,则sess.run会因错误(不可用)而失败,您需要重新创建会话 . 这由 tf.train 中的 MonitoredTrainingSession 自动处理,但您需要自己处理这项服务 .

相关问题