繁体   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