【问题标题】:Why would setting "export OPENBLAS_NUM_THREADS=1" impair the performance?为什么设置“export OPENBLAS_NUM_THREADS=1”会影响性能?
【发布时间】:2019-05-13 00:10:36
【问题描述】:

我尝试按照this document 的建议设置“export OPENBLAS_NUM_THREADS=1”。但是我发现了一个奇怪的现象,设置这个会显着影响我的 RL 算法的性能(我对 TD3 和 SAC 做了一些测试,所有结果一致表明“export OPENBLAS_NUM_THREADS=1”会影响性能)。为什么会引起这么大的问题?

顺便说一句,算法使用 Tensorflow1.13 实现,数据通过tf.data.Dataset 输入神经网络。所有测试均在 OpenAI 的 Gym 的 BipedalWalker-v2 环境中完成。

【问题讨论】:

    标签: python multithreading tensorflow reinforcement-learning openblas


    【解决方案1】:

    链接指南建议在使用 ray 时专门设置此变量,但并非总是如此。

    AFAICS,那是因为该框架本身会产生许多进程(每个参与者一个进程或某事),因此每个进程都使用多个线程不会带来任何加速。只有一个或只有几个进程时,情况并非如此。


    一般来说,OpenBLAS FAQ 表示 OpenBLAS 的多线程可能与主程序的多线程“冲突”,并建议在这种情况下设置 OPENBLAS_NUM_THREADS=1。然而,FAQ 条目未能提供任何详细信息来验证其声明,因此它很可能已过时!根据https://github.com/obspy/obspy/wiki/Notes-on-Parallel-Processing-with-Python-and-ObsPy,这种“冲突”的症状是猖獗的僵局和段错误。因此,如果您没有类似的东西,那么您就很清楚了。主要的 Python 库非常负责自己处理此类问题,而不是将它们转储给用户,所以我很确定如果 OpenBLAS 有任何使用限制,numpyscipy 在内部自动执行它们,如果你正在使用OpenBLAS 通过它们。

    【讨论】:

    • 感谢您的回复,抱歉回复晚了。我明白他们设置它的原因,但我不明白为什么设置它会损害 RL 算法的最终性能。我认为它只会影响训练速度。这与我在单独的线程中进行网络更新有关吗?
    • @SherwinChen OpenBLAS 利用多线程来提高其性能(您可能知道,许多线性代数运算是令人尴尬的并行)。如果禁用此功能,它将降级为单线程性能。
    • 感谢您的更新。根据您的更新,您是否建议我们不再需要设置OPENBLAS_NUM_THREADS=1?顺便说一句,我不太确定我们是否同意“性能”的定义。当我设置OPENBLAS_NUM_THREADS=1 时,100 集的平均分数在收敛时从 250-300 变化。当我不设置这个时,平均分数相当稳定在 300。我不明白为什么简单地设置 OPENBLAS_NUM_THREADS=1 会产生如此大的不同。
    • @SherwinChen 你的问题不用说!您说如果设置它会“损害性能”,并且没有说如果不设置它会“导致崩溃”或任何事情。那你为什么要设置它呢?)
    • 您好,我已经更新了我之前的回复。我设置它是因为我想使用ray 实现我的算法的分布式版本。根据文件,我设置了它。然后我发现了这个令人困惑的现象。
    猜你喜欢
    • 2012-05-11
    • 2020-07-23
    • 1970-01-01
    • 2010-12-23
    • 2016-10-21
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多