【问题标题】:Error with OMP_NUM_THREADS when using dask distributed使用 dask 分布式时 OMP_NUM_THREADS 出错
【发布时间】:2017-01-18 05:24:37
【问题描述】:

我正在使用distributed,这是一个允许并行计算的框架。在这方面,我的主要用例是 NumPy。当我包含依赖于np.linalg 的 NumPy 代码时,我收到与OMP_NUM_THREADS 相关的错误,这与OpenMP library 有关。

一个最小的例子:

from distributed import Executor
import numpy as np
e = Executor('144.92.142.192:8786')

def f(x, m=200, n=1000):
    A = np.random.randn(m, n)
    x = np.random.randn(n)
    #  return np.fft.fft(x)  # tested; no errors
    #  return np.random.randn(n)  # tested; no errors
    return A.dot(y).sum()  # tested; throws error below

s = [e.submit(f, x) for x in [1, 2, 3, 4]]
s = e.gather(s)

当我使用 linalg 测试进行测试时,e.gather 失败,因为每个作业都会引发以下错误:

OMP: Error #34: System unable to allocate necessary resources for OMP thread:
OMP: System error #11: Resource temporarily unavailable
OMP: Hint: Try decreasing the value of OMP_NUM_THREADS.

我应该将OMP_NUM_THREADS 设置为什么?

【问题讨论】:

    标签: python numpy cluster-computing dask


    【解决方案1】:

    简答

    export OMP_NUM_THREADS=1
    
    or 
    
    dask-worker --nthreads 1
    

    说明

    OMP_NUM_THREADS 环境变量控制许多库(包括支持numpy.dotBLAS 库)在其计算(如矩阵乘法)中使用的线程数。

    这里的冲突是您有两个相互调用的并行库,BLAS 和 dask.distributed。每个库都设计为使用与系统中可用的逻辑内核一样多的线程。

    例如,如果您有八个内核,那么 dask.distributed 可能会在不同线程上一次运行您的函数 f 八次。 f 中的 numpy.dot 函数调用每次调用将使用 8 个线程,导致同时运行 64 个线程。

    这实际上很好,您会体验到性能下降,但一切都可以正常运行,但它会比您一次仅使用八个线程(通过限制 dask.distributed 或通过限制 BLAS)慢。

    您的系统可能已将OMP_THREAD_LIMIT 设置为某个合理的数字,例如 16,以便在此事件发生时向您发出警告。

    【讨论】:

      【解决方案2】:

      如果您使用 MKL blas,您可能还可以使用 TBB 线程层获得一些改进。我实际上还没有机会尝试,所以 YMMV。

      http://conference.scipy.org/proceedings/scipy2018/anton_malakhov.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 2019-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多