我目前正在尝试找到一种有效的方法,使用tensorflow
在一定数量的内核上运行机器学习任务。从我发现的信息中,有两种主要的实现方法。
第一个是使用两个张量流变量intra_op_parallelism_threads和inter_op_parallelism_threads,然后使用此配置创建会话。
其中第二个正在使用OpenMP
。设置环境变量OMP_NUM_THREADS
可以控制为该进程产生的线程数量。
当我发现通过conda和pip安装tensorflow提供了两种不同的环境时,我的问题出现了。在conda install
中,修改OpenMP
环境变量似乎改变了进程并行化的方式,而在“ pip环境”中,唯一似乎改变的是内部/内部配置变量,我前面提到过。
出于基准测试的原因,这导致尝试比较两个安装的过程中有些困难。如果在OMP_NUM_THREADS
的48核处理器上将conda install
设置为等于1,并且将inter / intra设置为16,则内部/内部的设置将仅为200%,因为大多数线程在任何给定时间都是空闲的。 / p>
omp_threads = 1
mkl_threads = 1
os.environ["OMP_NUM_THREADS"] = str(omp_threads)
os.environ["MKL_NUM_THREADS"] = str(mkl_threads)
config = tf.ConfigProto()
config.intra_op_parallelism_threads = 16
config.inter_op_parallelism_threads = 16
session = tf.Session(config=config)
K.set_session(session)
我希望这段代码产生32个线程,其中大多数线程在任何给定时间都被利用,而实际上它产生32个线程,而一次只使用4-5个线程。
在使用tensorflow之前有人遇到过类似的事情吗?
为什么通过conda和pip安装似乎可以提供两种不同的环境?
通过使用前面讨论的两种方法的某种组合,是否有办法在两个安装上具有可比的性能?
最后是否有更好的方法将python限制为特定数量的内核?
答案 0 :(得分:0)
回答您的第一个和最后一个问题。
是的,我在使用通过pip安装的TensorFlow时遇到了类似的情况。 您可以通过在Linux上使用线程亲缘关系,numatcl或任务集将python限制为特定数量的内核。
查看以下链接提供的详细信息,TensorFlow将始终生成多个线程,并且其中大多数默认情况下处于休眠状态。
答案 1 :(得分:0)
我认为这里的重点是 conda 使用 MKL 安装 Tensorflow,但 pip 没有。
OpenMP 控制只适用于 MKL,在 pip install 中,OpenMP 环境变量不起作用,仅将 TFSessionConfig 设置为内部/内部可能会影响多线程