簡體   English   中英

是否有必要將 TensorFlow.js 計算放在 Node.js 工作線程中?

[英]Is it necessary to place TensorFlow.js computations in a Node.js worker thread?

我的問題是將 TensorFlow.js 計算(使用@tensorflow/tfjs-node )移動到 Node.js 中的工作線程是否是個好主意。 這個問題歸結為使用本機后端運行 TensorFlow 計算時主線程被阻塞的程度。

As I understand it, if I use the fully JavaScript version of TensorFlow ( @tensorflow/tfjs ) and call model.fit(x, y, options) , the computation that fits the model is actually happening on the main JavaScript thread. 更准確地說, model.fit返回一個Promise ,因此計算是在微任務中異步執行的,但這些仍然在主線程上運行。 這些微任務在某種意義上是阻塞的,例如事件處理程序的執行需要等待微任務隊列清空。 因此,在這種情況下,將計算轉移到 Web Worker 以避免在計算正在進行時阻塞主線程是有意義的。

但是,如果我使用 TensorFlow ( @tensorflow/tfjs-node ) 的本機版本,則“真正的工作”正在本機代碼中進行。 這是我不知道的兩件事,這使我無法回答標題中的問題:

  1. model.fit背后的計算是否與主 JS 線程在同一線程上運行?
  2. 不管 1 的答案如何,我們仍然有與 model.fit 的model.fit處理相關的微任務。 在微任務隊列中發生這種情況是否會阻止其他事件被處理,直到微任務隊列為空?

這是我要詢問的一個示例:假設我有一個 Node.js 應用程序,它發送和接收 socket.io 消息。 其中一條消息是要求安裝 TensorFlow.js model; 當應用程序收到此消息時,它會調用model.fit(x, y, options) 假設我沒有將 TensorFlow 計算放在工作線程中,在計算進行時,應用程序是否仍然可以回復來自服務器的 socket.io ping 消息?

javascript 運行時將運行主線程中的所有代碼,除非被告知使用工作線程。 為了回答這個問題, @tensorflow/tfjs-node發生的事情與瀏覽器中發生的事情沒有什么不同。 唯一的區別是計算的后端。 雖然 promise 在微任務中運行,並不意味着阻塞事件循環,但如果 promise 回調本身是 CPU 密集型操作,它將阻塞主線程。 當有時可以觀察到瀏覽器無響應時,確實會發生這種情況。 同樣的事情也發生在 nodejs 上。

為了防止這些小凍結,可以使用另一個專門用於訓練 model ( model.fit ) 或預測 ( model.predict ) 的工作人員。 這樣主線程將始終可用於處理其他處理。

為了在使用單個主線程的情況下繼續解決問題,socket.io 消息將在它們到達時排隊。 但只有在您的 promise 完成后才會處理它們。 當主線程已經開始執行model.fit時,它將無法回復套接字消息,直到model.fit解決。 這就是使workers得心應手的原因。 因為當工作人員忙於處理model.fit ,您的主線程被釋放以處理事件循環中的任何其他傳入消息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM