在 Ray 集群上第一次作业 运行 后看到的 ModuleNotFoundError
ModuleNotFoundError seen after the first time a job is run on a Ray cluster
我正在 运行ning 一个脚本,该脚本从同一目录中的文件导入模块。第一次我 运行 启动集群后脚本 运行s 如预期的那样。随后我 运行 脚本出现以下错误: ModuleNotFoundError: No module named 'ex_cls'
如何让 Ray 识别我在第一个 运行 之后导入的模块?
我在 redhat Linux 集群上使用 Ray 1.11.0。
这是我的脚本。两者都位于 /home/ray_experiment 目录中:
--ex_main.py
import sys
sys.path.insert(0, '/home/ray_experiment')
from ex_cls import monitor_wrapper
import ray
ray.init(address='auto')
from ray.util.multiprocessing import Pool
def main():
pdu_infos = range(10)
with Pool() as pool:
results = pool.map(monitor_wrapper, [pdu for pdu in pdu_infos])
for pdu_info, result in zip(pdu_infos, results):
print(pdu_info, result)
if __name__ == "__main__":
main()
--ex_cls.py
import sys
from time import time, sleep
from random import randint
import collections
sys.path.insert(0, '/home/ray_experiment')
MonitorResult = collections.namedtuple('MonitorResult', 'key task_time')
def monitor_wrapper(args):
start = time()
rando = randint(0, 200)
lst = []
for i in range(10000 * rando):
lst.append(i)
pause = 1
sleep(pause)
return MonitorResult(args, time() - start)
-- 编辑
我发现通过添加这两个环境变量,我不再看到 ModuleNotFoundError。
导出 PYTHONPATH="${PYTHONPATH}:/home/ray_experiment/"
出口RAY_RUNTIME_ENV_WORKING_DIR_CACHE_SIZE_GB=0
是否有另一种不需要禁用工作环境缓存的解决方案?
这里的问题是 Ray 的工作进程可能 运行 来自与您的驱动程序 python 脚本不同的工作目录。事实上,在一个集群上,它们甚至可能 运行 来自不同的机器。这与 python 基于相对路径查找模块这一事实相结合(准确地说,cloudpickle 通过引用序列化其他模块中的定义)。
此问题的“预期”解决方案是使用 runtime environments。
特别是,您应该在启动 Ray 时执行 ray.init(address='auto', {"working_dir": "./"})
以确保将模块传递给其他进程。
我正在 运行ning 一个脚本,该脚本从同一目录中的文件导入模块。第一次我 运行 启动集群后脚本 运行s 如预期的那样。随后我 运行 脚本出现以下错误: ModuleNotFoundError: No module named 'ex_cls'
如何让 Ray 识别我在第一个 运行 之后导入的模块?
我在 redhat Linux 集群上使用 Ray 1.11.0。
这是我的脚本。两者都位于 /home/ray_experiment 目录中:
--ex_main.py
import sys
sys.path.insert(0, '/home/ray_experiment')
from ex_cls import monitor_wrapper
import ray
ray.init(address='auto')
from ray.util.multiprocessing import Pool
def main():
pdu_infos = range(10)
with Pool() as pool:
results = pool.map(monitor_wrapper, [pdu for pdu in pdu_infos])
for pdu_info, result in zip(pdu_infos, results):
print(pdu_info, result)
if __name__ == "__main__":
main()
--ex_cls.py
import sys
from time import time, sleep
from random import randint
import collections
sys.path.insert(0, '/home/ray_experiment')
MonitorResult = collections.namedtuple('MonitorResult', 'key task_time')
def monitor_wrapper(args):
start = time()
rando = randint(0, 200)
lst = []
for i in range(10000 * rando):
lst.append(i)
pause = 1
sleep(pause)
return MonitorResult(args, time() - start)
-- 编辑
我发现通过添加这两个环境变量,我不再看到 ModuleNotFoundError。
导出 PYTHONPATH="${PYTHONPATH}:/home/ray_experiment/"
出口RAY_RUNTIME_ENV_WORKING_DIR_CACHE_SIZE_GB=0
是否有另一种不需要禁用工作环境缓存的解决方案?
这里的问题是 Ray 的工作进程可能 运行 来自与您的驱动程序 python 脚本不同的工作目录。事实上,在一个集群上,它们甚至可能 运行 来自不同的机器。这与 python 基于相对路径查找模块这一事实相结合(准确地说,cloudpickle 通过引用序列化其他模块中的定义)。
此问题的“预期”解决方案是使用 runtime environments。
特别是,您应该在启动 Ray 时执行 ray.init(address='auto', {"working_dir": "./"})
以确保将模块传递给其他进程。