问题
我在Tensorflow JS上运行了一个多级对象检测网络。第一部分是一个单独的网络检测对象,然后将它们从主输入图像中剪切出来。这些剪切图像的大小可以变化,并直接馈送到第二个网络,第二个网络执行另一个检测。
我的应用程序运行得很好,但是一段时间后内存就用完了。我发现内存增长的原因是剪切Tensor,即使在处理它们之后,它们仍然分配内存。
系统
- @tensorflow/tfjs v.3.7.0
- Microsoft Edge v.91.0.864.59
代码
while(running) {
tf.engine().startScope()
...
for(cutout count...)
...
const cropped_image = input_tensor.slice([ymin, xmin], crop_size)
const cropped_image_expanded = tf.expandDims(cropped_image, 0);
const pred = await this.props.models.ssd_2nd_stage.executeAsync(cropped_image_expanded);
tf.dispose(cropped_image);
tf.dispose(cropped_image_expanded);
...
}
...
console.log(tf.memory())
tf.engine().endScope()
tf.engine().disposeVariables()
}
日志
tf.memory()
在开始时显示:
{unreliable: false, numBytesInGPU: 136710800, numBytesInGPUAllocated: 563751816, numBytesInGPUFree: 427041016, numTensors: 1517, …}
一段时间后...
{unreliable: false, numBytesInGPU: 136710800, numBytesInGPUAllocated: 615142084, numBytesInGPUFree: 478431284, numTensors: 1517, …}
你可以清楚地看到TFJS没有释放之前的GPU分配,这会导致一段时间后出现OOM错误。
我是否错过了什么
2条答案
按热度按时间k3bvogb11#
最近几天,我一直在绞尽脑汁,试图找出我的tfjs-node预测服务器中的内存泄漏。我尝试了dispose、startScope、endScope等所有可能的组合。似乎没有解决方案,我开始认为tfjs-node本身存在固有缺陷。对我来说更糟糕的是,tfjs-node预测服务器中的tf.memory()提供了“不可靠”的内存使用统计数据,甚至没有提供一个原因,这是应该的。强烈考虑切换到python为我的服务器,因为节点绑定似乎是如此不稳定。
pdtvr36n2#
Tensorflow.js不会释放WebGL纹理缓存。它们会一直累积,直到GPU耗尽内存。设置WEBGL_DELETE_TEXTURE_THRESHOLD标志以强制TFJS释放WebGL纹理。
例如:
请注意,最佳阈值可能会因所使用的模型而异。要确定适当的值,您可以在每次推断后记录GPU内存消耗:
然后,您可以将阈值设置为2次探测后记录的数量,因为内存消耗会随着每次探测而增加。