首页 > 解决方案 > ray 如何处理包依赖关系?

问题描述

我有一个非常基本的射线问题。ray 是否假定它运行的任何代码的所有依赖项都本地安装在每个工作节点上?

很明显,ray 具有在节点之间移动代码的能力,因为工作人员可以执行 ray.remote 函数。代码是如何移动的?

函数是否看到调用者已导入的任何内容(如果它们在本地运行,则相同)还是必须在工作程序上运行的函数中再次导入它?他们是否必须为每个函数调用导入它,或者有没有办法只导入一次并重用导入的符号?(导入重量级依赖项时)。远程函数中导入的模块的生命周期是什么 - 远程函数返回时会消失吗?(即:每个远程函数调用是否有效地在单独的解释器中运行?)

如果工作人员必须导入所有内容 - 调用者 ray.put 可以导入它的模块吗?(或者,例如使用这些模块中的类的对象)

可以放置的内容是否有限制 - 例如,我可以使用 ray.put(pytorch) 吗?(如果工作节点没有安装会发生什么?)

背景:我想交互式地使用 ray(来自 jupyter notebook)作为 multiprocessing.Pool 的分布式替代品。我需要知道如何做到这一点,以便工作节点有效地拥有调用者的 conda 环境的精确克隆 - 无论调用时可能是什么(可能会因调用而异,例如,如果升级了某些包) . 将 conda 环境放在 nfs 共享或类似的东西上是一种选择,但如果 ray 有自己的同步依赖项的方法会更好。主要是我只想了解 ray 需要/假设什么。

标签: pythoncluster-computinggrpcdistributed-computingray

解决方案


您可以查看运行时环境以让您的 Ray 工作人员在指定的 conda 环境中运行:https ://docs.ray.io/en/latest/advanced.html 。为了让它始终与调用者的环境相匹配,您可以调用conda env export以从调用者的环境中生成一个environment.yml文件,然后再将其传递到运行时环境中。

要回答您的第一个问题,是的,不使用运行时环境 Ray 假设所有依赖项都安装在集群上。通常(有或没有运行时环境),代码是使用 cloudpickle 移动的。每个 Ray worker 都有一个长时间运行的 Python 进程来运行任务,所以如果多个任务重用同一个模块,它仍然只会在开始时只导入一次。


推荐阅读