【问题标题】:Can I transfer a Tensorflow.js Tensor efficiently between Node.js processes?我可以在 Node.js 进程之间有效地传输 Tensorflow.js 张量吗?
【发布时间】:2020-07-27 16:54:24
【问题描述】:

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

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

....包裹在一对tf.data.generator()s 中,后跟tf.data.zip()

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

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

为此,我的问题是:

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

【问题讨论】:

    标签: javascript node.js tensor tensorflow.js


    【解决方案1】:

    如何在 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,这意味着零副本。但是后者一旦发送数据,就不能再被发送线程使用了

    【讨论】:

    • 非常感谢您的回答!听起来SharedArrayBuffer 可能是我最好的选择。因为它本质上是一个生产者-消费者设置,所以一旦它被创建,最终的张量就不会再被发送线程访问 - 所以这将是完美的!很遗憾,您不能直接将引用传输到张量,但这是紧随其后的。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多