python - 情侶存錢法 - 聰明存錢法




如何防止張量流分配GPU內存的全部? (7)

Tensorflow 2.0 Beta和(可能)超越

API又改變了。 它現在可以在:

tf.config.experimental.set_memory_growth(
    device,
    enable
)

別名:

  • tf.compat.v1.config.experimental.set_memory_growth
  • tf.compat.v2.config.experimental.set_memory_growth
  • tf.config.experimental.set_memory_growth

https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/config/experimental/set_memory_growth https://www.tensorflow.org/beta/guide/using_gpu#limiting_gpu_memory_growth

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

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

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

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



以下是 Deep Learning with TensorFlow 的摘錄

在某些情況下,希望該過程僅分配可用內存的子集,或者僅增加該過程所需的內存使用量。 TensorFlow在會話中提供了 兩個配置 選項來控制它。 第一個是 allow_growth 選項,它嘗試僅基於運行時分配分配盡可能多的GPU內存,它開始分配非常少的內存,並且隨著會話運行並需要更多GPU內存,我們擴展了所需的GPU內存區域TensorFlow流程。

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內存量時,這才有用。


您可以使用

TF_FORCE_GPU_ALLOW_GROWTH=true

在你的環境變量中。

tensorflow 代碼中:

bool GPUBFCAllocator::GetAllowGrowthValue(const GPUOptions& gpu_options) {
  const char* force_allow_growth_string =
      std::getenv("TF_FORCE_GPU_ALLOW_GROWTH");
  if (force_allow_growth_string == nullptr) {
    return gpu_options.allow_growth();
}

我試圖在voc數據集上訓練unet,但由於圖像大小龐大,內存完成。 我嘗試了所有上述提示,甚至嘗試批量大小== 1,但沒有改善。 有時TensorFlow版本也會導致內存問題。 嘗試使用

pip install tensorflow-gpu == 1.8.0


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

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








nvidia-titan