基于Serverless Devs的深度学习模型部署

本文涉及的产品
简介: 本文详细介绍了Serverless Devs部署AI模型的全套流程,包括serverless服务配置,本地代码调试,AI模型与依赖上传,以及最后的服务部署。通过这篇文章,您可以了解到serverless为AI部署带来的优势,轻松体验高可用分布式AI推理系统。

基于Serverless Devs的深度学习模型部署

配置

函数计算的基本配置

  1. 下载Serverless Devs开发者工具, 并完成阿里云密钥配置之后。
  2. 使用命令s init完成项目的基本配置,以阿里云为例,选择带http触发器的python3的环境,并输入第一步获得的密钥。

    image-20210710160504686

  3. 修改项目的配置文件s.yaml,完成项目名称以及描述的配置

    image-20210710162136503

配置NAS和VPC

在深度学习模型的部署中,最难处理的是大体积的机器学习依赖安装以及深度学习模型参数的储存问题。通常而言,机器学习的库大小能接近1G,而深度模型一般也有100M起步。对于函数计算来说,为了减少平台的冷启动,都会设置代码包大小限制,阿里云的函数计算代码包必须在100MB以内。因此,我们需要一个云存储来解决依赖调用与模型参数加载的问题。在本示例中,我们使用NAS(Network Attached Storage)来存放我们的依赖与模型。NAS,简单来说说就是连接在网络上,具备资料存储功能的储存系统,我们可以通过挂载的方式对NAS进行访问。

  1. 开通阿里云NAS服务,并创建一个文件系统,根据业务需求我们可以选择不同的配置。
  2. 将获得的NAS地址写入配置,并将VPC设置为自动。

    image-20210710164633602

配置注意事项

  1. 由于深度学习模型初始化时间较长,建议将初始化时间initializationTimeout调至120s以上
  2. 由于深度学习模型内存占用较大,建议将最大内存memorySize调至521MB以上

代码架构

简单来说,我们可以将基于serverless devs的工程分成三个部分。.s文件夹中存放部分配置文件,以及我们build出来的依赖和代码;src文件夹存放我们的源代码和深度学习模型参数;s.yaml文件存放我们对函数计算的配置。

image-20210710170739337

其中,src文件夹的index.py文件一般存放我们的函数入口,这里给出部分示例代码。在本项目中,我们需要对用户上传的图片进行处理。为了方便获取图片,这里我们使用flask框架。需要注意的是,对于每次执行都会进行的操作如加载模型参数,为了减少模型推理时间,我们将其放置在initialize函数中,这样这段代码只会被执行一次。

# -*- coding: utf-8 -*-
import logging
import numpy as np
from PIL import Image
import io
from skimage.transform import resize
import torch as torch
import torch.nn.functional as F
from flask import Flask, request
from models import VGG
import transforms as transforms

net = VGG('VGG19')
class_names = ['Angry', 'Disgust', 'Fear',
               'Happy', 'Sad', 'Surprise', 'Neutral']
logger = logging.getLogger()
app = Flask(__name__)

def initialize(context):
    # Get parameters from NAS
    ROOT_DIR = r'/mnt/auto/'
    # ROOT_DIR = r''
    MODEL_PATH = ROOT_DIR + 'vgg_emo_dect.t7'
    # Load the VGG network
    logger.info('load the model ...')
    checkpoint = torch.load(
        MODEL_PATH, map_location=torch.device('cpu'))
    net.load_state_dict(checkpoint['net'])
    net.eval()

@app.route("/", methods=["POST", "GET"])
def predict():
    logger.info('processing ...')
    # get the image buffer
    image = request.files.get('file').read()
    # transform it to the np array
    image_data = np.array(Image.open(io.BytesIO(image)))
    # return the final result
    inputs = preprocess(image_data)
    score, predict = infer(inputs)
    res = dict(zip(class_names, score.tolist()))
    logger.info(class_names[int(predict)])
    res['pred'] = class_names[int(predict)]
    return res

本地调试

