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和C/C++交互的几种方法总结
May 11 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
Python实现的归并排序算法示例
Nov 21 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
python使用__slots__让你的代码更加节省内存
Sep 05 Python
python scp 批量同步文件的实现方法
Jan 03 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
关于python中plt.hist参数的使用详解
Nov 28 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
Python基于Serializer实现字段验证及序列化
Nov 04 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
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
php 使用array函数实现分页
2015/02/13 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
python进阶教程之循环对象
2014/08/30 Python
Python修改MP3文件的方法
2015/06/15 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
Python datetime包函数简单介绍
2019/08/28 Python
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
办公室文员自荐书
2014/02/03 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
幼儿园课题方案
2014/06/09 职场文书
三好学生个人总结
2015/02/15 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
免职通知
2015/04/23 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
vue实现滑动解锁功能
2022/03/03 Vue.js
Golang获取List列表元素的四种方式
2022/04/20 Golang