1

@tensorflow/tfjs-node我的问题是将 TensorFlow.js 计算(使用)移动到 Node.js 中的工作线程是否是个好主意。这个问题归结为使用原生后端运行 TensorFlow 计算时主线程被阻塞到什么程度的问题。

据我了解,如果我使用完全 JavaScript 版本的 TensorFlow ( @tensorflow/tfjs) 和 call model.fit(x, y, options),适合模型的计算实际上发生在 JavaScript 主线程上。更准确地说,model.fit返回 a Promise,因此计算在微任务中异步执行,但这些仍在主线程上运行。这些微任务在某种意义上是阻塞的,例如事件处理程序的执行需要等待微任务队列清空。因此,在这种情况下,将计算转移到 Web Worker 以避免在计算正在进行时阻塞主线程是有意义的。

但是,如果我使用原生版本的 TensorFlow ( @tensorflow/tfjs-node),“真正的工作”是在原生代码中进行的。这是我不知道的两件事,这使我无法回答标题中的问题:

  1. 背后的计算是否model.fit与主 JS 线程在同一线程上运行?
  2. 不管 1 的答案如何,我们仍然有与model.fit. 在微任务队列中发生这种情况是否会阻止其他事件被处理,直到微任务队列为空?

这是我要问的一个示例:假设我有一个发送和接收 socket.io 消息的 Node.js 应用程序。其中一条消息是拟合 TensorFlow.js 模型的请求;当应用程序收到此消息时,它会调用model.fit(x, y, options). 假设我没有将 TensorFlow 计算放在工作线程中,那么在计算进行时,应用程序是否还能回复来自服务器的 socket.io ping 消息?

4

1 回答 1

0

javascript 运行时将运行主线程中的所有代码,除非被告知使用工作者。为了回答这个问题,发生的事情与@tensorflow/tfjs-node浏览器中发生的事情没有什么不同。唯一的区别是计算的后端。虽然,promise 在微任务中运行,并不意味着阻塞事件循环,但如果 promise 回调本身是 cpu 密集型操作,它将阻塞主线程。当有时可以观察到浏览器无响应时,确实会发生这种情况。同样的事情也发生在 nodejs 上。

为了防止这些小冻结,可以使用另一个专门用于训练模型 ( model.fit) 或预测 ( model.predict) 的工作人员。这样主线程将始终可用于处理其他处理。

为了在使用单个主线程的情况下继续这个问题,socket.io 消息将在它们到达时排队。但只有在您的承诺完成后才会处理它们。当主线程已经开始执行model.fit时,它将无法回复套接字消息,直到model.fit解决。这很workers方便。因为当工作人员忙于处理时,model.fit您的主线程被释放以处理事件循环中的任何其他传入消息

于 2021-03-29T18:51:54.010 回答