GTLC全球技术领导力峰会·上海站,首批讲师正式上线! 了解详情
写点什么

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

2019 年 11 月 22 日

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

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


1.1. DEMO 示例


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



1.2. 解决方案


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


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

1.3.1. 卓越的工程效率


1.3.2. 弹性伸缩免运维


1.3.3. 更低的成本

  • fc 固有自动伸缩和负载均衡功能,用户不需要购买 SLB 和弹性伸缩。

  • 具有明显波峰波谷的用户访问场景(比如只有部分时间段有请求,其他时间甚至没有请求),选择按需付费,只需为实际使用的计算资源付费。


对于明显波峰波谷或者稀疏调用具有低成本优势, 同时还保持了弹性能力,以后业务规模做大以后并没有技术切换成本,同时财务成本增长配合预付费也能保持平滑。



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



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


  • 函数计算预付费 3CU 一个月: 246.27 元, 计算能力等价于 ECS 计算型 C5

  • ECS 计算型 C5 (2vCPU,4GB)+云盘: 包月 219 元,按量: 446.4 元

  • 包月 10 Mbps 的 SLB: 526.52 元(这里做了一定的流量假设), 弹性伸缩免费

  • 饱和使用下,函数计算按量付费的一台机器成本约为按量付费 C5 ECS 的 2 倍



注:

这里假设函数逻辑没有公网公网下行流量费用, 即使有也是一致的, >这里成本比较暂不参与

延时敏感,当 CPU 利用率大于等于 50% 就需要开始进行扩容,不然>更来不及应对峰值

成本敏感,当 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 需要做各种不同的参数配置


  1. 免运维,函数执行级别粒度的监控和告警。

  2. 毫秒级弹性扩容,保证弹性高可用,同时能覆盖延迟敏感和成本敏感类型。

  3. 在 cpu 密集型的计算场景下, 通过设置合理的组合计费模式, 在如下场景中具有成本优势:


  • 请求访问具有明显波峰波谷, 其他时间甚至没有请求

  • 有一定稳定的负载请求, 但是有部分时间段请求量突变剧烈


打包代码 ZIP 包和部署函数

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

2.1.1. 安装最新的 Fun


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



root@66fb3ad27a4c: ls .fun/nas/auto-default/classifymodel  pythonroot@66fb3ad27a4c: du -sm .fun697     .fun
复制代码


根据 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 initfun nas infofun nas syncfun nas ls nas://classify:/mnt/auto/
复制代码


依次执行这些命令,就将本地中的 .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://classify:/mnt/auto/: 查看我们是否已经正确将文件上传到了 NAS


登录 NAS 控制台 https://nas.console.aliyun.com 和 VPC 控制台 https://vpc.console.aliyun.com


可以观察到在指定的 region 上有 NAS 和 相应的 vpc 创建成功


2.2. 本地调试函数

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


Tips for next step======================* Invoke Event Function: fun local invoke* Invoke Http Function: fun local start* Build Http Function: fun build* Deploy Resources: fun deploy
复制代码


执行 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+


start = time.time()from keras.models import model_from_jsonprint("import keras time = ", time.time()-start)
复制代码


3.1. 函数计算设置预留

  • 在 FC 控制台,发布版本,并且基于该版本创建别名 prod,并且基于别名 prod 设置预留, 操作过程请参考:https://help.aliyun.com/document_detail/138103.html

  • 将该函数的 http trigger 和 自定义域名的设置执行 prod 版本




一次压测结果




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


总结

  • 函数计算具有快速自动伸缩扩容能力

  • 预留模式很好地解决了冷启动中的毛刺问题

  • 开发简单易上手,只需要关注具体的代码逻辑, Fun 工具助您一键式部署运用

  • 函数计算具有很好监控设施, 您可以可视化观察您函数运行情况, 执行时间、内存等信息


2019 年 11 月 22 日 16:061362

评论

发布
暂无评论
发现更多内容

Kafka 是如何建模数据的?

tison

大数据 kafka

分布式RDBMS和NoSQL

LEAF

华为云MVP朱有鹏:做IoT开发乐趣无穷,年轻开发者更要厚积薄发

华为云开发者社区

人工智能 物联网中台 物联网 IoT 华为云

架构师训练营第六周 - 总结

Larry

总结

东哥

架构师训练营第六周命题作业

whiter

极客大学架构师训练营

Week06

熊威

CAP原理之个人见解

潜默闻雨

架构学习第六周作业

乐天

分布式KV存储临时失效时序图

LEAF

第六章总结

武鹏

CAP原理简介

elfkingw

架构师训练营第六周总结

王铭铭

「架构师训练营」第 6 周作业 - CAP

森林

架构师训练营第六周学习总结

whiter

极客大学架构师训练营

CAP

东哥

CAP

聊聊Dubbo(一):为何选择

猿灯塔

缓存穿透、缓存击穿、缓存雪崩,看这篇就够了

码农神说

缓存 缓存穿透 缓存击穿 缓存雪崩 数据缓存

聊聊服务灾备

老胡爱分享

分布式架构 服务设计

解析软件系统稳定性的三大秘密

华为云开发者社区

开发者 软件开发 稳定性 系统 探索与实践

【架构师训练营】第六周总结

Mr.hou

极客大学架构师训练营

喜讯!众盟科技获ADMIC 2020金璨奖“年度汽车数字化营销供应商”殊荣

人称T客

第六周作业

Larry

「架构师训练营」第 6 周作业 - 总结

森林

详解 Flink 实时应用的确定性

Apache Flink

flink

架构师训练营第6周总结:数据库分片,Hbase和ZooKeeper

hifly

zookeeper Cassandra 极客大学架构师训练营 HBase

第六章作业

武鹏

联想ThinkSystem服务器,企业智能化考验下的极限应考

脑极体

未来已至,持续学习让我们更好的生存

七镜花园-董一凡

学习 生活

继 GitHub、Twitter 后,Linux 内核废止 master/slave

神经星星

GitHub Linux 程序员 Linux Kenel 技术平权

第六周作业

晨光

DNSPod与开源应用专场

DNSPod与开源应用专场

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