如何将用Pytorch编码的深度强化学习神经网络部署到我的网站?

时间:2019-07-25 16:25:57

标签: pytorch

我已经在Pytorch中构建并训练了神经网络,并准备将其生产到网站上,但是如何部署它?

2 个答案:

答案 0 :(得分: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的后备。 / p>

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

保存网络:

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

# 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框架。

然后,您将需要使用一个框架(例如Django),该框架允许您在Py​​thon中执行以下操作:

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。

结论

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

祝你有美好的一天!

答案 1 :(得分:0)

  1. 根据需要保存已训练的模型(HD5或泡菜)
  2. 编写程序以通过加载经过训练的模型来进行生产
  3. 在分布式系统上部署该程序以进行实时计算,例如在Apache Storm,Flink,Alink,Apache Samoa等上。
  4. 如果您认为需要根据反馈来重新训练模型,然后在不同的集群或并行环境上重新训练模型,并在看起来不错的情况下观察模型的准确性,然后将模型投入生产(最初几天您需要多次重新训练,并且如果您的模型设计得当,将会减少时间。