TensorFlow會(huì)話的配置項(xiàng)

TensorFlow配置項(xiàng)的文檔位于這里
TensorFlow可以通過指定配置項(xiàng),來配置需要運(yùn)行的會(huì)話,示例代碼如下:

run_config = tf.ConfigProto()
sess = tf.Session(config=run_config)

ConfigProto類配置項(xiàng)

對(duì)于ConfigProto類具體有如下可配置的部分
map<string, int32> device_count:設(shè)備的數(shù)量映射。key為設(shè)備的名稱(比如”CPU”或者”GPU”),而value為該類型設(shè)備的數(shù)量的最大值。如果沒有設(shè)置的話,系統(tǒng)會(huì)自動(dòng)設(shè)置合適的數(shù)值。

int32 intra_op_parallelism_threads:線程池中線程的數(shù)量,一些獨(dú)立的操作可以在這指定的數(shù)量的線程中進(jìn)行并行,如果設(shè)置為0代表讓系統(tǒng)設(shè)置合適的數(shù)值。

int32 inter_op_parallelism_threads:每個(gè)進(jìn)程可用的為進(jìn)行阻塞操作節(jié)點(diǎn)準(zhǔn)備的線程池中線程的數(shù)量,設(shè)置為0代表讓系統(tǒng)選擇合適的數(shù)值。需要注意的是,第一個(gè)創(chuàng)建的會(huì)話會(huì)為將來創(chuàng)建的所有會(huì)話設(shè)置這個(gè)線程的數(shù)值,除非use_per_session_threads被設(shè)置為True,或者是session_inter_op_thread_pool被配置。

bool use_per_session_threads:是否為每個(gè)會(huì)話使用單獨(dú)的線程池。如果設(shè)置為True,則為這個(gè)會(huì)話使用新的線程池,而不是使用全局的線程池。僅僅支持直接的會(huì)話。如果設(shè)置為False,將會(huì)使用由第一個(gè)會(huì)話創(chuàng)建的全局線程池,或者使用由session_inter_op_thread_pool為每個(gè)會(huì)話配置的線程池。這個(gè)設(shè)置已經(jīng)過時(shí)。設(shè)置session_inter_op_thread_pool參數(shù)中有一個(gè)元素,這個(gè)元素的num_thread等于session_inter_op_thread_pool,那么這個(gè)效果是一樣的。

repeated ThreadPoolOptionProto session_inter_op_thread_pool:(實(shí)驗(yàn)性配置,將來可能被不同的機(jī)制所取代,這個(gè)參數(shù)是為了給那些會(huì)話需要運(yùn)行在后臺(tái),并限制其運(yùn)行在少量的線程中)配置會(huì)話的線程池。如果配置了這個(gè),那么RunOption在Run被調(diào)用時(shí),可以選擇這個(gè)線程池來使用。如果線程池的num_thread被設(shè)置為0,那么inter_op_parallelism_threads會(huì)被作為num_thread設(shè)置。

int32 placement_period:這是數(shù)值是指定分配節(jié)點(diǎn)到硬件的周期,在系統(tǒng)預(yù)熱(warm up)之前每隔placemeant_period步,都會(huì)重新計(jì)算節(jié)點(diǎn)到硬件的分配,而在此之后重新計(jì)算通常會(huì)自動(dòng)降低頻率。

repeated string device_filters:這個(gè)參數(shù)是硬件過濾器,如果被設(shè)置的話,會(huì)話會(huì)忽略掉所有不匹配過濾器的硬件。每個(gè)過濾器可以分別制定比如 "/job:ps" "/job:worker/replica:3".

GPUOptions gpu_options:關(guān)于GPU的配置項(xiàng),這是個(gè)類對(duì)象,具體參數(shù)[后面](## GPUOpition配置項(xiàng))補(bǔ)充。

bool allow_soft_placement:這個(gè)參數(shù)制定是否允許計(jì)算的“軟分配”。如果這個(gè)參數(shù)設(shè)置為True,那么一個(gè)操作在下列情況下會(huì)被放在CPU上運(yùn)行:
1.操作沒有GPU的實(shí)現(xiàn)
2.沒有已知的GPU
3.需要與來自CPU的reftype輸入進(jìn)行協(xié)同定位

bool log_device_placement:這個(gè)參數(shù)指定是否log硬件的分配,比如某個(gè)操作分配到CPU:0之類的。

GraphOptions graph_options:關(guān)于tensorflow圖的配置項(xiàng),這也是個(gè)類對(duì)象,具體能配置的內(nèi)容,后面補(bǔ)充。

int64 operation_timeout_in_ms:為會(huì)話中所有阻塞操作的全局的超時(shí)時(shí)間。如果這個(gè)值不為0,也沒有被每個(gè)操作的基準(zhǔn)修改的話,這個(gè)值就是所有阻塞操作的最長(zhǎng)等待時(shí)間。

RPCOptions rpc_options:遠(yuǎn)程操作的選項(xiàng),只在會(huì)話在分布式運(yùn)行的情況下使用,是個(gè)類對(duì)象,具體可設(shè)置的參數(shù)[后面](## RPCOption配置項(xiàng))補(bǔ)充。

ClusterDef cluster_def:所有可選擇為會(huì)話所使用的workers的列表。

GPUOpition配置項(xiàng)

GPUOptions類,有如下設(shè)置選項(xiàng):
double per_process_gpu_memory_fraction:數(shù)值在0到1之間,表示預(yù)分配多少比例的可用GPU顯存給每個(gè)進(jìn)程。比如1表示預(yù)分配所有的可用的GPU顯存,0.5則表示分配50%的可用的GPU顯存。

string allocator_type:用于設(shè)置GPU分配的策略。””空字符串(為默認(rèn)值)表示由系統(tǒng)選擇策略,但是這個(gè)策略會(huì)一直變化?!盉FC”指定采用最佳適配合并算法,是Doung Lea’s malloc算法的簡(jiǎn)化版,具體算法介紹,可以參考博文http://www.cnblogs.com/yao62995/p/5773166.html

int64 deferred_deletion_bytes:這是設(shè)置刪除的緩存上限的值。如果這個(gè)值不為0,那么刪除操作會(huì)到這個(gè)指定的bytes大小的時(shí)候才進(jìn)行刪除操作,以此來減少與CPU驅(qū)動(dòng)代碼的交互次數(shù)。如果設(shè)置為0,系統(tǒng)會(huì)選擇一個(gè)合理的數(shù)值。

bool allow_growth:是否采用增長(zhǎng)的方式分配顯存。如果這個(gè)值為True,那么分配器不會(huì)預(yù)分配整個(gè)指定的GPU顯存空間,而是開始分配一小部分顯存,然后隨著需要而增加。

string visible_device_list:逗號(hào)分隔的GPU的id列表,決定著GPU硬件從”可見的”到”虛擬的”之間的映射關(guān)系。比如TensorFlow在進(jìn)程里可以看到8張GPU,而有人想把可見的GPU的5和3映射成”/gpu:0”和”/gpu:1”,那么他可以制定這個(gè)參數(shù)值為”5,3”。除了應(yīng)用于進(jìn)程可見的CPU之外,這個(gè)域類似于CUDA_VISIBLE_DEVICES環(huán)境變量。

注意:GPU驅(qū)動(dòng)以某種順序提供給進(jìn)程可見的GPU,但是這個(gè)順序并不保證與機(jī)器上的物理的CPU的id有任何關(guān)系。這個(gè)域用以重新從可見到虛擬建立映射,這就意味著這個(gè)操作在進(jìn)程啟動(dòng)之后。因而,要求用戶在調(diào)用TensorFlow之前,使用供應(yīng)商指定的機(jī)制(比如CUDA_VISIBLE_DEVICES)來控制從物理的到可見硬件的映射關(guān)系。

int32 polling_active_delay_usecs:輪詢的間隔時(shí)間長(zhǎng),當(dāng)隊(duì)列不為空的時(shí)候,兩個(gè)輪詢調(diào)用時(shí)間休眠設(shè)置的時(shí)間長(zhǎng)(單位:microseconds),如果這個(gè)值被設(shè)置為0或者沒有設(shè)置,那么會(huì)設(shè)置為一個(gè)非0的默認(rèn)值。

int32 polling_inactive_delay_msecs:輪詢休眠時(shí)長(zhǎng),當(dāng)隊(duì)列為空的情況下,兩次調(diào)用輪詢的時(shí)間間隔設(shè)置的時(shí)間長(zhǎng)(單位:millisconds)。如果設(shè)置為0或沒有設(shè)置,那么設(shè)置為默認(rèn)的非0數(shù)值。

bool force_gpu_compatible:是否啟動(dòng)強(qiáng)制張量的GPU兼容。在啟用了GPU的TensorFlow中,這個(gè)選項(xiàng)為True,意味著所有的CPU的張量將被分配Cuda的固定內(nèi)存。通常情況下,TensorFlow會(huì)推斷哪些張量應(yīng)該分配固定內(nèi)存。但是有些情況下這種推斷可能不完整,那么只要它適配內(nèi)存,這個(gè)選項(xiàng)就對(duì)于跨硬件的內(nèi)存拷貝的性能尤為重要。
注意:這個(gè)選項(xiàng)對(duì)于未知或者非常大的模型不能默認(rèn)開啟,因?yàn)樗械腃uda固定內(nèi)存是不能分頁(yè)的,因而有大量固定內(nèi)存對(duì)于整個(gè)主機(jī)系統(tǒng)的性能可能會(huì)有負(fù)面影響。

GraphOption配置項(xiàng)

GraphOptions類,有如下設(shè)置選項(xiàng):
bool enable_recv_scheduling:接收節(jié)點(diǎn)調(diào)度選項(xiàng),如果設(shè)置為True,會(huì)使用控制流來安排接收節(jié)點(diǎn)的激活。(暫時(shí)被忽略)

OptimizerOptions optimizer_options:圖的優(yōu)化選項(xiàng),這是個(gè)類對(duì)象,具體能配置的內(nèi)容,[后面](### OptimizerOption配置項(xiàng))補(bǔ)充。

int64 build_cost_model:在返回成本模型之前運(yùn)行的步驟數(shù),這個(gè)模型會(huì)詳細(xì)的描述圖中每個(gè)節(jié)點(diǎn)的內(nèi)存使用和性能。設(shè)置為0表示沒有成本模型。

int64 build_cost_model_after:在為成本模型收集統(tǒng)計(jì)信息之前運(yùn)行的步驟數(shù),即成本模型運(yùn)行前,模型運(yùn)行的步驟數(shù)。

bool infer_shapes:是否推測(cè)形狀數(shù)據(jù)。設(shè)置為True的話,會(huì)用輸出的數(shù)據(jù)的形狀信息來標(biāo)注每個(gè)節(jié)點(diǎn),只要這個(gè)形狀能被靜態(tài)的推導(dǎo)出來。

bool place_pruned_graph:是否放置修建的圖。設(shè)置為True的話,僅僅只放置運(yùn)行的子圖,而不是整個(gè)圖。這個(gè)對(duì)于交互圖的構(gòu)建很有用,因?yàn)樵谶@過程中,可能會(huì)產(chǎn)生無(wú)法在調(diào)試進(jìn)程中放置的圖。特別是它允許用戶在往圖中添加了一個(gè)無(wú)法滿足的其放置位置限制的節(jié)點(diǎn)后,還能夠繼續(xù)進(jìn)行會(huì)話。

bool enable_bfloat16_sendrecv:是否開啟到bfloat16的轉(zhuǎn)換,如果這個(gè)設(shè)置為True,那么進(jìn)程之間的float數(shù)據(jù)會(huì)被轉(zhuǎn)換成bfloat16的類型,這個(gè)類型定義文件見這里。

int32 timeline_step:時(shí)間表的記錄的間隔步驟數(shù)。如果大于0的話,在每隔設(shè)置的步驟數(shù),記錄時(shí)間表。實(shí)驗(yàn)性的:這個(gè)現(xiàn)在對(duì)于主會(huì)話沒有影響。

RewriterConfig rewrite_options:控制圖的重寫類型和次數(shù)的選項(xiàng)。

OptimizerOption配置項(xiàng)

OptimizerOptions類,有如下設(shè)置選項(xiàng):
bool do_common_subexpression_elimination:是否使用通用子表達(dá)式刪除來優(yōu)化圖。關(guān)于通用子表達(dá)式刪除算法的描述,見這里。

bool do_constant_folding:是否使用常量合并來優(yōu)化圖。常量合并(constant folding optimization)具體描述,見這里這里

bool do_function_inlining:是否使用函數(shù)內(nèi)聯(lián)。如果設(shè)置為True,在圖中執(zhí)行函數(shù)內(nèi)聯(lián)。

enum Level:優(yōu)化的等級(jí)。L1(=0)為默認(rèn)的等級(jí),會(huì)執(zhí)行如下優(yōu)化:1.通用子表達(dá)式刪除;2.常量合并。L0(=-1)為沒有優(yōu)化。

Level opt_level:優(yōu)化的等級(jí)選擇。

enum GlobalJitLevel:控制編譯器/運(yùn)行時(shí)編譯的使用。(實(shí)驗(yàn)性參數(shù))默認(rèn)設(shè)置為關(guān)閉,但是以后將被設(shè)置為打開。關(guān)閉的設(shè)置參數(shù)為OFF(=-1),其他參數(shù)(ON_1,ON_2)是打開編譯器,并且數(shù)值越高,越為主動(dòng)積極。更高的數(shù)值可能會(huì)降低并行的機(jī)會(huì),并且會(huì)使用更多的內(nèi)存(現(xiàn)在對(duì)于這些沒有限制,但是之后會(huì)改變。)

GlobalJitLevel global_jit_level:編輯器/運(yùn)行時(shí)編譯的等級(jí)。

RPCOption配置項(xiàng)

RPCOptions類,有如下設(shè)置選項(xiàng):
bool use_rpc_for_inprocess_master:是否在進(jìn)程間使用遠(yuǎn)程調(diào)用的選項(xiàng)。如果設(shè)置為True,總是允許使用遠(yuǎn)程調(diào)用來聯(lián)系會(huì)話目標(biāo)。默認(rèn)設(shè)置為False,那么TensorFlow會(huì)為客主之間的交流提供優(yōu)化的傳送方式,從而避免使用遠(yuǎn)程調(diào)用堆棧。這個(gè)選項(xiàng)主要用于測(cè)試遠(yuǎn)程堆棧的時(shí)候使用。

比較完整的配置使用示例:

run_config = tf.ConfigProto()
run_config.use_per_session_threads = False
run_config.allow_soft_placement = False

run_config.gpu_options.per_process_gpu_memory_fraction = 0.0
run_config.gpu_options.allow_growth = False

run_config.graph_options.enable_recv_scheduling = False
run_config.graph_options.timeline_step = 0

run_config.rpc_options.use_rpc_for_inprocess_master = False

sess = tf.Session(config=run_config)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容