I’ve checked my code, the predict/data tasks was executed on a WebWorker. But still, it blocked UI for 700ms. As a comparison, it got 800ms block when that tasks run on main thread.
In fact, even if I just call model.predict() without the following value.data(), it acted the same.  Maybe i did not use WebWorker correctly.
I’m trying to upload a executable project, it will take some time. It’s something like this:
// index.js click to call worker from main thread
        tfWorker.postMessage({img: imgBuff}, [imgBuff]);
// get result from worker
        tfWorker.onmessage = function (e) {
            let featureBuff = e.data.featureBuff;
        };

// tfWork.js onmessage() get input data from main thread
    let imgBuff = e.data.img;
    let inputFloat = new Float32Array(imgBuff);
    let retBuff = await tfWrapper.processImg(inputFloat);    
    postMessage({featureBuff: retBuff.buff}, [retBuff.buff]);   

// tfjs/wrapper.tsx processImg() execute predict() and array() tasks
    tf.engine().startScope()
    tf.setBackend('webgl');
    let values = this.model.predict();
    let result = await values.array();
    tf.engine().endScope()
    return result;