您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Tensorflow如何設(shè)置多線程的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一. 通過 ConfigProto 設(shè)置多線程
在進(jìn)行 tf.ConfigProto() 初始化時,可以通過設(shè)置相應(yīng)的參數(shù),來控制每個操作符 op 并行計算的線程個數(shù)或 session 線程池的線程數(shù)。主要涉及的參數(shù)有以下三個:
1. intra_op_parallelism_threads 控制運(yùn)算符op內(nèi)部的并行
當(dāng)運(yùn)算符 op 為單一運(yùn)算符,并且內(nèi)部可以實現(xiàn)并行時,如矩陣乘法,reduce_sum 之類的操作,可以通過設(shè)置 intra_op_parallelism_threads 參數(shù)來并行。
2. inter_op_parallelism_threads 控制多個運(yùn)算符op之間的并行計算
當(dāng)有多個運(yùn)算符 op,并且他們之間比較獨立,運(yùn)算符和運(yùn)算符之間沒有直接的路徑 Path 相連。Tensorflow會嘗試并行地計算他們,使用由 inter_op_parallelism_threads 參數(shù)來控制數(shù)量的一個線程池。
在第一次創(chuàng)建會話將設(shè)置將來所有會話的線程數(shù),除非是配置了 session_inter_op_thread_pool 選項。
3. session_inter_op_thread_pool 配置會話線程池。
如果會話線程池的 num_threads 為 0,使用 inter_op_parallelism_threads 選項。
二. 通過隊列進(jìn)行數(shù)據(jù)讀取時設(shè)置多線程
1. 通過以下函數(shù)進(jìn)行樣本批處理時,可以通過設(shè)置 num_threads 來設(shè)置單個 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。 # 經(jīng)過 Reader 讀取文件和 Decoder 解碼后數(shù)據(jù)會進(jìn)入這個隊列,再批量出隊。 # tf.train.batch() 這里只有一個 Reader,可以設(shè)置多線程 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. 通過以下函數(shù)進(jìn)行樣本批處理時,可以通過設(shè)置 Decoder 和 Reader 的個數(shù)來設(shè)置多 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。 # 經(jīng)過多個 Reader 讀取文件和 Decoder 解碼后數(shù)據(jù)會進(jìn)入這個隊列,再批量出隊。 # 使用 tf.train.batch_join(), 可以使用多個 Reader 并行讀取數(shù)據(jù)。每個 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)
感謝各位的閱讀!關(guān)于“Tensorflow如何設(shè)置多線程”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。