【问题标题】:Tensorflow.js consecutive predictions much slower than single predictionTensorflow.js 连续预测比单一预测慢得多
【发布时间】:2019-02-06 18:47:01
【问题描述】:

我有一个应用程序,我想在其中不断做出和处理预测。我有一个函数可以进行预测并对结果进行处理:

makeProcessPrediction(){
    return new Promise(resolve => {
      let prediction : any = this.model.predict(this.input_tensor);
      prediction.data().then((data_array) => {
              //... do something with prediction here
          }
      prediction.dispose();
      resolve('resolved');
      });
    });
}

现在,如果我对 makeProcessPrediction 进行一次调用,预测需要大约 80 毫秒。但是如果我这样循环调用它:

while(condition){
    await this.makeProcessPrediction();
}

突然间,预测需要更长的时间,长达 140 毫秒。如果我停止循环并进行另一个“单一”预测,则需要大约 80 毫秒。

我希望有人可以解释为什么会发生这种情况,也许我可以做些什么来加快预测速度。

非常感谢!

【问题讨论】:

  • 也许这与一些张量没有放在内存中的事实有关。您能否添加 tf.memory() 的输出?
  • 有趣,一些迭代的 tf.memory 输出:{unreliable: false, numBytesInGPU: 41380, numTensors: 163, numDataBuffers: 109, numBytes: 5325648} 和其他迭代它输出 {unreliable: false, numBytesInGPU: 5284260, numTensors: 163, numDataBuffers: 109, numBytes: 5325648} 我没有注意到预测时间和 numBytesInGPU 之间的模式或关系。除了在 numBytesInGPU 的这两个不同数字之间来回翻转之外,数字没有任何变化或增加,我认为这是内存泄漏?
  • 我认为您使用 data() 检索存储在 gpu 中的数据这一事实随着 gpu 数据的增加而花费了太多时间。但是你能分享一下你的模型的架构吗?
  • 该模型遵循 U-net 架构,它是完全卷积的,我将其用于图像处理。它有2层编码,一个编码层和2层解码。除了data(),还有其他方法更适合从 gpu 中获取数据吗?
  • 哇,您对data() 的看法是正确的!我现在使用了dataSync(),模型在略低于 80 毫秒时运行超级稳定!!!!!!谢谢!!!

标签: javascript asynchronous tensorflow.js


【解决方案1】:

尝试移动 GPU 负载。 使用 data() 主动将预测数据调用到 JavaScript 中会让您堆积一些承诺,并可能堵塞您的 GPU 管道。

移至同步方法dataSync() 将在主线程中正确处理 GPU 内存。虽然这会阻止您的 UI 交互,但速度应该一样快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2022-07-07
    • 2018-11-16
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多