WebWorker 中的 TensorflowJS 通用句子编码器

TensorflowJS universal sentence encoder in WebWorker

尝试运行在 webworker 中使用以避免性能问题,但它缺少 embed() 方法。

WebWorker

importScripts('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.2.9/dist/tf.min.js');
importScripts('https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder@1.1.1/dist/universal-sentence-encoder.min.js');
tf.setBackend('cpu');

onmessage = message => {
  use.load().then(model => {
    const sentences = [
      'I like my phone.',
      'Your cellphone looks great.'
    ];
    /**
      model = { model, tokenizer }
    */
    model.embed(sentences).then(async embeddings => {
      const vec = await embeddings.array();
      const cosine = tf.losses.cosineDistance(vec[0], vec[1], 0);
      const result = await cosine.data();
      console.log(`${Math.round((1 - result) * 100)}%`);
    });
  });
}

模型内部没有 embed(),主线程就是这种情况
甚至可以 运行 在网络工作者中使用吗?

Universal Sentence Encoder (USE) 可以在 webworker 中使用。请参阅下面的工作代码段,结果从工作程序发送到主线程

<head>
 <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.14.2/dist/tf.min.js"></script>
 <script>
        const worker_function = () =>
{
 importScripts('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.2.9/dist/tf.min.js');
 importScripts('https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder@1.1.1/dist/universal-sentence-encoder.min.js');
 tf.setBackend('cpu');
 onmessage = message =>
 {
        console.log("from worker")
  use.load().then(model =>
  {
   const sentences = [
    'I like my phone.',
    'Your cellphone looks great.'
   ];
   model.embed(sentences).then(async embeddings =>
   { 
                console.log(await embeddings)
    const vec = await embeddings.array();
    const cosine = tf.losses.cosineDistance(vec[0], vec[1], 0);
    const result = await cosine.data();
                console.log(`${Math.round((1 - result) * 100)}%`);
                
                postMessage({res: cosine.dataSync(), shape: cosine.shape})
            });
            
  });
 };
}
if (window != self)
 worker_function();
    </script>
 <script>
        const worker = new Worker(URL.createObjectURL(new Blob(["(" + worker_function.toString() + ")()"], { type: 'text/javascript' })));
        worker.postMessage({});
        worker.onmessage = (message) => {
            console.log('from main thread')
            const {data} = message
         tf.tensor(message.data.res, message.data.shape).print()
        }
    </script>
</head>