我有一个 ML 管道,其中有多个 Ray ( https://ray.readthedocs.io/en/latest/ ) 演员(1 个 Tensorflow,一些预处理步骤和一些后处理)相互连接。
我现在想通过一个 REST API 使该管道可用,该 API 应该接受图像,将图像放入管道(由 Ray 执行)并响应结果。
我想知道最好和最有效的架构决策是通过 REST API 公开 Ray 的远程功能吗?图像可能非常大,因此理想情况下,运行 REST API 的代码块应该能够将图像直接放入 Ray 的 Plasma 存储中。
我在 Kubernetes 集群中运行 Ray。REST API 服务器基于 Python / asyncio。
一种简单的解决方案是:
- 生成一个服务于 REST API 服务器的 kubernetes pod,并
ray.init(...)
在此容器内使用它来连接到 Ray 集群并将数据传输到管道中。但是,我想这样一来,REST API pod 就不能直接将图像数据推送到 Ray 的共享内存中了吗?在这张图片(https://youtu.be/D_oz7E4v-U0?t=830)中,我可以看到在一台物理机器上有多个工人/驱动程序是正常的。但是,如果 Ray 在 Docker/Kubernetes 中运行,这也算吗?在 kubernetes 部署示例中,有一个设置明确每个节点只有 1 个工作人员 ( https://github.com/ray-project/ray/blob/master/kubernetes/worker.yaml#L18 )。
另一个(hacky?)解决方案是:
- 在 Ray Worker pod 中实现 REST API 服务器。通过这种方式,我假设 REST API 代码将能够访问与 worker 相同的共享内存,从而确保有效的数据传输。
最后一个选项是:
- 将 API 服务器实现为 Ray 函数或 Ray Actor。但是,如果函数/actor 部署在 Ray 集群内的随机节点上,我不确定如何公开此 API Server。
对Ray有更深入了解的人可以帮助我选择最佳选择(上述之一或其他)吗?
非常感谢!