Dask 出现“内存区域过多”错误

MRo*_*lin 4 openblas dask

将 Dask 与 Dask 阵列一起使用时,我突然收到以下错误,并且我的内核死机/重新启动。

控制台说:

BLAS : Program is Terminated. Because you tried to allocate too many memory regions
Run Code Online (Sandbox Code Playgroud)

我在 Mac 上使用 OpenBLAS 使用 Anaconda。任何的想法?

注意:这个问题是通过其他方式给我的,我在这里重复一遍以备将来参考

MRo*_*lin 7

简答

Dask 和 OpenBLAS 都在尝试同时并行化。这会触发 OpenBLAS 中的检查,从而导致硬故障。避免这种情况的一种简单方法是设置以下环境变量:

export OMP_NUM_THREADS=1
Run Code Online (Sandbox Code Playgroud)

长答案

Dask 多次并行调用 OpenBLAS 函数(通过 NumPy)。OpenBLAS 依次启动许多线程并行操作。因此,如果您有四个内核,那么最终可能会有 16 个线程都在尝试工作。这可能会导致性能不佳。OpenBLAS 智能地识别这种情况并警告您。不幸的是,它警告你的机制是很难失败。

设置OMP_NUM_THREADS=1告诉 OpenBLAS 一次只使用一个线程。这将有助于避免争用,但在不与 Dask 或 Joblib 等其他库并行时可能会导致性能降低。