TensorFlow會話的配置項
作者: 馬小李23
原文鏈接:https://www.jianshu.com/p/b9a442bcfd2e查看更多的專業文章,請移步至「人工智慧LeadAI」公眾號,查看更多的課程信息和產品信息,請移步至全新打造呈現的官網:www.leadai.org.
TensorFlow配置項的文檔位於這裡
TensorFlow可以通過指定配置項,來配置需要運行的會話,示例代碼如下:
run_config = tf.ConfigProto()
sess = tf.Session(config=run_config)
02
ConfigProto類配置項
對於ConfigProto類具體有如下可配置的部分。
map<string, int32> device_count:設備的數量映射。key為設備的名稱(比如」CPU」或者」GPU」),而value為該類型設備的數量的最大值。如果沒有設置的話,系統會自動設置合適的數值。
int32 intra_op_parallelism_threads:線程池中線程的數量,一些獨立的操作可以在這指定的數量的線程中進行並行,如果設置為0代表讓系統設置合適的數值。
int32 inter_op_parallelism_threads:每個進程可用的為進行阻塞操作節點準備的線程池中線程的數量,設置為0代表讓系統選擇合適的數值。需要注意的是,第一個創建的會話會為將來創建的所有會話設置這個線程的數值,除非use_per_session_threads被設置為True,或者是session_inter_op_thread_pool被配置。
bool use_per_session_threads:是否為每個會話使用單獨的線程池。如果設置為True,則為這個會話使用新的線程池,而不是使用全局的線程池。僅僅支持直接的會話。如果設置為False,將會使用由第一個會話創建的全局線程池,或者使用由session_inter_op_thread_pool為每個會話配置的線程池。這個設置已經過時。設置session_inter_op_thread_pool參數中有一個元素,這個元素的num_thread等於session_inter_op_thread_pool,那麼這個效果是一樣的。
repeated ThreadPoolOptionProto session_inter_op_thread_pool:(實驗性配置,將來可能被不同的機制所取代,這個參數是為了給那些會話需要運行在後台,並限制其運行在少量的線程中)配置會話的線程池。如果配置了這個,那麼RunOption在Run被調用時,可以選擇這個線程池來使用。如果線程池的num_thread被設置為0,那麼inter_op_parallelism_threads會被作為num_thread設置。
int32 placement_period:這是數值是指定分配節點到硬體的周期,在系統預熱(warm up)之前每隔placemeant_period步,都會重新計算節點到硬體的分配,而在此之後重新計算通常會自動降低頻率。
repeated string device_filters:這個參數是硬體過濾器,如果被設置的話,會話會忽略掉所有不匹配過濾器的硬體。每個過濾器可以分別制定比如 "/job:ps" "/job:worker/replica:3".
GPUOptions gpu_options:關於GPU的配置項,這是個類對象,具體參數[後面](## GPUOpition配置項)補充。
bool allow_soft_placement:這個參數制定是否允許計算的「軟分配」。如果這個參數設置為True,那麼一個操作在下列情況下會被放在CPU上運行:
1.操作沒有GPU的實現
2.沒有已知的GPU3.需要與來自CPU的reftype輸入進行協同定位bool log_device_placement:這個參數指定是否log硬體的分配,比如某個操作分配到CPU:0之類的。
GraphOptions graph_options:關於tensorflow圖的配置項,這也是個類對象,具體能配置的內容,後面補充。
int64 operation_timeout_in_ms:為會話中所有阻塞操作的全局的超時時間。如果這個值不為0,也沒有被每個操作的基準修改的話,這個值就是所有阻塞操作的最長等待時間。
RPCOptions rpc_options:遠程操作的選項,只在會話在分散式運行的情況下使用,是個類對象,具體可設置的參數[後面](## RPCOption配置項)補充。
ClusterDef cluster_def:所有可選擇為會話所使用的workers的列表。
03
GPU Opition配置項
GPUOptions類,有如下設置選項:
double per_process_gpu_memory_fraction:數值在0到1之間,表示預分配多少比例的可用GPU顯存給每個進程。比如1表示預分配所有的可用的GPU顯存,0.5則表示分配50%的可用的GPU顯存。
string allocator_type:用於設置GPU分配的策略。」」空字元串(為默認值)表示由系統選擇策略,但是這個策略會一直變化。」BFC」指定採用最佳適配合併演算法,是Doung Lea』s malloc演算法的簡化版,具體演算法介紹,可以參考博文http://www.cnblogs.com/yao62995/p/5773166.html
int64 deferred_deletion_bytes:這是設置刪除的緩存上限的值。如果這個值不為0,那麼刪除操作會到這個指定的bytes大小的時候才進行刪除操作,以此來減少與CPU驅動代碼的交互次數。如果設置為0,系統會選擇一個合理的數值。
bool allow_growth:是否採用增長的方式分配顯存。如果這個值為True,那麼分配器不會預分配整個指定的GPU顯存空間,而是開始分配一小部分顯存,然後隨著需要而增加。
string visible_device_list:逗號分隔的GPU的id列表,決定著GPU硬體從」可見的」到」虛擬的」之間的映射關係。比如TensorFlow在進程里可以看到8張GPU,而有人想把可見的GPU的5和3映射成」/gpu:0」和」/gpu:1」,那麼他可以制定這個參數值為」5,3」。除了應用於進程可見的CPU之外,這個域類似於CUDA_VISIBLE_DEVICES環境變數。
注意:GPU驅動以某種順序提供給進程可見的GPU,但是這個順序並不保證與機器上的物理的CPU的id有任何關係。這個域用以重新從可見到虛擬建立映射,這就意味著這個操作在進程啟動之後。因而,要求用戶在調用TensorFlow之前,使用供應商指定的機制(比如CUDA_VISIBLE_DEVICES)來控制從物理的到可見硬體的映射關係。
int32 polling_active_delay_usecs:輪詢的間隔時間長,當隊列不為空的時候,兩個輪詢調用時間休眠設置的時間長(單位:microseconds),如果這個值被設置為0或者沒有設置,那麼會設置為一個非0的默認值。
int32 polling_inactive_delay_msecs:輪詢休眠時長,當隊列為空的情況下,兩次調用輪詢的時間間隔設置的時間長(單位:millisconds)。如果設置為0或沒有設置,那麼設置為默認的非0數值。
bool force_gpu_compatible:是否啟動強制張量的GPU兼容。在啟用了GPU的TensorFlow中,這個選項為True,意味著所有的CPU的張量將被分配Cuda的固定內存。通常情況下,TensorFlow會推斷哪些張量應該分配固定內存。但是有些情況下這種推斷可能不完整,那麼只要它適配內存,這個選項就對於跨硬體的內存拷貝的性能尤為重要。
注意:這個選項對於未知或者非常大的模型不能默認開啟,因為所有的Cuda固定內存是不能分頁的,因而有大量固定內存對於整個主機系統的性能可能會有負面影響。
04
Graph Option配置項
GraphOptions類,有如下設置選項:
bool enable_recv_scheduling:接收節點調度選項,如果設置為True,會使用控制流來安排接收節點的激活。(暫時被忽略)
OptimizerOptions optimizer_options:圖的優化選項,這是個類對象,具體能配置的內容,[後面](### OptimizerOption配置項)補充。
int64 build_cost_model:在返回成本模型之前運行的步驟數,這個模型會詳細的描述圖中每個節點的內存使用和性能。設置為0表示沒有成本模型。
int64 build_cost_model_after:在為成本模型收集統計信息之前運行的步驟數,即成本模型運行前,模型運行的步驟數。
bool infer_shapes:是否推測形狀數據。設置為True的話,會用輸出的數據的形狀信息來標註每個節點,只要這個形狀能被靜態的推導出來。
bool place_pruned_graph:是否放置修建的圖。設置為True的話,僅僅只放置運行的子圖,而不是整個圖。這個對於交互圖的構建很有用,因為在這過程中,可能會產生無法在調試進程中放置的圖。特別是它允許用戶在往圖中添加了一個無法滿足的其放置位置限制的節點後,還能夠繼續進行會話。
bool enable_bfloat16_sendrecv:是否開啟到bfloat16的轉換,如果這個設置為True,那麼進程之間的float數據會被轉換成bfloat16的類型,這個類型定義文件見這裡。
int32 timeline_step:時間表的記錄的間隔步驟數。如果大於0的話,在每隔設置的步驟數,記錄時間表。實驗性的:這個現在對於主會話沒有影響。
RewriterConfig rewrite_options:控制圖的重寫類型和次數的選項。
05
Optimizer Option配置項
OptimizerOptions類,有如下設置選項:
bool do_common_subexpression_elimination:是否使用通用子表達式刪除來優化圖。關於通用子表達式刪除演算法的描述,見這裡。
bool do_constant_folding:是否使用常量合併來優化圖。常量合併(constant folding optimization)具體描述,見這裡 和這裡
bool do_function_inlining:是否使用函數內聯。如果設置為True,在圖中執行函數內聯。
enum Level:優化的等級。L1(=0)為默認的等級,會執行如下優化:1.通用子表達式刪除;2.常量合併。L0(=-1)為沒有優化。
Level opt_level:優化的等級選擇。
enum GlobalJitLevel:控制編譯器/運行時編譯的使用。(實驗性參數)默認設置為關閉,但是以後將被設置為打開。關閉的設置參數為OFF(=-1),其他參數(ON_1,ON_2)是打開編譯器,並且數值越高,越為主動積極。更高的數值可能會降低並行的機會,並且會使用更多的內存(現在對於這些沒有限制,但是之後會改變。)
GlobalJitLevel global_jit_level:編輯器/運行時編譯的等級。
06
RPCOption配置項
RPCOptions類,有如下設置選項:
bool use_rpc_for_inprocess_master:是否在進程間使用遠程調用的選項。如果設置為True,總是允許使用遠程調用來聯繫會話目標。默認設置為False,那麼TensorFlow會為客主之間的交流提供優化的傳送方式,從而避免使用遠程調用堆棧。這個選項主要用於測試遠程堆棧的時候使用。
推薦閱讀:
※Github|如何用TensorFlow實現DenseNet和DenseNet-BC(附源代碼)
※TF Boys (TensorFlow Boys ) 養成記(五):CIFAR10 Model 和 TensorFlow 的四種交叉熵介紹
※Google 開發技術周刊 088 期
※TensorFlow從1到2 | 第五章 非專家莫入!TensorFlow實現CNN
TAG:TensorFlow |