天道酬勤,学无止境

导入 TensorFlow 产生线程(Importing TensorFlow spawns threads)

问题

我在具有 48 个内核和 python 2.7 的 Ubuntu 14.04 服务器上运行 TensorFlow 0.10.0rc0。 我注意到我的线程数异常高。 我认为找到了 TensorFlow 将为两个线程池生成多个线程并且它们可以通过以下方式控制的解释:

sess = tf.Session(
               config=tf.ConfigProto(inter_op_parallelism_threads=NUM_CORES,
                   intra_op_parallelism_threads=NUM_CORES))

但是,这不起作用,经过一些调查,我发现仅调用import tensorflow as tf线程数增加了大约 50-60。

为什么会这样? 如何防止它并限制实际线程数? 如果我限制inter_op_parallelism_threadsintra_op_parallelism_threads的数量,那些额外的线程在做什么?

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Importing TensorFlow spawns threads
    I am running TensorFlow 0.10.0rc0 on an Ubuntu 14.04 server with 48 cores and python 2.7. I noticed that I have an unusual high thread count. I thought found the explanation that TensorFlow will spawn multiple threads for two threadpools and that they can be controlled by: sess = tf.Session( config=tf.ConfigProto(inter_op_parallelism_threads=NUM_CORES, intra_op_parallelism_threads=NUM_CORES)) However, that does not work and after some investigation, I found out that just calling import tensorflow as tf increases the thread count already by around 50-60. Why is this happening? How can I prevent
  • TensorFlow-从TensorBoard TFEvent文件导入数据吗?(TensorFlow - Importing data from a TensorBoard TFEvent file?)
    问题 我在TensorFlow中使用不同的图形进行了几次培训。 我设置的摘要在训练和验证中显示出有趣的结果。 现在,我想获取保存在摘要日志中的数据,并进行一些统计分析,并以一般方式进行绘制,并以不同的方式查看摘要数据。 是否有任何现有方法可以轻松访问此数据? 更具体地说,是否有任何内置方法可以将TFEvent记录读回到Python? 如果没有简单的方法可以执行此操作,TensorFlow会指出其所有文件格式均为protobuf文件。 从对protobufs的理解(有限)来看,如果我具有TFEvent协议规范,我认为我可以提取这些数据。 有一个简单的方法来解决这个问题吗? 太谢谢你了 回答1 就像Fabrizio所说的那样,TensorBoard是一个很好的工具,用于可视化摘要日志的内容。 但是,如果要执行自定义分析,则可以使用tf.train.summary_iterator()函数遍历日志中的所有tf.Event和tf.Summary协议缓冲区: for summary in tf.train.summary_iterator("/path/to/log/file"): # Perform custom processing in here. tf2的更新: from tensorflow.python.summary.summary_iterator import
  • 导入 keras 时出现导入错误(ImportError with importing keras)
    问题 我正在尝试导入 keras 它给了我一个错误from tensorflow.python.ops import tensor_array_ops 。 >>> import keras Using TensorFlow backend. Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/ss/anaconda2/envs/kerasenv/lib/python2.7/site-packages/keras/__init__.py", line 2, in <module> from . import backend File "/home/ss/anaconda2/envs/kerasenv/lib/python2.7/site-packages/keras/backend/__init__.py", line 67, in <module> from .tensorflow_backend import * File "/home/ss/anaconda2/envs/kerasenv/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 4, in <module> from
  • 在 Tensorflow 中训练 wordvec,导入到 Gensim(Training wordvec in Tensorflow, importing to Gensim)
    问题 我正在从 tensorflow 教程中训练 word2vec 模型。 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/word2vec/word2vec_basic.py 训练后我得到嵌入矩阵。 我想保存它并将其作为 gensim 中的训练模型导入。 要在 gensim 中加载模型,命令是: model = Word2Vec.load_word2vec_format(fn, binary=True) 但是如何从 Tensorflow 生成fn文件呢? 谢谢 回答1 一种方法是以非二进制 Word2Vec 格式保存文件,它基本上如下所示: num_words vector_size # this is the header label0 x00 x01 ... x0N label1 x10 x11 ... x1N ... 例子: 2 3 word0 -0.000737 -0.002106 0.001851 word1 -0.000878 -0.002106 0.002834 保存文件,然后使用 kwarg binary=False加载: model = Word2Vec.load_word2vec_format(filename, binary=False)
  • 在 C++ 中嵌入 python 时导入 tensorflow 返回 null(Importing tensorflow when embedding python in c++ returns null)
    问题 我有一个关于将 python 嵌入到 C++ 应用程序的问题。 设置如下:我有一个大型 C++ 应用程序,它生成一些数据(实时渲染图像)并显示它们。 我还使用 tensorflow 在 python 中训练了一个神经网络,它将接受这些图像。 我的想法是嵌入 python 并将数据作为 numpy 数组发送,使用神经网络进行预测并返回另一个处理过的 numpy 数组以显示(在 C++ 中)。 我在 python 端做了一些没有 tensorflow 的基本测试,以了解在 c 中嵌入 python 等等,它似乎有效。 但是,一旦我将“导入 tensorflow”放入我想要导入的任何 python 脚本中,我就会从 C++ 部分的 PyImport_ImportModule 获得一个 NULL。 例如 import numpy as np def foo(img): return np.clip(img * 2.0, 0, 255).astype(np.uint8) 工作良好。 但以下没有: import numpy as np import tensorflow as tf #this causes the fail def foo(img): return np.clip(img * 2.0, 0, 255).astype(np.uint8) 在第二种情况下,我仍然从
  • Tensorflow后端的Keras能否被迫随意使用CPU或GPU?(Can Keras with Tensorflow backend be forced to use CPU or GPU at will?)
    问题 我安装了Tensorflow后端和CUDA的Keras。 我有时想按需强迫Keras使用CPU。 不用说在虚拟环境中安装单独的仅CPU的Tensorflow就能做到吗? 如果可以,怎么办? 如果后端是Theano,则可以设置标志,但是我还没有听说过可以通过Keras访问Tensorflow标志。 回答1 如果要强制Keras使用CPU 方式1 import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" 在导入Keras / Tensorflow之前。 方式二 运行脚本为 $ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py 也可以看看 https://github.com/keras-team/keras/issues/152 https://github.com/fchollet/keras/issues/4613 回答2 一个相当分离的方法是使用 import tensorflow as tf from keras import backend as K num_cores = 4 if GPU: num_GPU = 1 num_CPU = 1 if CPU: num
  • 导入时出现 pycharm 错误,即使它在终端中工作(pycharm error while importing, even though it works in the terminal)
    问题 我已经安装了 TensorFlow 和 scikit_learn 包及其所有依赖项。 当我尝试在终端中使用 python 2.7.6 或 2.7.10(我都试过)导入它们时,它工作正常。 但是,当我使用 pycharm 执行此操作时,会出现错误。 对于带有启动器 2.7.6的scikit_learn说: 导入错误:动态模块未定义初始化函数 (init_check_build) 在scikit_learn与发射器的情况下2.7.10说: ValueError: numpy.dtype 大小错误,尝试重新编译 对于带有启动器 2.7.6的TensorFlow 来说: ImportError: dlopen(/Library/Python/2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so, 2): 没有找到合适的图像。 确实找到了:/Library/Python/2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so:mach-o,但架构错误 对于带有启动器 2.7.10的TensorFlow来说: 导入错误:没有名为 copyreg 的模块导入张量流时出错。 除非您使用 bazel,否则您不应尝试从其源目录导入 tensorflow; 请退出
  • PyCharm 远程解释器和 Tensorflow -> 无法导入 Cudart.so(PyCharm remote interpreter and Tensorflow -> can not import Cudart.so)
    问题 我使用 PyCharm 进行远程调试,客户端 Win10,服务器 Ubuntu 16。在 Ubuntu 机器上,我正确安装了 Cuda 8.0,以及 python 2.7 和 tensorflow 1.0.0。 Tensorflow 在服务器上完美运行(ssh + 调用 python、导入 tensorflow 等)。 在 PyCharm 中,我为我的服务器机器设置了一个远程调试器,但现在导入 tensorflow 导致错误: Traceback (most recent call last): File "/home/*****/*****/********/*******.py", line 24, in <module> import tensorflow as tf File "/usr/local/lib/python2.7/dist-packages/tensorflow/__init__.py", line 24, in <module> from tensorflow.python import * File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/__init__.py", line 60, in <module> raise ImportError(msg) ImportError
  • 如何在keras中获得可复制的结果(How to get reproducible results in keras)
    问题 每次从imdb_lstm.py框架(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py)运行imdb_lstm.py示例时,我都会得到不同的结果(测试准确性)。代码包含np.random.seed(1337)在任何keras导入之前,顶部为np.random.seed(1337) 。 应该防止它为每次运行生成不同的数字。 我想念什么? 更新:如何复制: 安装Keras(http://keras.io/) 多次执行https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py。 它将训练模型并输出测试精度。 预期结果:每次运行的测试准确性均相同。 实际结果:每次运行的测试准确性都不同。 UPDATE2:我正在Windows 8.1上使用MinGW / msys,模块版本运行它: theano 0.7.0 numpy的1.8.1 scipy 0.14.0c1 UPDATE3:我将问题缩小了一点。 如果我在GPU上运行示例(设置theano标志device = gpu0),则每次都会得到不同的测试精度,但是如果我在CPU上运行它,那么一切都会按预期进行。 我的显卡:NVIDIA GeForce GT 635) 回答1
  • 从元图文件导入张量流模型时配置 input_map(Configure input_map when importing a tensorflow model from metagraph file)
    问题 我已经训练了一个 DCGAN 模型,现在想将它加载到一个库中,该库通过图像空间优化来可视化神经元激活的驱动因素。 以下代码有效,但在进行后续图像分析时迫使我使用(1,宽度,高度,通道)图像,这很痛苦(关于网络输入形状的库假设)。 # creating TensorFlow session and loading the model graph = tf.Graph() sess = tf.InteractiveSession(graph=graph) new_saver = tf.train.import_meta_graph(model_fn) new_saver.restore(sess, './') 我想更改 input_map,阅读源代码后,我希望此代码可以工作: graph = tf.Graph() sess = tf.InteractiveSession(graph=graph) t_input = tf.placeholder(np.float32, name='images') # define the input tensor t_preprocessed = tf.expand_dims(t_input, 0) new_saver = tf.train.import_meta_graph(model_fn, input_map={'images': t
  • 张量流梯度更新中的确定性?(Determinism in tensorflow gradient updates?)
    问题 所以我有一个用 Tensorflow 编写的非常简单的 NN 脚本,我很难追踪一些“随机性”来自哪里。 我已经记录了 重量, 渐变, 登录 我训练时的网络,对于第一次迭代,很明显,一切都是一样的。 我有一个关于如何读入数据的 SEED 值,以及一个用于初始化网络权重的 SEED 值。 那些我永远不会改变的。 我的问题是,在说我每次重新运行的第二次迭代时,我开始看到梯度发散(少量,例如 1e-6 左右)。 然而,随着时间的推移,这当然会导致不可重复的行为。 这可能是什么原因? 我不知道任何可能的随机性来源可能来自哪里...... 谢谢 回答1 如果您在 CPU 上运行网络( export CUDA_VISIBLE_DEVICES= ),在特征线程池中使用单线程( tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1) ),一个 Python 线程,则tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1)可能获得确定性结果(没有从像tf.batch这样的操作中获得的多线程队列tf.batch ),以及一个明确定义的操作顺序。在某些情况下,使用inter_op_parallelism_threads=1也可能有所帮助。
  • How to stop TensorFlow from multi-threading
    I am writing code for NIST FRVT. NIST wants the program to run at max 2 threads(Only CPU, No GPU). I am using TensorFlow in my code but it always spawns much more than 2 threads. I tried this solution. It decreased the number of threads, but not up to 2 I'm getting this warning [WARNING] We've detected that your software may be threading or using other multiprocessing techniques during template creation. The number of threads detected was 9 and it should be 2. Per the API document, implementations must run single-threaded. In the test environment, there is no advantage to threading, because
  • 在Cifar10上更改TensorFlow中的线程数(Changing the number of threads in TensorFlow on Cifar10)
    问题 每当我运行cifar10_eval.py时,都会创建32个线程,如下所示: 我tensorflow / core / common_runtime / local_device.cc:25]本地设备内部op并行线程:32 我认为该线程数就是CPU上运行的线程数,但是当我检查使用情况时,仅使用了400-500%的CPU。 无论如何,要更改此线程数吗? 回答1 要配置此值,可以在构造tf.Session时传递tf.ConfigProto参数: NUM_THREADS = … sess = tf.Session(config=tf.ConfigProto( intra_op_parallelism_threads=NUM_THREADS))
  • Queue-QueueRunner-Coordinator
    TensorFlow里与Queue有关的概念和用法。 Queue 是TensorFlow队列和缓存机制的实现。QueueRunner 是TensorFlow中对操作Queue的线程的封装。Coordinator 是TensorFlow中用来协调线程预先的工具。 Queue 根据实现的方式不同,可以分成一下几类: tf.FIFOQueue 按入列顺序出列的队列tf.RandomShuffleQueue 随机顺序出列的队列tf.PaddingFIFOQueue 以固定长度批量出列的队列tf.PriorityQueue 带优先级出列的队列... 这些类型的Queue出列自身的性质不太一样,创建、使用的方法基本是相同的。 # 创建函数的参数 tf.FIFOQueue(capacity, dtypes, shapes=None, names=None ...) Queue主要包含入列(enqueue)和出列(dequeue)两个操作。enqueue操作返回计算图中的一个Operation节点,dequeue操作返回一个Tensor值。Tensor在创建时同样只是一个定义或称为声明,需要放在Session中运行才能获得真正的数值。 import tensorflow as tf tf.InteractiveSession() q = tf.FIFOQueue(2, 'float') init
  • TensorFlow/Keras 多线程模型拟合(TensorFlow/Keras multi-threaded model fitting)
    问题 我正在尝试使用多个线程(和tensorflow后端)训练具有不同参数值的多个keras模型。 我已经看到了在多个线程中使用相同模型的一些示例,但在这种特殊情况下,我遇到了有关冲突图等的各种错误。这是我希望能够执行的一个简单示例: from concurrent.futures import ThreadPoolExecutor import numpy as np import tensorflow as tf from keras import backend as K from keras.layers import Dense from keras.models import Sequential sess = tf.Session() def example_model(size): model = Sequential() model.add(Dense(size, input_shape=(5,))) model.add(Dense(1)) model.compile(optimizer='sgd', loss='mse') return model if __name__ == '__main__': K.set_session(sess) X = np.random.random((10, 5)) y = np.random.random((10, 1))
  • 导入 keras.backend 引起的 image_dim_ordering 问题解决办法
    1.AttributeError: module ‘keras.backend’ has no attribute ‘image_dim_ordering’ 产生的原因是:导入backend 是从tf导入进来的,比如 import tensorflow.keras.backend as K 而且 tensorflow 与 keras 版本也不一致,会引起上述问题 解决方案1: import tensorflow.python.keras.backend as K K.common.image_dim_ordering() 采用这种方式会产生get_graph等其它问题,比如: module ‘tensorflow.python.keras.backend’ has no attribute ‘get_graph’ 解决方案2: backend 导入不从 tensorflow 导入,直接使用 keras 导入,可以避免很多其它的问题 即:import keras.backend as K 含义就是 在keras 与 tensorflow 版本不一致的时候,backend 的导入直接使用 keras 的,而不使用 tensorflow 的。其它的问题就是tf2.0 向下兼容 tf1.0 的部分代码,即所有的问题基本上都可以解决。 来源:https://blog.csdn.net
  • inter_op_parallelism_threads和intra_op_parallelism_threads的含义(Meaning of inter_op_parallelism_threads and intra_op_parallelism_threads)
    问题 有人可以解释以下TensorFlow术语吗 inter_op_parallelism_threads intra_op_parallelism_threads 或者,请提供指向正确说明源的链接。 我通过更改参数进行了一些测试,但结果并不一致,无法得出结论。 回答1 tf.ConfigProto协议缓冲区的源中记录了inter_op_parallelism_threads和intra_op_parallelism_threads选项。 这些选项配置了TensorFlow用来并行化执行的两个线程池,如注释所述: // The execution of an individual op (for some op types) can be // parallelized on a pool of intra_op_parallelism_threads. // 0 means the system picks an appropriate number. int32 intra_op_parallelism_threads = 2; // Nodes that perform blocking operations are enqueued on a pool of // inter_op_parallelism_threads available in each process
  • Tensorflow 多线程图像加载(Tensorflow multithreading image loading)
    问题 所以我有这个玩具示例代码; import glob from tqdm import tqdm import tensorflow as tf imgPaths = glob.glob("/home/msmith/imgs/*/*") # Some images filenameQ = tf.train.string_input_producer(imgPaths) reader = tf.WholeFileReader() key, value = reader.read(filenameQ) img = tf.image.decode_jpeg(value) init_op = tf.initialize_all_variables() with tf.Session() as sess: sess.run(init_op) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) for i in tqdm(range(10000)): img.eval().mean() 它加载图像并打印每个图像的平均值。 如何编辑它以便它对图像的加载部分进行多线程处理,这是目前我的 tf 图像脚本的瓶颈。 回答1 编辑 (2018/3/5):现在使用tf.data API
  • 如何在Tensorflow中使用自定义python函数预取数据(How to prefetch data using a custom python function in tensorflow)
    问题 我正在尝试预取训练数据以隐藏I / O延迟。 我想编写自定义Python代码,该代码从磁盘加载数据并对数据进行预处理(例如,通过添加上下文窗口)。 换句话说,一个线程进行数据预处理,而另一个线程进行训练。 TensorFlow有可能吗? 更新:我有一个基于@mrry的示例的工作示例。 import numpy as np import tensorflow as tf import threading BATCH_SIZE = 5 TRAINING_ITERS = 4100 feature_input = tf.placeholder(tf.float32, shape=[128]) label_input = tf.placeholder(tf.float32, shape=[128]) q = tf.FIFOQueue(200, [tf.float32, tf.float32], shapes=[[128], [128]]) enqueue_op = q.enqueue([label_input, feature_input]) label_batch, feature_batch = q.dequeue_many(BATCH_SIZE) c = tf.reshape(feature_batch, [BATCH_SIZE, 128]) + tf.reshape(label
  • 即使设置了随机种子,为什么在Keras中仍无法获得可重复的结果?(Why can't I get reproducible results in Keras even though I set the random seeds?)
    问题 我正在使用Mac OSX上的Keras在虚拟数据上训练MobileNet体系结构。 我同时设置了nump.random和tensorflow.set_random_seed ,但是由于某些原因,我无法获得可重复的结果:每次我重新运行代码时,都会得到不同的结果。 为什么? 这不是因为GPU,因为我在具有Radeon显卡的MacBook Pro 2017上运行,因此Tensorflow没有利用它。 该代码运行 python Keras_test.py 因此这不是状态问题(我不使用Jupyter或IPython:每次运行代码时都应重置环境)。 编辑:我通过导入Keras之前移动所有种子的设置来更改代码。 结果仍然不确定,但是结果的方差比以前小得多。 这很奇怪。 当前模型非常小(就深度神经网络而言)并不微不足道,它不需要GPU即可运行,并且可以在现代笔记本电脑上进行几分钟的训练,因此任何人都可以重复我的实验。 我邀请您这样做:我对了解一个系统到另一个系统的变化程度非常感兴趣。 import numpy as np # random seeds must be set before importing keras & tensorflow my_seed = 512 np.random.seed(my_seed) import random random.seed(my_seed)