#javascript #web-worker #tensorflow.js #word-embedding
#javascript #веб-рабочий #tensorflow.js #встраивание слов
Вопрос:
Я использую следующий код для запуска Webworker, который создает вложения с использованием универсального кодировщика предложений
const initEmbeddingWorker = (filePath) => {
let worker = new Worker(filePath);
worker.postMessage({init: 'init'})
worker.onmessage = (e) => {
worker.terminate();
}
}
Код Webworker
onmessage = function (e) {
if(e.data.init amp;amp; 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
}
Требуется 3 минуты, чтобы создать 100 вложений, используя 10 веб-разработчиков, работающих одновременно, и каждый рабочий создает вложения для 10 предложений. Время, затрачиваемое на создание вложений, слишком велико, так как мне нужно создать вложение для более чем 1000 предложений, что занимает от 25 до 30 минут.
Всякий раз, когда этот код запускается, он поглощает все ресурсы, что делает машину очень медленной и практически непригодной для использования.
Отсутствуют ли какие-либо оптимизации производительности?
Комментарии:
1. Эта проблема должна была быть исправлена, какую версию TFJS вы используете? Не могли бы вы попробовать обновить до последней версии?
2. Обновлена библиотека для использования tensorflowjs 3.0 улучшение производительности составило около 10 секунд. Производительность также должна зависеть от текущего использования процессора, графического процессора и оперативной памяти при выполнении кода
Ответ №1:
Использование 10 webworkers означает, что машина, используемая для ее запуска, имеет не менее 11 ядер. Почему это предположение? (количество webworker основной поток)
Чтобы максимально использовать webworker, каждый webworker должен запускаться на разных ядрах. Что происходит, когда рабочих больше, чем ядер? Ну, программа не будет такой быстрой, как ожидалось, потому что много раз будет использоваться для обмена сообщениями между ядрами.
Теперь давайте посмотрим, что происходит на каждом ядре.
arraySync
это блокирующий вызов, предотвращающий использование этого потока для чего-то другого.
Вместо использования arraySync
array
можно использовать.
const storeEmbedding = async (matrix) => {
let data = await matrix.array();
//store data in indexeddb
}
array
и его аналог arraySync
медленнее по сравнению с data
и dataSync
. Будет лучше хранить сглаженные данные, выходные data
данные .
const storeEmbedding = async (matrix) => {
let data = await matrix.data();
//store data in indexeddb
}