【发布时间】:2019-12-03 23:56:14
【问题描述】:
我已经在 Pytorch 中构建和训练了神经网络,并准备好在网站上进行生产,但我该如何部署它?
【问题讨论】:
-
您需要有一个用于模型推理的后端,网站将向该后端发出请求
标签: pytorch
我已经在 Pytorch 中构建和训练了神经网络,并准备好在网站上进行生产,但我该如何部署它?
【问题讨论】:
标签: pytorch
有多种方法可以做到这一点。
首先,我添加一个 PS:我注意到您在发布我的答案后专门询问强化学习。请注意,尽管我在编写此答案时考虑了静态神经网络模型,但我在帖子末尾提供了一个解决方案,以将此答案的想法应用于强化学习。
不同的选项:
据我所知,不特别推荐在生产中使用 PyTorch 进行大规模生产。 将 PyTorch 模型转换为 ONNX 格式(一种使 AI 模型在框架之间可互换的格式)更为常见。如果您想以这种方式操作,这里有一个教程:https://github.com/onnx/tutorials/blob/master/tutorials/PytorchOnnxExport.ipynb。 然后使用 ONNX 运行时、Caffe2(Facebook 提供)或 TensorFlow(Google 提供)运行它。
我的答案不会探索这些解决方案(而且我没有包含这些选项的教程),因为我最近做了与您尝试做的相同的事情(构建神经网络架构并想要部署它,以及允许用户使用该架构训练他们的神经网络),但我没有转换我的神经网络,原因如下:
请注意,如果您每天调用网络数十亿或数万亿次,您可能想要转换您的神经网络,否则我认为您可以坚持使用 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。
结论
这显然不是您可以采用的最大规模生产方法,但在我看来,它是最容易实施的方法。 您还知道,您将获得的输出将是您的神经网络的实际输出,值中没有任何失真或错误。
祝你有美好的一天!
【讨论】:
【讨论】: