在 Tensorflow 中需要通過創(chuàng)建 Session 類實(shí)例來為當(dāng)前計(jì)算圖注冊會話,然后通過會話的 run 方法或者是 tf.Tensor.eval 來執(zhí)行計(jì)算,得到所需操作的輸出。
通常而言,在平時(shí)的學(xué)習(xí)和 demo 測試中采用 Session 的默認(rèn)設(shè)置已經(jīng)足夠了。但是當(dāng)我們需要編寫多 GPU 程序還要保證程序的可移植性,又或者因?yàn)樯a(chǎn)需要而要求更準(zhǔn)確地控制會話的時(shí)候就涉及到 Session 的配置。
Session 可以通過 ConfigProto 類來進(jìn)行配置。ConfigProto 包含有許多屬性,能夠配置并行的線程數(shù)、GPU 的分配策略、設(shè)備日記等等屬性,更多屬性詳情請自行參考 Tensorflow 官網(wǎng) API 介紹。
在這眾多的屬性當(dāng)中,最常用的一般是 log_device_placement 和 allow_soft_placement 。配置的設(shè)置方式如下:
config = tf.ConfigProto(log_device_placement=True,
allow_soft_placement=True)
sess = tf.Session(config=config)
allow_soft_placement
allow_soft_placement 是布爾類型的屬性,默認(rèn)情況下是 False 。當(dāng)將它的值設(shè)置為 True 的時(shí)候,在以下任意一條條件滿足時(shí),程序會將原先在 GPU 上的計(jì)算遷移到 CPU 中完成:
- 運(yùn)算無法在 GPU 上執(zhí)行
- 沒有 GPU 資源
- 運(yùn)算輸入包含對 CPU 計(jì)算結(jié)果的引用
考慮到不同機(jī)器中的 GPU 驅(qū)動版本、數(shù)量等都可能存在差異,因此為了提升程序的可移植性,可以將該選項(xiàng)設(shè)置為 True ,從而避免了在其它機(jī)器上運(yùn)行程序時(shí)因?yàn)?GPU 支持問題而直接拋出異常。
log_device_placement
log_device_placement 也是一個(gè)布爾型屬性,默認(rèn)為 False 。將該屬性設(shè)置為 True 的時(shí)候,程序日志中將記錄計(jì)算圖中每個(gè)節(jié)點(diǎn)是在哪個(gè)設(shè)備中進(jìn)行計(jì)算的。在編寫與測試程序的過程中設(shè)置為 True 可以方便調(diào)試,而在生產(chǎn)中可以將該屬性設(shè)置為 False 以減少日志占用的空間。