Tensorflow 多线程设置方式
一.通过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)
例:
importtensorflowastf 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) withtf.Session()assess: coord=tf.train.Coordinator() threads=tf.train.start_queue_runners(coord=coord) foriinrange(10): e_val,l_val=sess.run([example_batch,label_batch]) printe_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)
例:
importtensorflowastf 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_inrange(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) withtf.Session()assess: coord=tf.train.Coordinator() threads=tf.train.start_queue_runners(coord=coord) foriinrange(10): e_val,l_val=sess.run([example_batch,label_batch]) printe_val,l_val coord.request_stop() coord.join(threads)
以上这篇Tensorflow多线程设置方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。