由于本地的调试环境与远程的函数计算环境往往不同,为了兼容性,我们最好使用Docker拉取函数计算远程镜像进行调试。

  1. 下载docker(如果本机没有docker的话)
  2. 使用命令s build --use-docker进行依赖安装
  3. 使用命令s local invoke/start进行本地调试。

    image-20210710170005412

  4. 构建简单测试,对本地接口进行调用,示例测试代码:

    import requests
    
    files = {'file':('1.jpg',open('1.jpg','rb'),'image/jpg')}
    url = 'http://localhost:7218/2016-08-15/proxy/emo-dectioon/get-emotion/'
    res = requests.post(url=url, files=files)
    print(res.text)

上传依赖与模型参数

上传依赖与模型参数到NAS

  1. 上传依赖:s nas upload -r .s/build/artifacts/emo-dectioon/get-emotion/.s/python nas:///mnt/auto/python
  2. 上传模型:s nas upload src/vgg_emo_dect.t7 nas:///mnt/auto

    image-20210710172703359

  3. 查看是否上传成功:s nas command ls nas://mnt/auto

    image-20210710172455176

  4. 查看安装的依赖:s nas command ls nas:///mnt/auto/python/lib/python3.6/site-packages

    image-20210710173126004

上传成功后,我们可以在代码中简单使用路径获取对应文件:)

模型部署

在本地调试时,我们模型参数和依赖的路径都是本地路径。现在,我们要将这些路径转化为NAS的路径,并删去本地模型参数和调试生成的依赖(不然因代码包过大而无法进行部署)。需要注意的是,对于依赖,我们需要修改python的引用路径,这体现在我们的配置文件中:

image-20210710173739230

接着,运行命令s depoly即可将代码部署到远程:

image-20210710174156929

用上述测试代码调用远程接口进行测试:

image-20210710180116302

完整代码链接:Emotion Dection: The AI model deployment based on Serverless Devs

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
1月前
|
监控 Serverless 对象存储
Serverless 应用引擎常见问题之用ECI部署Traefik时设置如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
237 2
|
1天前
|
测试技术 Linux Docker
【好玩的经典游戏】Docker部署FC-web游戏模拟器
【好玩的经典游戏】Docker部署FC-web游戏模拟器
19 1
|
8天前
|
机器学习/深度学习 API 算法框架/工具
R语言深度学习:用keras神经网络回归模型预测时间序列数据
R语言深度学习:用keras神经网络回归模型预测时间序列数据
17 0
|
8天前
|
机器学习/深度学习 并行计算 算法
R语言深度学习不同模型对比分析案例
R语言深度学习不同模型对比分析案例
26 0
|
9天前
|
监控 Serverless API
阿里云函数计算的工作原理与事件驱动模型密切相关
【4月更文挑战第17天】阿里云函数计算的工作原理与事件驱动模型密切相关
64 4
|
10天前
|
机器学习/深度学习 人工智能 分布式计算
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
15 0
|
12天前
|
机器学习/深度学习 自然语言处理 算法
探索深度学习中的序列建模新范式:Mamba模型的突破与挑战
【4月更文挑战第13天】Mamba模型,一种新型序列建模架构,通过选择性状态空间提高处理长序列数据的效率,实现线性时间复杂度。在语言、音频和DNA序列建模中展现优秀性能,尤其在大规模预训练中超越Transformer。然而,面对连续信号数据时可能不及LTI模型,且模型参数优化及硬件实现具有挑战性。
42 5
探索深度学习中的序列建模新范式:Mamba模型的突破与挑战
|
27天前
|
人工智能 监控 Serverless
如何基于ACK Serverless快速部署AI推理服务
通过上述步骤,可以在ACK Serverless上快速部署AI推理服务,实现高可用、弹性扩展的服务架构。
20 1
|
1月前
|
机器学习/深度学习 数据可视化 Linux
深度学习模型可视化工具——Netron使用介绍
深度学习模型可视化工具——Netron使用介绍
43 2
|
1月前
|
机器学习/深度学习 资源调度 算法
深度学习模型数值稳定性——梯度衰减和梯度爆炸的说明
深度学习模型数值稳定性——梯度衰减和梯度爆炸的说明
19 0

相关产品

  • 函数计算