第 8 章 生产中的 PyTorch PyTorch 在生产中的应用
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
现在你已经学会了如何使用 PyTorch 对图像、文本和声音进行分类,下一步就是看看如何在生产中部署 PyTorch 应用程序。在本章中,我们将创建通过 HTTP 和 gRPC 在 PyTorch 模型上运行推理的应用程序。然后,我们将这些应用程序打包到 Docker 容器中,并部署到运行在 Google Cloud 上的 Kubernetes 集群中。
在下半部分,我们将了解 PyTorch 1.0 中引入的新技术 TorchScript,它允许我们使用即时跟踪(JIT)来生成可从 C++ 运行的优化模型。我们还简要了解了如何用量化技术压缩模型。首先,让我们来看看模型服务。
模型服务
我们用了过去六章的时间在 PyTorch 中构建模型,但构建模型只是构建 Deep Learning 应用程序的一部分。毕竟,一个模型可能有惊人的准确率(或其他相关指标),但如果它从未做出任何预测,那它还有价值吗?我们需要的是一种简单的方法来打包我们的模型,这样它们就能响应请求(通过网络或其他方式,我们会看到),并能以最小的代价在生产中运行。
值得庆幸的是,Python 允许我们使用 Flask 框架快速启动和运行网络服务。在本节中,我们将构建一个简单的服务,加载基于 ResNet 的猫或鱼模型,接受包含图片 URL 的请求,并返回一个 JSON 响应,说明图片中包含的是猫还是鱼。
注意
如果我们给模型发送一张狗的图片,会发生什么?模型会告诉你这不是一条鱼就是一只猫。它对任何事物都没有概念,只有可用的选择,并且总是会选择其中一个。一些 Deep Learning 从业者会在训练过程中添加一个额外的类,Unknown ,并抛出不属于任何所需类别的标注示例。这在一定程度上是可行的,但它本质上是试图让神经网络学习所有不是猫或鱼的东西,这对你我来说都很难表达,更不用说一系列的矩阵计算了!另一种方法是查看最终softmax 生成的概率输出。如果模型产生的预测结果是猫/鱼各占一半,或者是分布在各个类中,那么也许可以建议Unknown 。
构建 Flask 服务
让我们启动并运行模型的网络服务版本。Flask是使用 Python 创建网络服务的流行框架,我们将在本章中使用它作为基础。使用pip 或conda 安装 Flask 库:
conda install -c anaconda flask pip install flask
新建一个名为catfish的目录,并将模型定义以model.py 的形式复制到其中:
fromtorchvisionimportmodelsCatfishClasses=["cat","fish"]CatfishModel=models.ResNet50()CatfishModel.fc=nn.Sequential(nn.Linear(transfer_model.fc.in_features,500),nn.ReLU(),nn.Dropout(),nn.Linear(500,2))
请注意,我们在这里没有指定预训练模型,因为我们将在 Flask 服务器启动过程中加载保存的权重。然后创建另一个 Python 脚本catfish_server.py,我们将在其中启动网络服务:
fromflaskimportFlask,jsonify ...