使用 JS 后端和 Python 进行机器学习

时间:2021-04-13 08:36:52

标签: python node.js tensorflow tensorflow.js

我需要一些高级建议。我想使用 JS 创建 API,但所有 ML 功能都使用 Python。我不想摆脱像 GraphQL 这样很棒的 JS 库,但我不想牺牲 Python 性能。我知道我可以使用 Tensorflow.js,但正如我所说,在性能方面,Python 更好。

我的想法是使用 Python 将 ML 模型部署到云端,然后在我的 JS API 或类似的东西中获取预测。

另一个想法是使用 Python 创建推理,以 .h5 或 .json 的形式保存,然后在我的 API 中使用 Tensorflow.js 直接加载它们。

##### LOCAL #####
inputs = Input(shape=(trainX.shape[1], trainX.shape[2], trainX.shape[3]))

...
Conv2D
Conv2D
Conv2D
...

model = Model(inputs=inputs, outputs=predictions)

model.compile(...)

model.fit(...)

model.save(model.json) # I dont think I can save the weights in Python in the .json format
##### API #####
https.get('SOMEURL', (resp) => {
  const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
  
  const { data } = resp
  
  return model.predict(data)

}).on("error", (err) => {
  console.log("Error: " + err.message);
});

我真的不知道这是否可行,或者有更好的形式(或者甚至可能)。

感谢所有想法和建议。谢谢。

1 个答案:

答案 0 :(得分:1)

您已经指出了可用于为 ML/DL 模型执行预测的两种方法。我将列出每项所需的步骤以及我自己的个人建议。


本地:

在这里,您必须使用 Tensorflow 和 Python 构建和训练模型。然后,要在您的 Web 应用程序上使用该模型,您需要使用 tfjs-converter 将其转换为正确的格式。例如,您会得到一个 model.jsongroup1-shard1of1.bin 文件,然后您可以使用它们对来自 client side 的数据进行预测。为了提高性能,您可以在转换模型时对其进行量化。

  1. 我发现通过这种方式进行预测更容易,因为整个过程并不困难。
  2. 模型始终位于客户端,因此如果您正在寻找非常快速的预测,它应该是最佳选择。
  3. 安全方面,如果在生产中使用此模型,则不会将任何用户数据传递到服务器端,因此用户不必担心他们的数据被不当使用。例如,如果您在欧盟,则必须遵守 General Data Protection Regulation (GDPR),这让事情变得非常复杂。
  4. 如果您想改进模型,则需要先训练一个新模型,然后更新 Web 应用程序以更改模型文件。您无法执行online-learning(根据它看到的新数据训练模型并对其进行即时改进)。

API:

在这里,您必须使用某种库来制作 REST API。我会推荐 FastAPI,它很容易启动和运行。您需要为模型创建 POST 数据的路由。您可以创建向这些请求从客户端接收数据的位置发出 POST 请求的路由,然后使用您拥有的模型对数据执行预测。然后它将发回请求正文中的预测。用于进行预测的 API 和代码必须托管在某个地方,以便您从客户端进行查询,您可以使用 Heroku 来实现这一点。此 article 贯穿整个过程。

  1. 与本地方法相比,流程复杂。
  2. 需要将数据发送到服务器,因此如果您需要对大量数据进行非常快速的预测,与本地方法相比,这种方法会更慢。
  3. 对于生产用例,这是首选方法,除非无法将用户数据发送到服务器。
  4. 这些是 REST API,因此要使其与 GraphQL 一起使用,您必须按照 here 详细说明的步骤使用 GraphQL 包装 REST API。
  5. 您可以不断改进模型,而无需修改客户端代码。

<块引用>

我不想摆脱像 GraphQL 这样很棒的 JS 库,但我不想牺牲 Python 性能。我知道我可以使用 Tensorflow.js,但正如我所说,在性能方面,Python 更好。

我想指出的一件事是,无论您使用 Python 还是 Javascript,模型的预测速度都将相同。您可以改进它的唯一方法是量化这会减小模型大小,同时还可以改善 CPU 和硬件加速器的延迟,而模型准确度几乎没有下降做的是使用模型进行预测。除非您在网速较慢的地区向端点发送大量数据,否则两种方法之间的差异可以忽略不计。