开发函数计算的正确姿势——tensorflow serving

前言

首先介绍下在本文出现的几个比较重要的概念:

函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息参考
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档参考

备注: 本文介绍的技巧需要 Fun 版本大于等于 2.16.0。

依赖工具

本项目是在 MacOS 下开发的,涉及到的工具是平台无关的,对于 Linux 和 Windows 桌面系统应该也同样适用。在开始本例之前请确保如下工具已经正确的安装,更新到最新版本,并进行正确的配置。

Fun 和 Fcli 工具依赖于 docker 来模拟本地环境。

对于 MacOS 用户可以使用 homebrew 进行安装:

brew cask install docker
brew tap vangie/formula
brew install fun
brew install fcli

Windows 和 Linux 用户安装请参考:

  1. https://github.com/aliyun/fun/blob/master/docs/usage/installation.md
  2. https://github.com/aliyun/fcli/releases

安装好后,记得先执行 fun config 初始化一下配置。

注意, 如果你已经安装过了 fun,确保 fun 的版本在 2.13.0 以上。

$ fun --version
2.16.0

背景

AI model serving 是函数计算一个比较典型的应用场景。数据科学家训练好模型以后往往需要找软件工程师把模型变成系统或者服务,通常把这个过程称之为 model serving。函数计算无需运维和弹性伸缩的特性,正好符合数据科学家对高可用分布式系统的诉求。本文将介绍把一个 TensorFlow CharRNN 训练的自动写五言绝句古诗的模型部署到函数计算的例子。由于 python TensorFlow 依赖库和训练的模型的文件有数百兆,即使压缩也远超了函数计算 50M 代码包大小的限制。对于这类超大体积的文件,采用 NAS 文件系统是最佳选择。本文会介绍一种 Fun + NAS 的方法来解决 tensorflow serving 问题。

快速开始

1. 克隆 poetry 项目

git clone [https://github.com/vangie/poetry.git](https://github.com/vangie/poetry.git)

2. 安装依赖

执行 fun install 安装依赖。

由于 fun.yml 文件里声明了 tensorflow 的依赖和包括了训练模型的脚本命令,所以执行会比较费时,请耐心等待。

这里有一个小细节需要注意,我们在 fun.yml 指定了 target 属性,因此会被安装到本地模拟的 NAS 目录

动态演示(为了演示效果,我们将训练的 max_steps 参数设置为 100):

3. 运行函数

执行 fun local invoke 可以在本地运行函数,正确的返回内容如下:

$ fun local invoke poetry
Reading event data from stdin, which can be ended with Enter then Ctrl+D
(you can also pass it from file with -e)
mouting local nas mock dir /Users/vangie/Desktop/poetry/.fun/nas/3be7b4835d-pvs14.cn-shanghai.nas.aliyuncs.com/ into container /mnt/nas

skip pulling image aliyunfc/runtime-python3.6:1.5.2...
FunctionCompute python3 runtime inited.
FC Invoke Start RequestId: 938334c4-5407-4a72-93e1-6d59e52774d8
.......(省略了部分日志)
不见江中客,无言此别归。
江风秋雨落,山色夜山长。
不问江南客,孤舟在故乡。
一年如远别,何处是归人。
一夜无人

RequestId: 938334c4-5407-4a72-93e1-6d59e52774d8 Billed Duration: 14074 ms Memory Size: 1998 MB Max Memory Used: 226 MB

动态演示:


4. 上传本地机器学习依赖、模型到 NAS 服务

我们在上一步通过 fun local invoke 命令在本地调通了 Fun NAS,但由于目前,我们的 NAS 资源只存在于本地,因此还要上传到 NAS 服务上

下面,我们分别介绍 Fun Nas 以及 ECS 这两种上传方式。

4.1 通过 Fun Nas 上传(推荐)

  1. 执行 fun nas init 初始化 nas 的相关配置
  2. 执行 fun nas info 可以查看本地 nas 的目录位置,因为我们前面 fun install target 直接指定了这个位置,因此不需要再做任何操作了
  3. 执行 fun nas sync 将本地 nas 资源上传到云端 NAS 服务
  4. 执行 fun nas ls nas://poetry:/mnt/auto/ 查看我们是否已经正确将文件上传到了 NAS

fun nas sync 的动态演示(为了演示效果,我们缩减了依赖体积):

fun_nas_tensorflow_model_serving_demo_for_nas.gif

4.2 通过 ECS 上传

除了可以使用 Fun Nas 的方式上传外,我们还可以使用 ECS 的方式,将本地 NAS 资源上传。

假设我们已经拥有了一台 ECS,然后使用下面的命令拷贝文件到 nas 并解压:

# 挂载 nas 网盘
mount -t nfs -o vers=4.0 3be7b4835d-pvs14.cn-shanghai.nas.aliyuncs.com:/ /mnt/nas

# 压缩本地要上传的目录
cd .fun/nas/3be7b4835d-pvs14.cn-shanghai.nas.aliyuncs.com/
tar -czvf nas.tar.gz lib model

# 拷贝到 nas 目录
scp nas.tar.gz root@47.103.83.174:/mnt/nas

# 解压
tar -xvf nas.tar.gz

5. 部署函数

通过 fun deploy 部署函数到远端。

$ fun deploy
using region: cn-shanghai
using accountId: ***********4733
using accessKeyId: ***********EUz3
using timeout: 60

Waiting for service poetry to be deployed...
Waiting for function poetry to be deployed...
Waiting for packaging function poetry code...
package function poetry code done
function poetry deploy success
service poetry deploy success

通过 fcli 调用远端函数(也可以通过函数计算控制台调用)

$ fcli function invoke -s poetry -f poetry
换<unk>金龙瑁旒鸯垓疠萏萏瑁蟀瑁鸪雳萏萏萏蟀雳萏雳瑁雳瑁萏瑁瑁瑁鸪鸪蟀蟀蟀鸪蟀蟀萏萏萏蟀瑁萏蓉熳珑蟀熳萏缈皪惮萏萏皪惮皪琶萏萏珑琵疠缈轳寞雨风香。
春山无处处,秋色向江流。
不是东南望,孤山有一情。
春风不可见,一日向江流。
不见无人去,无时见白头。
相思一相见,相见一中风。
何日一相识,何人有此心。
何年不可识,相忆在江山。
一日一秋水,何来一山风。
相逢有何计,不见故人心。
不得何人去,无年不自同。
一来多此路,何处不堪寻。
此日多无事,无时自不知。
何年无此处,不是不相逢。
一日无如远,春风不自归。
何当有君客,不见旧人情。
此去相思处,不堪何处归。
不知青柳外,不得不堪亲。
不见青花去,无人

至此,已经将古诗创作程序成功部署到函数计算了。

更多参考

  1. 21 个项目玩转深度学习——基于TensorFlow 的实践详解
  2. 开发函数计算的正确姿势 —— Fun 自动化 NAS 配置
  3. 开发函数计算的正确姿势 —— 使用 Fun NAS 管理 NAS 资源
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354