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

Can I transfer a Tensorflow.js Tensor efficiently between Node.js processes?

我正在使用 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,这意味着零复制。但是对于后者,一旦发送数据,发送线程就不能再使用它