我正在研究改善TensorFlow Serving实例的延迟和/或吞吐量的方法 . 我已经看过"Serving Inception"手册和三个GitHub问题(2,3,4),但是它们似乎都为每个服务器创建了一个单独的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 回答
如果你的模型没有使用图像,或者不是太大,你不应该为每个推理/服务需要太多的计算,我说这是使用Inception-v#,需要约1秒来响应Google Cloud Platform n1-standard-1计算机上的图像 .
现在可以说,也许它是你需要扩大规模的吞吐量,这是一个不同的问题 . 此时扩展的最佳选择是使用Docker Swarm和Compose,以及Kubernetes来帮助扩展并提供推理“微服务” . 如果您的用例需要保证,您也可以使用flask来迭代一系列请求 .
如果您的模型适合单个机器,那么很难看出如何将它分布在许多机器上将提高吞吐量 . 基本上,您正在进行可以独立完成并添加依赖项的计算 . 如果你的某台机器运行缓慢或崩溃,而不是让一些查询变慢,它将使所有查询播种 .
也就是说,值得进行基准测试以确定它是否有用,在这种情况下,要求正式支持此用例是有意义的 .
关于问题:
Worker 分配通过图
.pbtxt
中的device
字段完成 . 一些进口商/出口商清除这些分配并拥有clear_devices
标志 . 您可以打开图形定义(.pbtxt
文件或等效地,str(tf.get_default_graph() . as_graph_def(),以及要检查的device
字符串的grep)如果任何工作者重新启动,或者存在某些临时网络连接,则sess.run会因错误(不可用)而失败,您需要重新创建会话 . 这由
tf.train
中的MonitoredTrainingSession
自动处理,但您需要自己处理这项服务 .