python 聰明存錢法 如何防止張量流分配整個GPU內存?




聰明存錢法 (4)

當你通過傳遞一個tf.GPUOptions作為可選的config參數的一部分來構造一個tf.Session時,你可以設置要分配的GPU內存的分數:

# Assume that you have 12GB of GPU memory and want to allocate ~4GB:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

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

per_process_gpu_memory_fraction用作同一機器上每個GPU上的進程將使用的GPU內存量的硬上限。 目前,這個比例被統一應用到同一台機器上的所有GPU上; 沒有辦法在每個GPU的基礎上進行設置。

我在一個共享計算資源的環境中工作,也就是說,我們有幾台服務器機器都配備了幾個Nvidia Titan X GPU。

對於小到中等尺寸的型號,Titan X的12GB通常足以讓2-3人在同一GPU上同時進行訓練。 如果模型足夠小,以至於單個模型不能充分利用Titan X的所有計算單元,那麼實際上可以導致加速比另一個之後運行一個訓練過程。 即使在GPU的並發訪問確實減慢了單個培訓時間的情況下,擁有多個用戶同時在GPU上運行的靈活性仍然不錯。

TensorFlow的問題在於,默認情況下,它會在GPU啟動時為其分配全部可用內存。 即使對於一個小型的2層神經網絡,我也看到Titan X的12 GB已經用完。

有沒有辦法讓TensorFlow只分配4GB的GPU內存,如果有人知道這個數量足夠用於給定的模型?


無恥的插件:如果您安裝支持GPU的Tensorflow,會話將首先分配所有GPU,無論您是將其設置為僅使用CPU還是GPU。 我可以添加我的提示,即使您將圖形設置為只使用CPU,您也應該設置相同的配置(如上面的回答:)),以防止不必要的GPU佔用。

在IPython等交互界面中,您還應該設置該配置,否則它將分配所有內存並且幾乎不為其他人配置。 這有時很難注意到。



以下是Deep Learning with TensorFlow書的摘錄

在某些情況下,進程只需要分配可用內存的一個子集,或者僅根據進程需要增加內存使用量。 TensorFlow在會話上提供了兩個配置選項來控制此選項。 第一個是allow_growth選項,它試圖只分配盡可能多的基於運行時分配的GPU內存,它開始分配很少的內存,並且當會話運行並需要更多的GPU內存時,我們擴展GPU所需的內存區域張量流程。

1)允許增長:(更靈活)

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)

第二種方法是per_process_gpu_memory_fraction選項,它決定了each可見GPU應分配的總內存量的分數。 注意:不需要釋放內存,完成後甚至可能會惡化內存碎片。

2)分配固定內存

要通過以下方式只分配每個GPU的總內存的40%

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)

注意:只有在真正想要綁定TensorFlow過程中可用的GPU內存量時才有用。