我正在使用 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/