當(dāng)我選擇 Tensorflow(1.12.0 版)模型的超參數(shù)的網(wǎng)格搜索由于內(nèi)存消耗激增而崩潰時,我注意到了這一點(diǎn)。請注意,與此處類似的問題不同,我確實(shí)關(guān)閉了圖形和會話(使用上下文管理器),并且我沒有向循環(huán)中的圖形添加節(jié)點(diǎn)。我懷疑 tensorflow 可能維護(hù)了在迭代之間不會被清除的全局變量,所以我在迭代之前和之后調(diào)用了 globals() 但在每次迭代之前和之后沒有觀察到全局變量集的任何差異。我做了一個重現(xiàn)問題的小例子。我在循環(huán)中訓(xùn)練一個簡單的 MNIST 分類器并繪制該過程消耗的內(nèi)存: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)結(jié)果圖如下所示:在我的實(shí)際項(xiàng)目中,進(jìn)程內(nèi)存從幾百 MB 開始(取決于數(shù)據(jù)集大?。?,直到我的系統(tǒng)內(nèi)存不足為止增加到 64 GB。我嘗試了一些減緩增長的方法,例如使用占位符和 feed_dicts 而不是依賴 convert_to_tensor。但持續(xù)的增長仍在那里,只是變慢了。
2 回答

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