javascript TFJS应用程序中的内存泄漏,即使在处理未使用的Tensor之后也是如此

p1iqtdky  于 2023-04-10  发布在  Java
关注(0)|答案(2)|浏览(174)

问题

我在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错误。

我是否错过了什么

k3bvogb1

k3bvogb11#

最近几天,我一直在绞尽脑汁,试图找出我的tfjs-node预测服务器中的内存泄漏。我尝试了dispose、startScope、endScope等所有可能的组合。似乎没有解决方案,我开始认为tfjs-node本身存在固有缺陷。对我来说更糟糕的是,tfjs-node预测服务器中的tf.memory()提供了“不可靠”的内存使用统计数据,甚至没有提供一个原因,这是应该的。强烈考虑切换到python为我的服务器,因为节点绑定似乎是如此不稳定。

pdtvr36n

pdtvr36n2#

Tensorflow.js不会释放WebGL纹理缓存。它们会一直累积,直到GPU耗尽内存。设置WEBGL_DELETE_TEXTURE_THRESHOLD标志以强制TFJS释放WebGL纹理。
例如:

// Prevents OutOfMemory - forces TFJS to clear WebGL textures when reaching 256Mb
tf.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD", 256000000);

请注意,最佳阈值可能会因所使用的模型而异。要确定适当的值,您可以在每次推断后记录GPU内存消耗:

console.log(`numBytesInGPUAllocated: ${tf.memory().numBytesInGPUAllocated}`);

然后,您可以将阈值设置为2次探测后记录的数量,因为内存消耗会随着每次探测而增加。

相关问题