Tensorflow 多线程设置方式


Posted in Python onFebruary 06, 2020

一. 通过 ConfigProto 设置多线程

(具体参数功能及描述见 tensorflow/core/protobuf/config.proto)

在进行 tf.ConfigProto() 初始化时,可以通过设置相应的参数,来控制每个操作符 op 并行计算的线程个数或 session 线程池的线程数。主要涉及的参数有以下三个:

1. intra_op_parallelism_threads 控制运算符op内部的并行
当运算符 op 为单一运算符,并且内部可以实现并行时,如矩阵乘法,reduce_sum 之类的操作,可以通过设置 intra_op_parallelism_threads 参数来并行。

2. inter_op_parallelism_threads 控制多个运算符op之间的并行计算
当有多个运算符 op,并且他们之间比较独立,运算符和运算符之间没有直接的路径 Path 相连。Tensorflow会尝试并行地计算他们,使用由 inter_op_parallelism_threads 参数来控制数量的一个线程池。
在第一次创建会话将设置将来所有会话的线程数,除非是配置了 session_inter_op_thread_pool 选项。

3. session_inter_op_thread_pool 配置会话线程池。
如果会话线程池的 num_threads 为 0,使用 inter_op_parallelism_threads 选项。

二. 通过队列进行数据读取时设置多线程

(具体函数功能及描述见 tensorflow/python/training/input.py)

1. 通过以下函数进行样本批处理时,可以通过设置 num_threads 来设置单个 Reader 多线程读取

1) batch(tensors, batch_size, num_threads=1, capacity=32,
enqueue_many=False, shapes=None, dynamic_pad=False,
allow_smaller_final_batch=False, shared_name=None, name=None)

2) maybe_batch(tensors, keep_input, batch_size, num_threads=1, capacity=32,
enqueue_many=False, shapes=None, dynamic_pad=False,
allow_smaller_final_batch=False, shared_name=None, name=None)

3) shuffle_batch(tensors, batch_size, capacity, min_after_dequeue,
num_threads=1, seed=None, enqueue_many=False, shapes=None,
allow_smaller_final_batch=False, shared_name=None, name=None)

4) maybe_shuffle_batch(tensors, batch_size, capacity, min_after_dequeue,
keep_input, num_threads=1, seed=None,
enqueue_many=False, shapes=None,
allow_smaller_final_batch=False, shared_name=None,
name=None)

例:

import tensorflow as tf 
 
 
filenames = ['A.csv', 'B.csv', 'C.csv'] 
# 生成一个先入先出队列和一个 QueueRunner,生成文件名队列 
filename_queue = tf.train.string_input_producer(filenames, shuffle=False) 
 
 
# 定义 Reader 和 Decoder
reader = tf.TextLineReader() 
key, value = reader.read(filename_queue) 
example, label = tf.decode_csv(value, record_defaults=[['null'], ['null']])
 
 
# 使用tf.train.batch() 会为 graph 添加一个样本队列和一个 QueueRunner。 
# 经过 Reader 读取文件和 Decoder 解码后数据会进入这个队列,再批量出队。
# tf.train.batch() 这里只有一个 Reader,可以设置多线程
 
example_batch, label_batch = tf.train.batch([example, label], batch_size=5) 
 
 
with tf.Session() as sess: 
  coord = tf.train.Coordinator() 
  threads = tf.train.start_queue_runners(coord=coord) 
  for i in range(10): 
    e_val,l_val = sess.run([example_batch,label_batch]) 
    print e_val,l_val 
  coord.request_stop() 
  coord.join(threads)

2. 通过以下函数进行样本批处理时,可以通过设置 Decoder 和 Reader 的个数来设置多 Reader 读取,其中每个 Reader 使用一个线程

1) batch_join(tensors_list, batch_size, capacity=32, enqueue_many=False,
shapes=None, dynamic_pad=False, allow_smaller_final_batch=False,
shared_name=None, name=None):

2) maybe_batch_join(tensors_list, keep_input, batch_size, capacity=32,
enqueue_many=False, shapes=None, dynamic_pad=False,
allow_smaller_final_batch=False, shared_name=None,
name=None)

3) shuffle_batch_join(tensors_list, batch_size, capacity,
min_after_dequeue, seed=None, enqueue_many=False,
shapes=None, allow_smaller_final_batch=False,
shared_name=None, name=None)

4) maybe_shuffle_batch_join(tensors_list, batch_size, capacity,
min_after_dequeue, keep_input, seed=None,
enqueue_many=False, shapes=None,
allow_smaller_final_batch=False, shared_name=None,
name=None)

例:

import tensorflow as tf 
 
 
filenames = ['A.csv', 'B.csv', 'C.csv'] 
# 生成一个先入先出队列和一个 QueueRunner,生成文件名队列
filename_queue = tf.train.string_input_producer(filenames, shuffle=False) 
 
 
# 定义 Reader
reader = tf.TextLineReader() 
key, value = reader.read(filename_queue) 
 
 
#定义了多个 Decoder, 每个 Decoder 跟一个 Reader 相连, 即有多个 Reader
example_list = [tf.decode_csv(value, record_defaults=[['null'], ['null']])
         for _ in range(2)] # Decoder 和 Reader 为 2
   
# 使用tf.train.batch_join() 会为 graph 添加一个样本队列和一个 QueueRunner。 
# 经过多个 Reader 读取文件和 Decoder 解码后数据会进入这个队列,再批量出队。   
# 使用 tf.train.batch_join(), 可以使用多个 Reader 并行读取数据。每个 Reader 使用一个线程
example_batch, label_batch = tf.train.batch_join(example_list, batch_size=5) 
with tf.Session() as sess: 
  coord = tf.train.Coordinator() 
  threads = tf.train.start_queue_runners(coord=coord) 
  for i in range(10): 
    e_val,l_val = sess.run([example_batch,label_batch]) 
    print e_val,l_val 
  coord.request_stop() 
  coord.join(threads)

以上这篇Tensorflow 多线程设置方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python类的基础入门知识
Nov 24 Python
Python运算符重载用法实例分析
Jun 01 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
python实现简单遗传算法
Mar 19 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
Python底层封装实现方法详解
Jan 22 Python
Django中的session用法详解
Mar 09 Python
Python count函数使用方法实例解析
Mar 23 Python
python读取excel数据并且画图的实现示例
Feb 08 Python
Scrapy框架基本命令与settings.py设置
Feb 06 #Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 #Python
Python输出指定字符串的方法
Feb 06 #Python
python实现简单飞行棋
Feb 06 #Python
python实现飞行棋游戏
Feb 05 #Python
以SQLite和PySqlite为例来学习Python DB API
Feb 05 #Python
Python操作Sqlite正确实现方法解析
Feb 05 #Python
You might like
Thinkphp中的volist标签用法简介
2014/06/18 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
javascript Window及document对象详细整理
2011/01/12 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
PyQt5组件读取参数的实例
2019/06/25 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
对python中各个response的使用说明
2020/03/28 Python
python 错误处理 assert详解
2020/04/20 Python
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
英语求职信范文
2014/05/23 职场文书
2014年节能工作总结
2014/12/18 职场文书
中秋客户感谢信
2015/01/22 职场文书
邀请函的格式
2015/01/30 职场文书
毕业班工作总结
2015/08/10 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python
python playwright 自动等待和断言详解
2021/11/27 Python
gojs实现蚂蚁线动画效果
2022/02/18 Javascript
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL