目录
- Pytorch模型部署准备
- Pytorch自定义运行时
- 默认部署Pytorch模型
- 自定义部署Pytorch模型
- 通过ONNX部署Pytorch模型
- 试用DaaS(Deployment-as-a-Service)
- 参考
Pytorch模型部署准备
Pytorch和TensorFlow是目前使用最广泛的两种深度学习框架,在上一篇文章《自动部署深度神经网络模型TensorFlow(Keras)到生产环境中》中我们介绍了如何通过AutoDeployAI的AI模型部署和管理系统DaaS(Deployment-as-a-Service)来自动部署TensorFlow模型,本篇我们将介绍如果通过DaaS来自动部署Pytorch深度神经网络模型,同样我们需要:
- 安装Python DaaS-Client
- 初始化DaasClient
- 创建项目
完整的代码,请参考Github上的Notebook:deploy-pytorch.ipynb
Pytorch自定义运行时
DaaS是基于Kubernetes的AI模型自动部署系统,模型运行在Docker Container中,在DaaS中被称为运行时(Runtime),有两类不同的运行时,分别为网络服务运行环境(Environment)和任务运行环境(Worker)。Environment用于创建网络服务(Web Service),而Worker用于执行任务(Job)的部署,比如模型评估和批量预测等。DaaS默认自带了四套运行时,分别针对Environment和Worker基于不同语言Python2.7和Python3.7,自带了大部分常用的机器学习和深度学习类库,但是因为Docker镜像(Image)大小的缘故,暂时没有包含Pytorch库。
DaaS提供了自定义运行时功能,允许用户把自定义Docker镜像注册为Runtime,满足用户使用不同模型类型,模型版本的定制需求。下面,我们以部署Pytorch模型为例,详细介绍如何创建自定义运行时:
1. 构建Docker镜像:
一般来说,有两种方式创建Image,一种是通过Dockerfile构建(docker build),一种是通过Container生成(docker commit),这里我们使用第一种方式。无论那一种方式,都需要选定一个基础镜像,这里为了方便构建,我们选择了Pytorch官方镜像pytorch/pytorch:1.5.1-cuda10.1-cudnn7-runtime
。
为了创建网络服务运行时,除了包含模型运行的依赖类库外,还需要额外安装网络服务的一些基础库,完整的列表请参考requirements-service.txt。下载requirements-service.txt文件到当前目录,创建Dockerfile:
FROM pytorch/pytorch:1.5.1-cuda10.1-cudnn7-runtime
RUN mkdir -p /daas
WORKDIR /daas
COPY requirements-service.txt /daas
RUN pip install -r requirements-service.txt && rm -rf /root/.cache/pip
构建Image:
docker build -f Dockerfile -t pytorch:1.0 .
2. 推送Docker镜像到Kubernetes中:
构建好的Docker镜像必须推送到安装DaaS的Kubernetes环境能访问的地方,不同的Kubernetes环境有不同的Docker镜像访问机制,比如本地镜像,私有或者公有镜像注册表(Image Registry)。下面以Daas-MicroK8s为例,它使用的是MicroK8s本地镜像缓存(Local Images Cache):
docker save pytorch:1.0 > pytorch.tar
microk8s ctr image import pytorch.tar
3. 创建Pytorch运行时:
登陆DaaS Web页面后,点击顶部菜单环境 / 运行时定义
,下面页面会列出所有的有效运行时,可以看到DaaS自带的四种运行时:
点击按钮创建运行时
,创建基于pytorch:1.0
镜像的Environment运行时:
默认部署Pytorch模型
训练Pytorch模型。
使用torchvision中的MNIST
数据来识别用户输入的数字,以下代码参考官方实例:Image classification (MNIST) using Convnets。
首先,定义一个无参函数返回用户定义模型类(继承自torch.nn.Module)的一个实例,函数中包含所有的依赖,可以独立运行,也就是说包含引入的第三方库,定义的类、函数或者变量等等。这是能自动部署Pytorch模型的关键。
# Define a function to create an instance of the Net class
def create_net():
import torch
import torch.nn as nn # PyTorch's module wrapper
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 32, 3, 1)
self.conv2 = nn.Conv2d(32, 64, 3, 1)
self.dropout1 = nn.Dropout2d(0.25)
self.dropout2 = nn.Dropout2d(0.5)
self.fc1 = nn.Linear(9216, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.conv1(x)
x = F