python - 为什么设置“export OPENBLAS_NUM_THREADS=1”会影响性能?
问题描述
我尝试按照本文档的建议设置“export OPENBLAS_NUM_THREADS=1”。但是我发现了一个奇怪的现象,设置这个会显着影响我的 RL 算法的性能(我对 TD3 和 SAC 做了一些测试,所有结果一致表明“export OPENBLAS_NUM_THREADS=1”会影响性能)。为什么会引起这么大的问题?
顺便说一句,算法是使用 Tensorflow1.13 实现的,数据通过tf.data.Dataset输入神经网络。所有测试均在OpenAI 的 Gym 的BipedalWalker-v2环境中完成。
解决方案
链接指南建议在使用时专门设置此变量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 是否有任何使用限制,numpy
并且scipy
如果您通过它们使用 OpenBLAS,则在内部自动执行它们。
推荐阅读
- postgresql - 在 Postgres 中清理 Spring Batch 表的策略
- java - 不能在带有 String.replaceFirst() 或 String.replaceAll() 的替换字符串中使用反斜杠
- arrays - 在 MongoDB 中存储数组或字符串是更好的做法吗?
- c# - 嵌套查询不适用于实体框架绑定转发器控件
- android - Save API data in Room database in Android
- java - 如何在 Java (Eclipse) 中对角检查二维字符数组中的字符串
- swift - UITableView 重叠一切
- java - appcompat 活动崩溃 API 28
- c# - TPL Dataflow CompletionPropagation 不工作 MaxMessage - 选项不工作
- excel - 如何根据合并单元格中的条件移动多行?