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