javascript - 我可以在 Node.js 进程之间有效地传输 Tensorflow.js 张量吗?

标签 javascript node.js tensor tensorflow.js

我正在使用 Tensorflow.js 和 Node.js 开发 AI 模型。作为其中的一部分,我需要以流式传输方式读取和解析我的大型数据集(它太大而无法同时放入内存中)。此过程的结果最终产生一对生成器函数(一个用于输入数据,另一个用于输出数据),它们迭代地生成 Tensorflow.js 张量:

function* example_parser() {
    while(thereIsData) {
        // do reading & parsing here....
        
        yield next_tensor;
    }
}

....它们被包装在一对 tf.data.generator() 中,后跟一个 tf.data.zip()

这个过程有时计算量相当大,所以我想重构为一个单独的 Node.js 工作进程/thread据我所知,Node.js 以单线程方式执行 Javascript。

但是,我也知道如果我通过例如正常传输数据process.send(),序列化/反序列化会大大减慢进程速度,因此我最好将所有内容都保留在同一进程中。

为此,我的问题是:

如何在 Node.js 进程之间有效传输 Tensorflow.js 张量(流),而不会造成严重的序列化/反序列化损失?

最佳答案

如何在 Node.js 之间有效传输 Tensorflow.js 张量(流)?

首先,张量不能直接发送。张量对象不包含任何数据。

console.log(tensor) // will show info about the tensor but not the data it contains

可以发送其数据,而不是传输张量对象:

// given a tensor t
// first get its data
const data = await t.data()
// and send it
worker.send({data})

为了能够在接收过程中重建这个张量,还需要发送张量的形状

worker.send({data, shape})

默认情况下,进程之间发送和接收消息会创建初始数据的副本。如果要发送大量数据,而副本会对系统造成惩罚,则可以使用 SharedArrayBuffer,这意味着零副本。然而,对于后者,一旦数据被发送,它就不能再被发送线程使用

关于javascript - 我可以在 Node.js 进程之间有效地传输 Tensorflow.js 张量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63119904/

相关文章:

python - 如何使用索引有效地获取张量中每一行的值?

javascript - jQuery 插件 'jquery.shuffle.js' 执行排序时遇到问题

node.js - 如何解决 Mongoose 的排序错误?

node.js - Node.js 的 Nginx 重写规则

python - 所有卷积神经网络都可以用于任意数量 channel 的图像吗?

python - 在 Tensorflow 中使用 2D 占位符遮盖 3D 占位符张量

javascript - 如何使用 AngularJS 将一个 .js 文件用于多个 .html 页面

javascript - 改变 li 高度会移动父级高度

javascript - JavaScript 中的通用点击重命名脚本(文本到输入/文本框)

node.js - Mongoose 在字段组合上找到