# 如何上线部署Pytorch深度学习模型到生产环境中
## 目录
* [Pytorch模型部署准备](#Pytorch模型部署准备)
* [Pytorch自定义运行时](#Pytorch自定义运行时)
* [默认部署Pytorch模型](#默认部署Pytorch模型)
* [自定义部署Pytorch模型](#自定义部署Pytorch模型)
* [通过ONNX部署Pytorch模型](#通过ONNX部署Pytorch模型)
* [试用DaaS(Deployment-as-a-Service)](#试用DaaS(Deployment-as-a-Service))
* [参考](#参考)
## Pytorch模型部署准备
[Pytorch](https://pytorch.org/)和[TensorFlow](https://www.tensorflow.org/)是目前使用最广泛的两种深度学习框架,在上一篇文章《[自动部署深度神经网络模型TensorFlow(Keras)到生产环境中](https://github.com/aipredict/ai-deployment/blob/master/deploy-keras-in-daas/README.md)》中我们介绍了如何通过AutoDeployAI的AI模型部署和管理系统DaaS(Deployment-as-a-Service)来自动部署TensorFlow模型,本篇我们将介绍如果通过DaaS来自动部署Pytorch深度神经网络模型,同样我们需要:
* 安装Python [DaaS-Client](https://github.com/autodeployai/daas-client)
* 初始化DaasClient
* 创建项目
完整的代码,请参考Github上的Notebook:[deploy-pytorch.ipynb](https://github.com/aipredict/ai-deployment/blob/master/deploy-pytorch-in-daas/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](https://github.com/autodeployai/daas-microk8s/blob/master/requirements-service.txt)。下载requirements-service.txt文件到当前目录,创建Dockerfile:
```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:
```bash
docker build -f Dockerfile -t pytorch:1.0 .
```
2. 推送Docker镜像到Kubernetes中:
构建好的Docker镜像必须推送到安装DaaS的Kubernetes环境能访问的地方,不同的Kubernetes环境有不同的Docker镜像访问机制,比如本地镜像,私有或者公有镜像注册表(Image Registry)。下面以[Daas-MicroK8s](https://github.com/autodeployai/daas-microk8s)为例,它使用的是MicroK8s本地镜像缓存(Local Images Cache):
```bash
docker save pytorch:1.0 > pytorch.tar
microk8s ctr image import pytorch.tar
```
3. 创建Pytorch运行时:
登陆DaaS Web页面后,点击顶部菜单`环境 / 运行时定义`,下面页面会列出所有的有效运行时,可以看到DaaS自带的四种运行时:
![DaaS-runtimes](https://raw.githubusercontent.com/aipredict/ai-deployment/master/deploy-pytorch-in-daas/daas-runtimes.png)
点击按钮`创建运行时`,创建基于`pytorch:1.0`镜像的Environment运行时:
![DaaS-runtimes](https://raw.githubusercontent.com/aipredict/ai-deployment/master/deploy-pytorch-in-daas/daas-create-runtime.png)
## 默认部署Pytorch模型
### 训练Pytorch模型。
使用torchvision中的`MNIST`数据来识别用户输入的数字,以下代码参考官方实例:[Image classification (MNIST) using Convnets](https://github.com/pytorch/examples/blob/master/mnist/main.py)。
首先,定义一个无参函数返回用户定义模型类(继承自torch.nn.Module)的一个实例,函数中包含所有的依赖,可以独立运行,也就是说包含引入的第三方库,定义的类、函数或者变量等等。这是能自动部署Pytorch模型的关键。
```python
# 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.relu(x)
x = self.conv2(x)
x = F.relu(x)
x = F.max_pool2d(x, 2)
x = self.dropout1(x)
x = torch.flatten(x, 1)
x = self.fc1(x)
x = F.relu(x)
x = self.dropout2(x)
x = self.fc2(x)
output = F.log_softmax(x, dim=1)
return output
return Net()
```
为了快速训练出模型,修改epochs=3
```python
import torch
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.optim.lr_scheduler import StepLR
def train(model, device, train_loader, optimizer, epoch, log_interval):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
if batch_idx % log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))
def test(model, device, test_loader):
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss
pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
use_cuda = torch.cuda.is_available()
batch_size = 64
test_batch_size = 1000
seed = 1234567
lr = 1.0
gamma = 0.7
log_interval = 10
epochs = 3
torch.manual_seed(seed)
device = torch.device("cuda" if use_cuda else "cpu")
kwargs = {'batch_size': batch_size}
if use_cuda:
kwargs.update({'num_workers': 1,
'pin_memory': True,
'shuffle': True},
)
transform = transforms.Compose([
transforms.ToTensor()
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于Jupyter Notebook的AI模型上线与模型部署 (100个子文件)
.gitignore 45B
deploy-pytorch.ipynb 13KB
deploy-keras.ipynb 10KB
deploy-sklearn-xgboost-lightgbm-pyspark.ipynb 8KB
onnx.ipynb 2KB
xgb-iris-pmml.ipynb 2KB
daas-run-generate-code-job.jpg 160KB
daas-run-generrate-code-web-service.jpg 143KB
daas-custom-scoring-test.jpg 125KB
daas-generate-model-evaluation.jpg 113KB
daas-design.jpg 108KB
daas-models.jpg 106KB
daas-edit-service.jpg 106KB
daas-datasets-empty.jpg 101KB
daas-model-deployments.jpg 100KB
daas-generate-batch-scoring.jpg 98KB
daas-job-settings.jpg 98KB
daas-models.jpg 97KB
daas-import-model.jpg 95KB
daas-model-overview-v4.jpg 89KB
daas-generate-custom-scoring.jpg 86KB
daas-model-overview-v1.jpg 81KB
daas-job-test.jpg 81KB
daas-model-overview-evaluation.jpg 78KB
daas-job.jpg 74KB
daas-web-service-generrate-code.jpg 71KB
daas-web-service-test.jpg 71KB
daas-model-overview.jpg 69KB
daas-add-dataset.jpg 69KB
daas-model-test.jpg 68KB
daas-projects.jpg 64KB
daas-model-versions.jpg 64KB
daas-web-service-overview.jpg 61KB
daas-new-project.jpg 60KB
daas-add-service.jpg 52KB
daas-datasets.jpg 44KB
daas-custom-scoring-deployments.jpg 38KB
daas-login.jpg 21KB
pmml4s-demo.json 11KB
LICENSE 11KB
README.md 23KB
README.md 19KB
README.md 16KB
README.md 16KB
README.md 13KB
README.md 8KB
README.md 6KB
README.md 2KB
README.md 2KB
logreg_iris.onnx 702B
xgb-iris.pmml 45KB
daas-run-curl-logreg.png 399KB
daas-deployment-curl-test.png 338KB
daas-model-script-test.png 336KB
daas-run-curl-mnist.png 326KB
daas-custom-realtime-test.png 263KB
daas-custom-realtime-test-final.png 219KB
daas-onnx-model-test.png 204KB
daas-test-custom-scoring-mnist.png 201KB
daas-pods.png 170KB
daas-model-test.png 166KB
pmml-flow.png 166KB
daas-model-realtime.png 151KB
daas-model-test-mnist.png 148KB
daas-model-test.png 142KB
daas-deployment-curl-test.png 135KB
daas-generate-custom-scoring-mnist.png 129KB
daas-model-realtime.png 128KB
daas-home.png 114KB
daas-deployment.png 108KB
daas-onnx-model-test.png 106KB
daas-deployment-test.png 100KB
daas-import.png 98KB
daas-test-web-service-logreg.png 98KB
daas-environments.png 93KB
daas-deployment-test.png 92KB
daas-test-web-service-mnist.png 91KB
daas-model-overview.png 89KB
daas-onnx-model-overview.png 88KB
daas-runtimes.png 87KB
daas-model-overview.png 85KB
daas-advanced-settings.png 83KB
daas-model-test-logreg.png 76KB
daas-create-web-service-mnist.png 73KB
daas-import-model-logreg.png 72KB
daas-jobs.png 72KB
daas-import-model-mnist.png 70KB
daas-curl-logreg.png 67KB
daas-model-overview-logreg.png 65KB
daas-model-overview-mnist.png 62KB
daas-create-web-service-logreg.png 61KB
daas-deployments.png 61KB
daas-nodes.png 53KB
daas-deployment.png 52KB
daas-runtimes.png 49KB
daas-curl-mnist.png 48KB
daas-nodes.png 46KB
daas-create-runtime.png 45KB
logreg_iris.onnx.png 22KB
test.png 254B
共 100 条
- 1
资源评论
爱吃苹果的Jemmy
- 粉丝: 73
- 资源: 1148
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功