【问题标题】:Universal Sentence Encoder tensorflowjs optimize performance using webworkerUniversal Sentence Encoder tensorflowjs 使用 webworker 优化性能
【发布时间】:2021-05-07 07:41:58
【问题描述】:

我正在使用以下代码启动 Webworker,它使用 Universal Sentence Encoder 创建嵌入

const initEmbeddingWorker = (filePath) => {
    let worker = new Worker(filePath);
    worker.postMessage({init: 'init'})

    worker.onmessage = (e) => {
        worker.terminate();
    }
}

网络工作者代码

onmessage = function (e) {
    if(e.data.init && e.data.init === 'init') {
        fetchData();
    }
}

const fetchData = () => {
    //fetches data from indexeddb
    createEmbedding(data, storeEmbedding);
}

const createEmbedding = (data, callback) => {
    use.load().then(model => {
        model.embed(data).then(embeddings => {
            callback(embeddings);
        })
    });
}

const storeEmbedding = (matrix) => {
    let data = matrix.arraySync();
    //store data in indexeddb
}

使用同时运行的 10 个 Webworkers 创建 100 个嵌入需要 3 分钟,每个 worker 创建 10 个句子的嵌入。创建嵌入所花费的时间太大,因为我需要为 1000 多个句子创建嵌入,这大约需要 25 到 30 分钟。 每当此代码运行时,它都会占用所有资源,从而使机器变得非常缓慢且几乎无法使用。

是否缺少任何性能优化?

【问题讨论】:

  • 应该已经用this issue修复了,你运行的是什么版本的TFJS?您可以尝试升级到最新版本吗?
  • 更新库以使用 tensorflowjs 3.0 性能提升大约 10 秒。性能还必须取决于代码运行时 CPU、GPU 和 RAM 的当前利用率

标签: javascript web-worker tensorflow.js word-embedding


【解决方案1】:

使用 10 个 webworker 意味着用来运行它的机器至少有 11 个内核。为什么会有这个假设? (webworker数+主线程)

为了充分利用 webworker 的使用,每个 webworker 都应该在不同的核心上运行。当工人多于核心时会发生什么?好吧,该程序不会像预期的那么快,因为会使用很多时间来交换内核之间的通信。

现在让我们看看每个核心上发生了什么。

arraySync 是一个阻塞调用,阻止该线程用于其他事情。

可以使用array,而不是arraySync

const storeEmbedding = async (matrix) => {
    let data = await matrix.array();
    //store data in indexeddb
}

array 及其对应的 arraySyncdatadataSync 慢。最好存储flatten数据,输出data

const storeEmbedding = async (matrix) => {
        let data = await matrix.data();
        //store data in indexeddb
    }

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 2020-11-19
    • 2020-01-30
    • 2019-03-28
    • 2022-07-23
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多