基于函数计算 + TensorFlow 的 Serverless AI 推理

前言概述

本文介绍了使用函数计算部署深度学习 AI 推理的最佳实践, 其中包括使用 FUN 工具一键部署安装第三方依赖、一键部署、本地调试以及压测评估, 全方位展示函数计算的开发敏捷特性、自动弹性伸缩能力、免运维和完善的监控设施。html

1.1 DEMO 概述

经过上传一个猫或者狗的照片, 识别出这个照片里面的动物是猫仍是狗node

开通服务python

免费开通函数计算, 按量付费,函数计算有很大的免费额度。linux

免费开通文件存储服务NAS, 按量付费git

1.2 解决方案

如上图所示, 当多个用户经过对外提供的 url 访问推理服务时候,每秒的请求几百上千都没有关系, 函数计算平台会自动伸缩, 提供足够的执行实例来响应用户的请求, 同时函数计算提供了完善的监控设施来监控您的函数运行状况。github

1.3. Serverless 方案与传统自建服务方案对比

1.3.1 卓越的工程效率

1.3.2 弹性伸缩免运维

1.3.3 更低的成本

  • 函数计算 (FC) 固有自动伸缩和负载均衡功能,用户不须要购买负载均衡 (SLB) 和弹性伸缩。
  • 具备明显波峰波谷的用户访问场景(好比只有部分时间段有请求,其余时间甚至没有请求),选择按需付费,只需为实际使用的计算资源付费。
对于明显波峰波谷或者稀疏调用具备低成本优点, 同时还保持了弹性能力,之后业务规模作大之后并无技术切换成本,同时财务成本增加配合预付费也能保持平滑。

假设有一个在线计算服务,因为是CPU 密集型计算, 所以在这里咱们将平均 CPU 利用率做为核心参考指标对成本,以一个月为周期,10台 C5 ECS 的总计算力为例,总的计算量约为 30% 场景下, 各解决方案 CPU 资源利用率使用状况示意图大体以下:web

由上图预估出以下计费模型:ubuntu

  • 函数计算预付费 3CU 一个月: 246.27 元, 计算能力等价于 ECS 计算型 C5
  • ECS 计算型 C5 (2vCPU,4GB)+云盘: 包月219 元,按量: 446.4 元
  • 包月10 Mbps 的 SLB: 526.52 元(这里作了必定的流量假设), 弹性伸缩免费
  • 饱和使用下,函数计算按量付费的一台机器成本约为按量付费 C5 ECS 的2 倍

注:浏览器

  1. 这里假设函数逻辑没有公网公网下行流量费用, 即便有也是一致的, 这里成本比较暂不参与
  2. 延时敏感,当 CPU 利用率大于等于 50% 就须要开始进行扩容,否则更来不及应对峰值
  3. 成本敏感,当 CPU 利用率大约 80% 即开始进行扩容, 能容受必定概率的超时或者5XX

上表中, 其中函数计算组合付费中的 X 为按需付费的成本价,假设按需付费的计算量占整个计算量的 10%,假设 CPU 利用率为100%, 对应上表,那么须要 3 台 ECS 的计算能力便可。所以 FC 按量付费的成本 X = 3 ️ 446.4 ️ 10% ️ 2 = 267.84 ( FC 按量付费是按量 ECS 的2倍),这个时候函数计算组合付费总计 1005.8 元。 在这个模型预估里面, 只要 FC 按量付费占整个计算量小于 20%, 即便不考虑 SLB, 单纯考虑计算成本, 都是有必定优点的。并发

1.3.4. 小结

基于函数计算进行 AI 推理等 CPU 密集型的主要优点:

  1. 上手简单, 只专一业务逻辑开发, 极大提升工程开发效率。

    • 自建方案有太多学习和配置成本,如针对不一样场景,ESS 须要作各类不一样的参数配置
    • 系统环境的维护升级等
  2. 免运维,函数执行级别粒度的监控和告警。
  3. 毫秒级弹性扩容,保证弹性高可用,同时能覆盖延迟敏感和成本敏感类型。
  4. 在 CPU 密集型的计算场景下, 经过设置合理的组合计费模式, 在以下场景中具备成本优点:

    • 请求访问具备明显波峰波谷, 其余时间甚至没有请求
    • 有必定稳定的负载请求, 可是有部分时间段请求量突变剧烈

打包代码ZIP包和部署函数

FUN 操做简明视频教程

开通服务

免费开通函数计算, 按量付费,函数计算有很大的免费额度。

免费开通文件存储服务NAS, 按量付费

2.1 安装第三方包到本地并上传到NAS

2.1.1 安装最新的Fun

  • 安装版本为8.x 最新版或者10.x 、12.x nodejs
  • 安装 funcraf

