當我選擇 Tensorflow(1.12.0 版)模型的超參數的網格搜索由于內存消耗激增而崩潰時,我注意到了這一點。請注意,與此處類似的問題不同,我確實關閉了圖形和會話(使用上下文管理器),并且我沒有向循環中的圖形添加節點。我懷疑 tensorflow 可能維護了在迭代之間不會被清除的全局變量,所以我在迭代之前和之后調用了 globals() 但在每次迭代之前和之后沒有觀察到全局變量集的任何差異。我做了一個重現問題的小例子。我在循環中訓練一個簡單的 MNIST 分類器并繪制該過程消耗的內存:import matplotlib.pyplot as pltimport osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'import psutilimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_dataprocess = psutil.Process(os.getpid())N_REPS = 100N_ITER = 10mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)x_test, y_test = mnist.test.images, mnist.test.labels# Runs experiment several times.mem = []for i in range(N_REPS): with tf.Graph().as_default(): net = tf.contrib.layers.fully_connected(x_test, 200) logits = tf.contrib.layers.fully_connected(net, 10, activation_fn=None) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_test, logits=logits)) train_op = tf.train.AdamOptimizer(learning_rate=0.0001).minimize(loss) init = tf.global_variables_initializer() with tf.Session() as sess: # training loop. sess.run(init) for _ in range(N_ITER): sess.run(train_op) mem.append(process.memory_info().rss)plt.plot(range(N_REPS), mem)結果圖如下所示:在我的實際項目中,進程內存從幾百 MB 開始(取決于數據集大?。钡轿业南到y內存不足為止增加到 64 GB。我嘗試了一些減緩增長的方法,例如使用占位符和 feed_dicts 而不是依賴 convert_to_tensor。但持續的增長仍在那里,只是變慢了。
2 回答

智慧大石
TA貢獻1946條經驗 獲得超3個贊
嘗試在會話中進行循環。不要為每次迭代創建圖形和會話。每次創建圖形并初始化變量時,您不是重新定義舊圖形,而是創建導致內存泄漏的新圖形。我遇到了類似的問題,并且能夠通過在會話中進行循環來解決這個問題。
從如何不編程 Tensorflow
在創建操作時要注意,并且只創建您需要的操作。盡量保持運算創建不同的運算執行。
特別是如果您只是使用默認圖形并在常規 REPL 或筆記本中交互運行,則最終可能會在圖形中出現大量廢棄的操作。每次重新運行定義任何圖形操作的筆記本單元時,您不僅僅是在重新定義操作,而是在創建新操作。
添加回答
舉報
0/150
提交
取消