在Ubuntu中构建的Tensorflow MKL-DNN会默默地产生错误结果

问题描述 投票:0回答:1

我在Ubuntu 16.04中从源代码构建了Tensorflow 1.6.0-rc0,并在this guide之后支持MKL-DNN。构建过程没有任何问题。使用keras 2.1.3在this example“as is”的简单卷轴上测试它比使用非MKL构建慢两倍。

现在,按照the guide的建议调整MKL参数可以使非MKL构建的速度提高近2倍。但在准确性(和损失)方面产生完全无稽之谈:

Erroneous results from Tensorflow MKL-DNN build

这没有来自控制台的错误或警告。 MKL参数调整如下:

from keras import backend as K
K.set_session(K.tf.Session(config=K.tf.ConfigProto(inter_op_parallelism_threads=1)))
os.environ["KMP_BLOCKTIME"] = "0"
os.environ["KMP_AFFINITY"] = "granularity=fine,verbose,compact,1,0"

CPU是i7-4790K。

作为参考,从运行中获得的结果没有调整MKL参数是预期的:

Correct results from Tensorflow

有没有人遇到类似的问题?在GitHub上解决问题之前,只需检查社区。

tensorflow deep-learning keras intel-mkl
1个回答
1
投票

如果参数“inter_op_parallelism_threads”为2,则不会获得如此平坦的精度。

以下是MKL调整参数的修改版本,可能会加速您的代码:

from keras import backend as K
import tensorflow as tf
config = tf.ConfigProto(intra_op_parallelism_threads=<Number.of Cores>, inter_op_parallelism_threads=2, allow_soft_placement=True,  device_count = {'CPU': <Number.of Cores>})
session = tf.Session(config=config)
K.set_session(session)
os.environ["OMP_NUM_THREADS"] = "<Number.of Cores>"
os.environ["KMP_BLOCKTIME"] = "30"
os.environ["KMP_SETTINGS"] = "1"
os.environ["KMP_AFFINITY"]= "granularity=fine,verbose,compact,1,0"

例如:

from keras import backend as K
import tensorflow as tf
config = tf.ConfigProto(intra_op_parallelism_threads=8, inter_op_parallelism_threads=2, allow_soft_placement=True,  device_count = {'CPU': 8})
session = tf.Session(config=config)
K.set_session(session)
os.environ["OMP_NUM_THREADS"] = "8"
os.environ["KMP_BLOCKTIME"] = "30"
os.environ["KMP_SETTINGS"] = "1"
os.environ["KMP_AFFINITY"]= "granularity=fine,verbose,compact,1,0"

由于某些优化参数对于不同的代码有不同的工作方式,因此您还可以使用上述参数来查看更快的速度

© www.soinside.com 2019 - 2024. All rights reserved.