2.1.2 Clone 工程 & Fun 一键安装第三方库到本地

  • git clone https://github.com/awesome-fc/cat-dog-classify.git
  • 复制 .env_example 文件为 .env, 而且修改 .env 中的信息为本身的信息
  • 执行 fun install -v, fun 会根据 Funfile 中定义的逻辑安装相关的依赖包

根据 Funfile 的定义:

  • 将第三方库下载到 .fun/nas/auto-default/classify/python 目录下
  • 本地 model 目录移到 .fun/nas/auto-default/model 目录下

安装完成后,从这里咱们看出, 函数计算引用的代码包解压以后已经达到了 670 M, 远超过 50M 代码包限制, 解决方案是 NAS 详情能够参考: 挂载NAS访问,幸运的是 FUN 工具一键解决了 nas 的配置和文件上传问题。

2.1.3. 将下载的依赖的第三方代码包上传到 NAS

依次执行这些命令,就将本地中的 .fun/nas/auto-default 中的第三方代码包和模型文件传到 NAS 中, 依次看下这几个命令的作了什么事情:

  • fun nas init: 初始化 NAS, 基于您的 .env 中的信息获取(已有知足条件的nas)或建立一个同region可用的nas
  • fun nas info: 能够查看本地 NAS 的目录位置, 对于此工程是 $(pwd)/.fun/nas/auto-default/classify
  • fun nas sync: 将本地 NAS 中的内容(.fun/nas/auto-default/classify)上传到 NAS 中的 classify 目录
  • fun nas ls nas:///mnt/auto/: 查看咱们是否已经正确将文件上传到了 NAS

登陆 NAS 控制台 https://nas.console.aliyun.com 和 VPC 控制台 https://vpc.console.aliyun.com
能够观察到在指定的 region 上有 NAS 和 相应的 vpc 建立成功

2.2 本地调试函数

在 template.yml 中, 指定了这个函数是 http 类型的函数, 因此根据 fun 的提示:

执行 fun local start, 本地就会启动一个 http server 来模拟函数的执行, 而后咱们 client 端可使用 postman, curl 或者浏览器, 好比对于本例:

2.3 部署函数到FC平台

本地调试OK 后,咱们接下来将函数部署到云平台:

修改 template.yml LogConfig 中的 Project, 任意取一个不会重复的名字便可,有两处地方须要更改,而后执行

fun deploy

注意: template.yml 注释的部分为自定义域名的配置, 若是想在 fun deploy 中完成这个部署工做:

  • 先去域名解析, 好比在示例中, 将域名 sz.mofangdegisn.cn 解析到 123456.cn-hangzhou.fc.aliyuncs.com, 对应的域名、accountId 和 region 修改为本身的
  • 去掉 template.yml 中的注释, 修改为本身的域名
  • 执行 fun deploy

这个时候若是没有自定义域名, 直接经过浏览器访问访问http trigger 的url, 好比 https://123456.cn-shenzhen.fc.aliyuncs.com/2016-08-15/proxy/classify/cat-dog/ 会被强制下载.

缘由:https://help.aliyun.com/knowledge_detail/56103.html#HTTP-Trigger-compulsory-header

登陆控制台https://fc.console.aliyun.com,能够看到service 和 函数已经建立成功, 而且 service 也已经正确配置。

在这里,咱们发现第一次打开页面访问函数的时候,执行环境实例冷启动时间很是长, 若是是一个在线AI推理服务,对响应时间很是敏感,冷启动引发的毛刺对于这种类型的服务是不可接受的,接下来,本文讲解如何利用函数计算的预留模式来消除冷启动带来的负面影响。

使用预留模式消除冷启动毛刺

函数计算具备动态伸缩的特性, 根据并发请求量,自动弹性扩容出执行环境来执行环境,在这个典型的深度学习示例中,import keras 消耗的时间很长 , 在咱们设置的 1 G 规格的函数中, 并发访问的时候耗时10s左右, 有时甚至20s+

3.1 函数计算设置预留

预留操做简明视频教程

一次压测结果

从上面图中咱们能够看出,当函数执行的请求到来时,优先被调度到预留的实例中被执行, 这个时候是没有冷启动的,因此请求是没有毛刺的, 后面随着测试的压力不断增大(峰值TPS 达到 1184), 预留的实例不能知足调用函数的请求, 这个时候函数计算就自动进行按需扩容实例供函数执行,此时的调用就有冷启动的过程, 从上面咱们能够看出,函数的最大 latency 时间甚至达到了 32s,若是这个web AP是延时敏感的,这个 latency 是不可接受的。

总结

  • 函数计算具备快速自动伸缩扩容能力
  • 预留模式很好地解决了冷启动中的毛刺问题
  • 开发简单易上手,只须要关注具体的代码逻辑, Fun 工具助您一键式部署运用
  • 函数计算具备很好监控设施, 您能够可视化观察您函数运行状况, 执行时间、内存等信息

本文做者:rsong

原文连接

本文为阿里云内容,未经容许不得转载。

相关文章
相关标签/搜索