Javascript 通用句子编码器tensorflowjs使用webworker优化性能
我使用下面的代码启动Webworker,它使用通用语句编码器创建嵌入Javascript 通用句子编码器tensorflowjs使用webworker优化性能,javascript,web-worker,tensorflow.js,word-embedding,Javascript,Web Worker,Tensorflow.js,Word Embedding,我使用下面的代码启动Webworker,它使用通用语句编码器创建嵌入 const initEmbeddingWorker = (filePath) => { let worker = new Worker(filePath); worker.postMessage({init: 'init'}) worker.onmessage = (e) => { worker.terminate(); } } 网络工作者代码 onmessage
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个同时运行的webworker创建100个嵌入需要3分钟,每个worker创建10个句子的嵌入需要3分钟。创建嵌入所花费的时间太长,因为我需要创建1000多个句子的嵌入,这大约需要25到30分钟。
每当这个代码运行时,它就会占用所有的资源,这使得机器速度非常慢,几乎无法使用
是否缺少任何性能优化?使用10个webworkers意味着用于运行它的机器至少有11个内核。为什么会有这种假设?(webworker+主线程的数量) 为了充分利用webworker的使用,每个webworker都应该在不同的核心上运行。当工人多于核心时会发生什么?这个程序不会像预期的那么快,因为很多时候会在核心之间交换通信 现在让我们看看每个核心上发生了什么
arraySync
是阻止该线程用于其他用途的阻塞调用
可以使用arraySync
,而不是arraySync
const storeEmbedding = async (matrix) => {
let data = await matrix.array();
//store data in indexeddb
}
array
及其对应的arraySync
比data
和dataSync
慢。最好存储展平数据,输出数据
const storeEmbedding = async (matrix) => {
let data = await matrix.data();
//store data in indexeddb
}
它应该已经被修复了,你正在运行什么版本的TFJS?您可以尝试升级到最新版本吗?更新了库以使用tensorflowjs 3.0。性能提高约10秒。性能还必须取决于代码运行时CPU、GPU和RAM的当前利用率