1. 程式人生 > 程式設計 >Tensorflow 多執行緒設定方式

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,
enqueue_many=False,
allow_smaller_final_batch=False,name=None)

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

4) maybe_shuffle_batch(tensors,
keep_input,
enqueue_many=False,
allow_smaller_final_batch=False,
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,
shapes=None,allow_smaller_final_batch=False,
shared_name=None,name=None):

2) maybe_batch_join(tensors_list,
enqueue_many=False,
allow_smaller_final_batch=False,
name=None)

3) shuffle_batch_join(tensors_list,
min_after_dequeue,
shapes=None,
shared_name=None,name=None)

4) maybe_shuffle_batch_join(tensors_list,
min_after_dequeue,
enqueue_many=False,
allow_smaller_final_batch=False,
name=None)

例:

import tensorflow as tf 
 
 
filenames = ['A.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,['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 
  coord.request_stop() 
  coord.join(threads) 

以上這篇Tensorflow 多執行緒設定方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。