我在一个虚拟盒子上制作的服务器上有数据,我在那里有一个grpc服务器。在我的本地机器上,我创建了一个grpc客户端,它向服务器发送一个类实例,服务器执行一个方法并返回结果。
我正在尝试使用ray实现同样的功能。我不明白我应该使用什么工具?我应该在本地计算机中创建射线簇吗?如果是,我应该如何在虚拟盒上编写程序以连接到集群并对虚拟盒中的数据执行所需的方法。
编辑2021年2月4日:现在有一个"正确的";这样做的方法。使用射线客户端
以下是您的用例中Ray的2节点设置的可能配置:
-
将VM视为集群的头节点。您可以通过
ray up --head --resources='{data: 1}
初始化集群(data: 1
部分将在一秒钟内变得相关(。 -
现在,您可以通过python脚本中的
ray.init(address="...")
从本地机器连接到它(您可能需要确保VM的网络/端口转发设置正确(。 -
默认情况下,Ray将尝试在任何具有足够资源的节点上运行任务/演员。据推测,您希望大多数任务都运行VM,因此有两种合理的方法可以实现这一点。
方法1:
您可以使用num_cpus=0
告诉Ray您的本地机器没有资源,因此它应该在head节点上运行所有内容。如果您想将本地机器纯粹视为客户端,则这种方法更可取。如果执行此操作,则不需要--resources
标志。
import ray
ray.init(address="...", num_cpus=0)
@ray.remote
def foo():
print("This runs on the VM")
print("This runs locally")
ray.get(foo.remote())
方法2:
使用自定义资源来限制任务可以在哪些节点上运行。
import ray
ray.init(address="...")
@ray.remote(resources={"data": 0.01})
def foo():
print("This runs on the VM")
print("This runs locally")
ray.get(foo.remote())
由于远程功能需要一些";数据";资源,它将在head节点上运行(由于它只需要0.01的资源,许多任务可以同时在head结点上运行(。
如果您计划在未来将更多节点连接到集群,并且其中一些节点有您的数据,而另一些节点没有,则这种方法更可取。