引言
Serverless在AI方面的应用至今仍然不太明朗,国内的开源组织主要集中在阿里云、腾讯云、华为云及蚂蚁集团组成的开源社区Serverless-Devs联盟,该联盟的存在旨在为开发者提供强大的工具链体系,通过Serverless-Devs,开发者不仅可以一键体验多云 Serverless 产品,极速部署 Serverless 项目,还可以在 Serverless 应用全生命周期进行项目的管理,并且非常简单快速的将 Serverless Devs 与其他工具/平台进行结合,进一步提升研发、运维效能。
虽然当前Serverless-Devs提供了一些解决产商锁定的案例,并在其开源网站:ServerlessRegsitry开源网给出了大量的参考案例。但某些云产商的AI-Serverless教程还是远古时代的版本,CLI命令行不一致,yaml文件配置不一致:如何通过ServerlessDevs将代码部署至函数计算_函数计算-阿里云帮助中心这给AI-Serverless开发带来了重重阻力。
笔者仍然希望AI应用能够打破产商锁定壁垒,同样的应用应该在各大云产商共同运行,拥抱真正的社区统一。
AI-Serverless应用开发实践
【1】RAM权限配置
由于整个AI-Serverless应用需要访问NAS存储,在未来的教程中可能还需要访问OSS存储,对于外部存储的访问就涉及到了权限问题,故需要到阿里云访问控制台先解决权限问题,如下图所示:
进入界面后,点击左侧菜单栏的角色,可以看到一大批关于服务权限的角色名称:
对于函数计算,未来使用的角色都是AliyunFcDefaultRole,点击进入权限详情,添加管理所有阿里云资源权限:
并且在右上角可以看到角色的ARN码,该ARN码非常重要,需要记住格式,特别注意自己的用户ID值。
【2】配置NAS存储
NAS存储服务需要开通,应该是免费的问题不大,需要在NAS存储服务的文件系统列表中创建文件系统,并添加挂载点,这个挂载点需要通过VPC与Serverless函数服务绑定到一起,在【挂载使用】子菜单可以查看需要在s.yaml文件中配置的serverAddr:
【3】编写代码
前期准备:安装Serverless-Devs开发者工具(需要先安装最新版本nodejs、npm)
#!/bin/bash
# 安装更新Node.js和Npm所需要的软件
echo "update apt packge ..."
sudo apt update
# 添加NodeSource APT存储库和用于验证软件包的PGP密钥
echo "add NodeSource APT is PGP"
sudo apt install apt-transport-https curl ca-certificates software-properties-common
echo "add apt-get nodejs16.x and PGP" # 该行命令完成了apt-get存储库的添加并添加了PGP密钥
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
echo "install nodejs and npm...." # 安装Node
sudo apt-get install -y nodejs
# 安装Serverless-Devs
npm install @serverless-devs/s -g
首先从代码仓库拉取代码
edition: 1.0.0 # 命令行YAML规范版本,遵循语义化版本(Semantic Versioning)规范
name: cat-dog # 项目名称
access: "default"
services:
cat-dog: # 服务名称
component: devsapp/fc # 组件名称
props: # 组件的属性值
region: cn-shenzhen
service:
name: cat-dog
description: 'The service for classifying cats and dogs'
internetAccess: true
role: 'acs:ram::xxxx:role/aliyunfcdefaultrole' #xxx替换成自己阿里云账号的用户ID,或者在角色aliyunfcdefaultrole里面看
nasConfig:
userId: 10003
groupId: 10003
mountPoints:
- serverAddr: xxxxx.cn-shenzhen.nas.aliyuncs.com # 在上文的图里面看
nasDir: /ai-fn # NAS文件系统里面的路径
fcDir: /mnt/auto # 函数虚拟目录的名称,绑定到nasDir
vpcConfig: auto
logConfig: auto
function:
name: classify
description: classify the cats and dogs
runtime: python3
codeUri: ./src
handler: predict.handler
initializationTimeout: 300
initializer: predict.initializer
memorySize: 1024
timeout: 120
environmentVariables:
PYTHONUSERBASE: /mnt/auto/python
model_path: /mnt/auto/model
triggers:
- name: httpTrigger
type: http
config:
authType: anonymous
methods:
- GET
- POST
- PUT
customDomains:
- domainName: auto
protocol: HTTP
routeConfigs:
- path: /*
methods:
- GET
- POST
- PUT
需要注意的是,由于使用到了TensorFlow1.31,故最高支持的python版本应该为3.6,所以需要使用Anaconda虚拟出一个python3.6的环境,具体方法请自行CSDN搜索。
# 构建镜像
s build
# 初始化NAS服务
s nas init
# 上传模型数据到NAS供AI服务使用
## 上传依赖包
s nas upload -r .s/build/artifacts/cat-dog/classify/.s/python/ /mnt/auto/python
## 上传模型
s nas upload -r src/model/ /mnt/auto/model
## 查看NAS目录文件
s nas command ls /mnt/auto/
## 部署项目
s deploy
完成项目部署后,可以在控制台看到打印的system_url和custom_domain,在浏览器输入URL即可进行测试,如图所示:
进一步的,我们可以尝试使用POSTMan来发送请求测试AI-serverless。
anyway,整体上一个AI-Serverless应用就完成了。从整体上来看,当前的云服务厂商的产商锁定还是比较严重的,特别是RAM权限问题,这个ARN码问题必须要解决,个人的建议是直接添加根权限到FC默认角色当中。对于AI应用而言,由于具有大量的数据依赖项,故NAS存储、OSS存储两类服务是必不可少的,当前如《Serverless架构下的AI应用开发:入门、实战与性能优化》一书,采用的AI-Serverless应用框架主要是Flask整合AI应用,腾讯云默认的HTTP函数Python运行时版本使用的框架也是Flask,故Flask、express等轻量级框架在Python、Nodejs为主要运行时的Serverless时代中可以大放异彩。此外,Serverless-Devs给出的跨云服务产商解决方案是一个有潜力的研究方向。