因?yàn)門ensorFlow.js使用了GPU來加速數(shù)學(xué)運(yùn)算,因此當(dāng)tensorflow處理張量和變量時(shí)就有必要來管理GPU內(nèi)存。在TensorFlow.js中,我們可以通過dispose 和 tf.tidy這兩種方法來管理內(nèi)存。
dispose
您可以在張量或變量上調(diào)用dispose來清除它并釋放其GPU內(nèi)存:
const x = tf.tensor2d([[0.0, 2.0], [4.0, 6.0]]);
const x_squared = x.square();
x.dispose();
x_squared.dispose();
tf.tidy
進(jìn)行大量的張量操作時(shí)使用dispose可能會(huì)很麻煩。 TensorFlow.js提供了另一個(gè)函數(shù)tf.tidy,它對(duì)JavaScript中的常規(guī)范圍起到類似的作用,不同的是它針對(duì)GPU支持的張量。
tf.tidy執(zhí)行一個(gè)函數(shù)并清除所有創(chuàng)建的中間張量,釋放它們的GPU內(nèi)存。 它不清除內(nèi)部函數(shù)的返回值。
const average = tf.tidy(() => {
const y = tf.tensor1d([1.0, 2.0, 3.0, 4.0]);
const z = tf.ones([4]);
return y.sub(z).square().mean();
});
average.print()
使用tf.tidy將有助于防止應(yīng)用程序中的內(nèi)存泄漏。它也可以用來更謹(jǐn)慎地控制內(nèi)存何時(shí)回收。
兩個(gè)重要的注意事項(xiàng)
傳遞給tf.tidy的函數(shù)應(yīng)該是同步的,并且不會(huì)返回Promise。我們建議在tf.tidy內(nèi)不要有更新UI或在發(fā)出遠(yuǎn)程請(qǐng)求的代碼。
tf.tidy不會(huì)清理變量。變量通常持續(xù)到機(jī)器學(xué)習(xí)模型的整個(gè)生命周期,因此TensorFlow.js不會(huì)清理它們,即使它們是在tidy中創(chuàng)建的。不過,您可以手動(dòng)調(diào)用dispose處理它們。
更多建議: