【问题标题】:Converting a tensor to an array - Tensorflow JS将张量转换为数组 - Tensorflow JS
【发布时间】:2021-11-12 10:12:39
【问题描述】:

我使用 tfjs 运行关键点检测模型,然后对其进行后期处理(仍然使用 tfjs)。 然后我在最终张量上使用 dataSync() 以便使用 JS 处理它。 dataSync() 花费的时间大约是推理 + 后处理时间的 4 倍。 我猜这是因为 dataSync() 从 GPU 中提取数据。 有没有办法让这个过程更快? 这是我正在使用的代码:

let output = model.execute(input_image_tensor);
let kpts = postProcess(output);
renderKpts(kpts.dataSync());

谢谢。

【问题讨论】:

  • 奇怪的行为,我从来没有遇到过这个问题。您能否在此处分析代码并分享结果?
  • 我使用 tf.time() 分析了代码,这就是我得到的:KernelMs:0.01,wallTimeMS:62.3,uploadWaitMs:0,downloadWaitMs:52.8。我希望它有所帮助。谢谢!

标签: javascript tensorflow.js


【解决方案1】:

dataSync() 从特定张量中提取数据,因此取决于张量大小 - kpts.shape 的值是多少?
如果只是几个关键点,就不可能花费超过一毫秒。

** 更新**

刚刚尝试使用 webgl 后端,大约是 5 微秒

const tensor = tf.randomNormal([1, 4, 3]);
const time0 = performance.now();
const data = tensor.dataSync();
const time1 = performance.now();
console.log({ size: tensor.size, time: time1 - time0 });
{ "size": 12, "time": 0.004999995231628418 }

【讨论】:

  • 这对我来说也很奇怪。形状为:[1, 4, 3],大小:12。比较小。这可能是后端问题(使用 webgl)吗?谢谢!
  • 我已经更新了答案,因为我无法将 js 代码添加到评论中,在我的情况下它非常快
  • 非常感谢您的检查。是否有可能因为我读取像素并在图像上找到 kpts,dataSync() 会拉出所有张量(包括代表图像的张量,而不仅仅是这个特定的张量)?
  • 不可能,我一直这样做。是否同时在 gpu 上运行其他异步操作?可能是它正在等待同步锁,但这只是一个疯狂的猜测。
猜你喜欢
  • 2016-10-15
  • 2020-12-31
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2016-06-14
  • 2021-04-28
相关资源
最近更新 更多