tensorflow.js は処理の重さ的に worker で動かしたいのだがまだ WebWorker で動かすと cpu backend に fallback してしまうので、この issue ずっとみてる https://t.co/KYGEQSFwq5
— 無糖派層 (@mizchi) July 30, 2019
僕も以前にWebWorker上でTensorFlow.jsを使おうとして WebGL backendで動かないことに気付いて諦めていたのだった。
…と思っていたのだけど、どうも先月くらいの @tensorflow/tfjs@1.2.2
あたりから ChromeではOffscreenCanvasというのを使ってWebWorker上でもWebGL backendで動くようになったようだ。
試してみたところでは 動くのはChromeのみで、SafariやFirefoxではCPU backendのまま。
動作を確認できるdemoページを作ってみた。
https://sugyan.com/tfjs-webworker/
ボタンを押すと適当にmodelをloadして、何回かrandom inputに対してpredictを計算する。
普通に MainThread上で実行すると、WebGL backendが使われて predictの計算などは高速になるのだけど、最初のloadや1回目の計算のときなどに重い処理が走り、UIの更新がストップしてしまう。
Platform and environment | TensorFlow.js | TensorFlow
これを回避するために、MainThreadではなくWebWorker上で計算を行うようにすると、UIの更新がブロックされずに計算が出来るのだけど、従来だとWebWorker上ではCPU backendにfallbackしてしまうために計算がとても遅くなってしまっていた。
これが、Chromeだと、UI更新をブロックせずにWebWorker上で高速に計算することが出来る。
これは嬉しい。 すべてのブラウザでもサポートされてくれると嬉しいな〜〜〜