【问题标题】:How do I deploy deep reinforcement learning neural network I coded in Pytorch to my website?如何将我在 Pytorch 中编码的深度强化学习神经网络部署到我的网站?
【发布时间】:2019-12-03 23:56:14
【问题描述】:

我已经在 Pytorch 中构建和训练了神经网络,并准备好在网站上进行生产,但我该如何部署它?

【问题讨论】:

  • 您需要有一个用于模型推理的后端,网站将向该后端发出请求

标签: pytorch


【解决方案1】:

有多种方法可以做到这一点。

首先,我添加一个 PS:我注意到您在发布我的答案后专门询问强化学习。请注意,尽管我在编写此答案时考虑了静态神经网络模型,但我在帖子末尾提供了一个解决方案,以将此答案的想法应用于强化学习。

不同的选项:

据我所知,不特别推荐在生产中使用 PyTorch 进行大规模生产。 将 PyTorch 模型转换为 ONNX 格式(一种使 AI 模型在框架之间可互换的格式)更为常见。如果您想以这种方式操作,这里有一个教程:https://github.com/onnx/tutorials/blob/master/tutorials/PytorchOnnxExport.ipynb。 然后使用 ONNX 运行时、Caffe2(Facebook 提供)或 TensorFlow(Google 提供)运行它。

我的答案不会探索这些解决方案(而且我没有包含这些选项的教程),因为我最近做了与您尝试做的相同的事情(构建神经网络架构并想要部署它,以及允许用户使用该架构训练他们的神经网络),但我没有转换我的神经网络,原因如下:

  • ONNX 发展迅速,但目前不支持您在 PyTorch 模型中可能执行的所有操作。因此,如果您有一个高度自定义或特定的神经网络(比如我的例子),您可能无法轻松地将其转换为 ONNX。您可能需要更改架构,或者可能需要重新编写其中的大部分内容,以便将其转换为 ONNX。
  • 您将需要使用一两个额外的工具,大多数教程都没有深入,或者没有解释他们所做工作背后的逻辑。

请注意,如果您每天调用网络数十亿或数万亿次,您可能想要转换您的神经网络,否则我认为您可以坚持使用 PyTorch,即使在生产中也不会出现问题,并避免转换为 ONNX 的回退。

首先让我们看看如何保存经过训练的神经网络,通过网络架构将其加载回来,然后重新运行经过训练的网络。 其次,我们如何将网络部署到网站,以及如何允许用户训练他们的网络。这可能不是最好或最有效的方法,但它确实有效。

保存网络:

首先,您显然需要使用“import torch”导入 pyTorch。在您的神经网络文件中,您应该保存要重用的网络的 stateDict(基本上是网络操作和权重的字典)。例如,您可以仅保存模型的 stateDict 以使您的 epoch 损失最小。

# network is the variable containing your neural network class
network_stateDict = network.state_dict()
# Saving network stateDict to a variable

然后,当您想将 stateDict 保存到以后可以重复使用的文件中时,请使用:

torch.save(network_stateDict, "folderPath/myStateDict.pt)
# Saving the stateDict variable to a file
# The pt extension is just a convention in the PyTorch community, ptr is also used a lot

最后,当您以后想要重新使用经过训练的网络时,您需要:

network = myNetwork(1, 2, 3)
# Load the architecture of the network in a variable (use the same architecture
# and the same network parameters as the ones used to create the stateDict)

network.load_state_dict(torch.load(folderPath/myStateDict.pt))
# Loading the file containing the stateDict of the trained network into a format
# pyTorch can read with the torch.load function. Then load the stateDict inside the 
# network architecture with the load_state_dict function, applied to your network
# object with network.load_state_dict .

network.eval()
# To make sure that the stateDict has correctly been loaded.

output = network(input_data)
# You should now be able to get output data from your
# trained network, by feeding it a single set of input data.

有关保存模型和 stateDicts 的更多信息:https://pytorch.org/tutorials/beginner/saving_loading_models.html

部署网络:

现在我们知道如何保存、恢复和将输入数据输入网络,剩下要做的就是部署它,以便通过网站完成此过程。

您首先需要(可能来自您的用户)您的神经网络将使用的输入。我不会包含任何链接,因为有很多不同的 Web 框架。

然后您需要使用允许您在 Python 中执行以下逻辑的框架(如 Django):

import torch

network = myNetwork(1, 2, 3)
network.load_state_dict(torch.load(folderPath/myStateDict.pt))
network.eval()

input_data = data_fromMyUser
output = network(input_data)

然后你会收集输出来显示它,或者做任何你想做的事情。

如果您的框架没有让您能够使用 Python,我认为最好有一个小型 Python 脚本,您可以向其提供输入数据并返回输出。

如果您想为用户提供训练网络的可能性,您应该让他们开始训练网络,然后在 stateDict 对象上使用 torch.save 将 stateDict 保存到文件中。 您或他们以后可以使用经过训练的网络(您还需要创建一个小函数来确保您不会覆盖以前的 stateDict 文件)。

如何将其应用于强化学习:

我没有部署强化学习模型,但我可以为您提供一些想法并引导您探索部署一个。

您可以存储从用户那里获得的输入并将其添加到文件或数据库中,然后编写一个小程序,例如每 24 小时或每小时一次,使用现在更大的数据集重新运行神经网络。

然后您可以完全应用此答案中的建议,运行网络,保存模型的 stateDict,然后更改您的网络在生产中使用的 stateDict。

这有点老套,但可以让您以“静态方式”保存训练有素的网络,并且仍然让它们不断发展和改变它们的 stateDicts。

结论

这显然不是您可以采用的最大规模生产方法,但在我看来,它是最容易实施的方法。 您还知道,您将获得的输出将是您的神经网络的实际输出,值中没有任何失真或错误。

祝你有美好的一天!

【讨论】:

  • 是的,Flask 可以用作部署框架,但您不会像在开发中运行服务器时那样部署它(请参阅this post)。关于 Flask 是否是一个“好”的框架,从我读过的内容来看,它很容易上手,并且有很多预构建的工具,这很棒,但扩展起来有点困难。出于这个原因,我更喜欢预构建较少的 Django,并且您可以根据具体情况构建所需的内容。您还有更多可用的选项。
【解决方案2】:
  1. 根据需要保存经过训练的模型(HD5 或使用 pickle)
  2. 通过加载经过训练的模型编写要在生产中处理的程序
  3. 在分布式系统上部署程序以进行实时计算,如 Apache Storm、Flink、Alink、Apache Samoa 等。
  4. 如果您觉得需要根据反馈重新训练模型,然后在不同的集群或并行环境中重新训练模型并观察模型的准确性,如果看起来不错,然后将模型投入生产(最初几天您需要重新训练多次,它如果您的模型设计得好,将减少持续时间)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2020-05-15
    • 2018-10-05
    • 1970-01-01
    • 2011-01-28
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多