为什么设置“export OPENBLAS_NUM_THREADS=1”会降低性能?

4
我尝试按照这份文档的建议设置"export OPENBLAS_NUM_THREADS=1"。但是我发现一个奇怪的现象,即这样设置会显著损害我的RL算法的性能(我对TD3和SAC进行了一些测试,所有结果都一致表明"export OPENBLAS_NUM_THREADS=1"会影响性能)。为什么会引起这样大的问题呢?
顺便说一下,算法是使用Tensorflow1.13实现的,数据是通过tf.data.Dataset输入到神经网络中的。所有测试都在OpenAI的Gym中的BipedalWalker-v2环境上进行。
1个回答

5
链接的指南建议仅在使用 ray 时设置此变量,而不是始终设置。
据我所知,这是因为该框架本身会生成许多进程(每个actor或其他内容一个进程),因此每个进程使用多个线程不会带来任何加速。但当只有一个或只有几个进程时,情况就不同了。

总的来说,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 时,它们会在内部自动强制执行。


感谢回答,很抱歉回复晚了。我明白他们设置这个的原因,但是我不明白为什么设置这个会影响强化学习算法的最终性能。我以为它只会影响训练速度。这与我在单独的线程中进行网络更新有关吗? - Maybe
@SherwinChen OpenBLAS利用多线程来提高性能(正如你所知,许多线性代数运算是尴尬地并行的)。如果你禁用这个功能,它将降低到单线程性能。 - ivan_pozdeev
谢谢你的更新。根据你的更新,你是不是建议我们不再需要设置OPENBLAS_NUM_THREADS=1了?顺便说一下,我不太确定我们是否同意对“性能”的定义。当我设置OPENBLAS_NUM_THREADS=1时,收敛后的100个回合的平均得分在250-300之间变化。而如果我不设置这个参数,平均得分就会稳定在300左右。我不明白为什么简单地设置OPENBLAS_NUM_THREADS=1会有这样的差异。 - Maybe
@SherwinChen 从你的问题中可以不言而喻!你说如果设置了它会“影响性能”,但并没有说如果不设置会“导致崩溃”或其他什么。那么为什么你还要设置它呢? - ivan_pozdeev
嗨,我更新了之前的回复。我设置它是因为我想使用ray来实现我的算法的分布式版本。根据文档,我进行了设置。然后我发现了这个令人困惑的现象。 - Maybe
@SherwinChen 如果没有重现问题的方法,我不能确定。正如我所说,库文档的理由是如果系统上有大量正在运行的线程,那么在某个时刻,切换和同步开销会超过更好的CPU利用率带来的好处。很可能,你的特定工作负载没有达到那个点。 - ivan_pozdeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接