在 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": "./"}) 以确保将模块传递给其他进程。