Универсальный кодировщик предложений tensorflowjs оптимизирует производительность с помощью webworker

#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
    }