在 Python 中使用 Ray 并行化任务,得到“Aborted (core dumped)”

Posted

技术标签:

【中文标题】在 Python 中使用 Ray 并行化任务,得到“Aborted (core dumped)”【英文标题】:Using Ray in Python to parallelize task, get "Aborted (core dumped)" 【发布时间】:2020-09-10 01:40:54 【问题描述】:

我有一个这样的 Python 程序

if __name__ == "__main__":
  ..
  for t in th:
    ..

我正在尝试使用似乎比多处理更快的 Ray 库来并行化它,所以我写了

import ray
ray.init()
@ray.remote
def func(t):
  ..

if __name__ == "__main__":
  ..
  for t in th:
    func.remote(t)

但我收到以下错误:

: cannot connect to X server
*** Aborted at 1590213890 (unix time) try "date -d @1590213890" if you are using GNU date ***
PC: @                0x0 (unknown)
*** SIGABRT (@0xbcb00003d43) received by PID 15683 (TID 0x7fb1394f3740) from PID 15683; stack trace: ***
    @     0x7fb138f47f20 (unknown)
    @     0x7fb138f47e97 gsignal
    @     0x7fb138f49801 abort
    @     0x7fb13760cf11 google::LogMessage::Flush()
    @     0x7fb13760cfe1 google::LogMessage::~LogMessage()
    @     0x7fb137394b49 ray::RayLog::~RayLog()
    @     0x7fb137144555 ray::CoreWorkerProcess::~CoreWorkerProcess()
    @     0x7fb1371445aa std::unique_ptr<>::~unique_ptr()
    @     0x7fb138f4c041 (unknown)
    @     0x7fb138f4c13a exit
    @     0x7fb123e4cb37 (unknown)
    @     0x7fb123ddfa98 QApplicationPrivate::construct()
    @     0x7fb123ddfd0f QApplication::QApplication()
    @     0x7fb127c5d428 (unknown)
    @     0x7fb127c682fd (unknown)
    @     0x7fb127c54898 (unknown)
    @     0x7fb126f0a527 (unknown)
    @           0x50a635 (unknown)
    @           0x50bfb4 _PyEval_EvalFrameDefault
    @           0x507d64 (unknown)
    @           0x50ae13 PyEval_EvalCode
    @           0x634c82 (unknown)
    @           0x634d37 PyRun_FileExFlags
    @           0x6384ef PyRun_SimpleFileExFlags
    @           0x639091 Py_Main
    @           0x4b0d00 main
    @     0x7fb138f2ab97 __libc_start_main
    @           0x5b250a _start
Aborted (core dumped)

我该如何解决?谢谢。

编辑:我在报告错误之前注意到了这个警告。不知道有没有关系。

WARNING worker.py:1090 -- Warning: The remote function __main__.func has size 288002587 when pickled. It will be stored in Redis, which could cause memory issues. This may mean that its definition uses a large array or other object.

编辑 2: 函数中的代码包含对矩阵的基本操作和一些阈值。我尝试了以下最小代码:

import ray
ray.init()

@ray.remote
def f(x):
    print(x)

if __name__ == "__main__":
    for x in (1,2,3):
        f.remote(x)

我得到以下输出:

INFO resource_spec.py:212
-- Starting Ray with 73.1 GiB memory available for workers and up to 35.34 GiB for objects.
You can adjust these settings with ray.init( memory              = <bytes>,
                                             object_store_memory = <bytes>
                                             ).
INFO services.py:1170
-- View the Ray dashboard at localhost:8265.
(pid=26359) 1.
(pid=26350) 3.
(pid=26356) 2.

【问题讨论】:

使用 ray 运行任何最小代码是否有问题?你在函数中运行什么?也许有无法远程运行的代码? 函数中的代码包含对矩阵的基本操作和一些阈值。我厌倦了以下最小代码:import ray; ray.init(); @ray.remote; def f(x): print(x); if __name__=="__main__": for x in (1,2,3): f.remote(x),我得到以下输出:INFO resource_spec.py:212 -- Starting Ray with 73.1 GiB memory available for workers and up to 35.34 GiB for objects. You can adjust these settings with ray.init(memory=&lt;bytes&gt;, object_store_memory=&lt;bytes&gt;). INFO services.py:1170 -- View the Ray dashboard at localhost:8265. (pid=26359) 1. (pid=26350) 3. (pid=26356) 2. 将此信息添加到问题中 - 它将更具可读性,更多人会看到它。错误显示X serverQApplication::QApplication() - 您使用LinuxPyQt 还是其他GUI 框架?通常 GUI 框架只能在主线程/多进程中运行。错误还显示date -d ... 存在问题。你在代码中使用它吗?所有问题都在func() 内部,因此您可能必须显示您在func() 中使用的代码。您也可以在很多地方添加print(),看看会显示哪个,这样您就可以找到哪个部分有问题。 @furas 非常感谢。我的代码中没有使用date -d。对于Linux,我在不知道其特征的Linux服务器上运行代码,因此无法回答。我会做同样的尝试。 我有同样的问题,对我来说只是简单的以下代码不起作用'import ray; ray.init()' ==> 中止。但它在其他linux机器上工作。我在他们的 github 页面上发布了一个问题 github.com/ray-project/ray/issues/14426 【参考方案1】:

如果您使用的是集群管理的 Slurm您必须向它提交作业,Ray 才能正常工作。

事实上,这是我的问题,我在找到解决方案之前将其发布在他们的 github 页面中:https://github.com/ray-project/ray/issues/14426

您会在其中找到一个简单的批处理脚本,用于向 Slurm 提交作业。

【讨论】:

以上是关于在 Python 中使用 Ray 并行化任务,得到“Aborted (core dumped)”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ray 并行化大型程序的正确方法

使用ray进行最近邻搜索的并行化

在 Python 中使用 asyncio 并行化 Web 任务

如何使用 Python Ray 在不耗尽内存的情况下并行处理大量数据?

python dask DataFrame,支持(可简单并行化)行吗?

使用 polly 并行化任务