为什么tensorflow会使用所有CPU内核?

umuewwlo  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(197)

我重新安装了Jupyter Notebook内核和python包,包括tensorflow 2.4.1(使用miniconda env)。
当我训练和测试一个模型时,我的CPU使用率达到饱和。在我的旧安装中,这种情况不会发生(低CPU使用率),完成任务的时间几乎相同。
我在Jupyter笔记本和VSCode上测试过,同样的问题也出现了。Ubuntu 20.04 16 GB RAM英特尔®酷睿™ i5- 8300 H CPU@2.30GHz × 8
CPU usage when training a simple network model - htop view

编辑:条件已解决。

我在英特尔网站上做了深入的研究,发现了这个link,关于Tensorflow和openMP的线程配置。我运行了一些快速测试,改变了下面的Tensorflow 2.x部分参数,没有任何改进。

import tensorflow as tf
tf.config.threading.set_inter_op_parallelism_threads() 
tf.config.threading.set_intra_op_parallelism_threads()
tf.config.set_soft_device_placement(enabled)

然后测试OpenMP设置,将OMP_NUM_THREADS从0更改为8,如下图所示:
training time vs OMP_NUM_THREADS

import os
os.environ["OMP_NUM_THREADS"] = “16”

CPU使用率降低,培训时间缩短。
CPU usage for OMP_NUM_THREADS equal to 0
OBS.:我不是ML基准测试Maven。只是修正了keras.Sequential()模型的网络训练参数和拓扑。不知道为什么我的CPU默认以最大OMP_NUM_THREADS=16线程化。

r7knjye2

r7knjye21#

在我们的多用户环境中,我们需要为更高优先级的任务保留一些cpu的空闲空间(我们没有“好”进程的权限)。因此,减少tensorflows(版本2.8.2)cpu贪婪是非常必要的。上述解决方案适用于我们的纯cpu环境(linux,40个内核),限制线程间/线程内为1。

import os
os.environ["OMP_NUM_THREADS"] = “8”

import tensorflow as tf
tf.config.threading.set_inter_op_parallelism_threads(1) 
tf.config.threading.set_intra_op_parallelism_threads(1)

这将cpu使用率限制为800%。

相关问题