本文说明了如何基于docker image, 给openwhisk action创建更复杂的runtime 环境。并描述了其步骤和一些注意事项, 以及现有的一些限制。

1 创建和调用 Docker actions

Openwhisk支持创建基于自定义的Docker image来作为Action的runtime, 利用这个特性我们就可以创建自己的docker image runtime来支持tensorflow相关的action的运行。自定义的image runtime可以是把源代码打包进去, 也可以在初始化时平台自动注入代码。使用自定义的运行时环境, 是针对需要较大的外部依赖的项目的标准解决方案, 例如tensorflow运行时或其它机器学习环境的支持。 (这也部分时因为action size在48M以内的限制)。

1.1 例子
OpenWhisk CLI 有一个 --docker 的选项来配置自定义的Docker运行时环境。语法如下:

wsk action create <ACTION_NAME> --docker <IMAGE> source.js

ps : 必须是在 Docker Hub. 上的一个公开镜像.
–docker 也可以不添加额外的代码来生成action, 例如:

wsk action create <ACTION_NAME> --docker <IMAGE>

在这种场景中,action的源代码可以在openwhisk冷启动运行时环境时注入。 容器运行时环境会直接处理平台的调用请求。

1.2 限制说明
自定义的镜像运行时必须实现 Action interface. 这是根据 交互协议 来传递调用请求到运行时环境。容器用暴露HTTP服务(8080)的方式, 分 /init 和 /run 两段运行。
自定义的容器运行时环境必须在 Docker Hub上可用。Docker Hub 目前时唯一支持的 registry。这意味着所有的openwhisk自定义docker运行时环境必须是公开的。
自定义的镜像运行时环境第一次运行时会从Docker Hub拉取到本地平台。这会导致第一次冷启动调用时耗时比较长。但拉下来以后就会在本地有缓存了。

1.3 镜像更新逻辑
自定义的runtime用tag来标记版本。当一个docker image的tag是“latest”(或者不带tag)时, 从自定义镜像创建一个新的runtime, 总是会registry去检查一下有没有最新版本。由于拉取一个image可能因为网络不稳定或者Docker Hub挂掉而不成功, 所以最好不要这么做, 而是精确指定的tag版本。这样本地系统会直接使用本地缓存, 加快了速度和稳定性。
所以latest标签最好只用在做快速原型时使用, 这时候获取最新代码比运行时稳定性更重要, 其它情况都使用确定版本。

1.4 已有镜像
openwhisk在Docker bub上发布了其所有运行时镜像 。很容易从这些镜像开始扩展,再加入其它的依赖包和外部依赖。从而生成新docker image runtime。以下是一些常用的镜像:
openwhisk/action-nodejs-v10 - Node.js 10 (Source)
openwhisk/python3action - Python 3 (Source)
openwhisk/java8action - Java 8 (Source)
openwhisk/action-swift-v4.2 - Swift 4.2 (Source)
openwhisk/action-php-v7.3 - PHP 7.3 (Source)
openwhisk/action-ruby-v2.5 - Ruby 2.5 (Source)

**

2 扩展已有的镜像

如果你想在action中使用外部依赖, 而外部依赖又因为action的大小限制不能被部署, 这时可以考虑扩展一个新的镜像运行时来解决这个问题。一般从一个已存在的语言运行时镜像(这样容器会已经被配置好能接收平台关于这个语言的调用请求)开始, 再安装扩展包和其它依赖包就好了。
以下是一些例子, 包括Nodejs和Python的自定义运行时:
2.1 Node.js的例子
Tensorflow.js 是一个 JavaScript 实现的 TensorFlow。它包括了一个 Node.js 后端驱动 来在Node.js运行环境上使用CPU或者GPU设备。
Node.js的tensorflow的核心依赖和CPU驱动(tfjs和tfjs-node)都可以NPM来安装, 然而由于openwhisk action大小的限制, 我们不能直接通过zip包来部署tfjs和tfjs-node到oopenwhisk的Node.js runtime上(单单是tfjs-node包就已经超过了170MB)。我们要创建一个直接包含tfjs和tfjs-node的Node.js runtime来支持action的运行。我们可以通过扩展标准Node.js runtime image 并运行 npm install 来把这些依赖预安装到自定义的runtime image上。
步骤如下:
创建 Dockerfile

FROM openwhisk/action-nodejs-v10:latestRUN npm install @tensorflow/tfjs-node

打包镜像

docker build -t action-nodejs-v10:tf-js .

加上tag

docker tag action-nodejs-v10:tf-js <USER_NAME>/action-nodejs-v10:tf-js

推送到 Docker Hub

docker push <USER_NAME>/action-nodejs-v10:tf-js

创建action

const tf = require('@tensorflow/tfjs-node')const main = () => {return { tf: tf.version }
}
wsk action create tfjs --docker <USER_NAME>/action-nodejs-v10:tf-js action.js

测试调用并返回TensorFlow.js依赖的版本号

wsk action invoke tfjs --result
{"tf": {"tfjs": "1.0.4","tfjs-converter": "1.0.4","tfjs-core": "1.0.4","tfjs-data": "1.0.4","tfjs-layers": "1.0.4","tfjs-node": "1.0.3"}
}

2.2 Python的例子
由于类似很多 numpy 这样的好用的包存在, python已经成为机器学习领域最流行的语言。openwhisk上也支持了python。Python的依赖同样可以通过部署zip包的方式来安装到openwhisk上(方法), 然而超过48MB的action就不能这么干了。我们同样可以通过扩展 Python runtime image并运行 pip install安装依赖包来创建新的运行时镜像。
步骤如下:
创建 Dockerfile

FROM openwhisk/python3action:latestRUN apk add --update py-pip
RUN pip install numpy

打包镜像

docker build -t python3action:ml-libs .

加上tag

docker tag python3action:ml-libs <USER_NAME>/python3action:ml-libs

推送到Docker Hub

docker push <USER_NAME>/python3action:ml-libs

创建action

import numpydef main(params):return {"numpy": numpy.__version__}
wsk action create ml-libs --docker <USER_NAME>/python3action:ml-libs action.py

测试调用并返回numpy的版本号

wsk action invoke ml-libs --result
{"numpy": "1.16.2"
}

以上就是创建自定义的docker image作为action的runtime的例子。

Openwhisk之 -- 创建基于Docker的Action相关推荐

  1. 体验灵雀云-创建基于Docker的云服务

    今天体验了一下灵雀云,创建了第一个基于Docker的云服务. 1.登录灵雀云 2.开始使用 登录之后,从"控制台"进入操作界面,开始创建服务. 首先需要选择一个镜像.灵雀云已经为您 ...

  2. docker镜像了解(建立私有仓库,基于已有镜像创建,Docker的数据管理) 基于Dockerfile创建,基于本地模板创建,端口映射,容器互联)

    文章目录 docker镜像 制作镜像的过程 基于已有镜像创建 基于本地模板创建 基于Dockerfile创建 Dockerfile操作指令 Docker的数据管理 数据卷 docker的网络通信 容器 ...

  3. 镜像底层原理详解和基于Docker file创建镜像

    目录 一.镜像底层原理 1.联合文件系统(UnionFS) 2.镜像加载原理 3.为什么Docker里的centos的大小才200M? 二.Dockerfile 1.简介 2.Dockerfile操作 ...

  4. 阿里云高性能AI服务 -- 基于Docker和EGS一键创建高性能Tensorflow分布式训练

    一. 概述 Tensorflow是目前使用最为广泛的深度学习框架之一,但是目前搭建分布式多机多卡训练比较困难,而且Tensorflow原生的分布式的性能很差,特别在云计算虚拟化环境下并行的挑战更大. ...

  5. 阿里云深度学习实验室(DL-Lab) -- 基于Docker和EGS一键创建高性能Tensorflow分布式训练

    原文链接:点击打开链接 摘要: ## 一. 概述 Tensorflow是目前使用最为广泛的深度学习框架之一,但是目前搭建分布式多机多卡训练比较困难,而且Tensorflow原生的分布式的性能很差. 为 ...

  6. 个推基于Docker和Kubernetes的微服务实践

    2019独角兽企业重金招聘Python工程师标准>>> 2016年伊始Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.DevO ...

  7. QCon技术干货:个推基于Docker和Kubernetes的微服务实践

    2019独角兽企业重金招聘Python工程师标准>>> 2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.Dev ...

  8. php solr docker搭建,深入浅出Docker技术- 基于Docker Solr集群的搭建

    Posted on 6月 2, 2018 深入浅出Docker技术- 基于Docker Solr集群的搭建 SolrCloud是基于Solr和Zookeeper的分布式搜索方案,是正在开发中的Solr ...

  9. 《Kubernetes部署篇:基于docker使用kubespray工具离线部署高可用K8S集群(国内专网方案)》

    文章目录 一.部署背景简介 二.部署工具介绍 三.部署方案介绍 四.部署环境信息 五.部署资源下载 六.部署准备工作 6.1.系统内核升级 6.2.设置主机名 6.3.环境初始化 6.4.ssh多机互 ...

最新文章

  1. 职业经理十项管理技能必修课
  2. HALCON示例程序resistor.hdev通过不同焦距图像提取深度信息
  3. vue 函数 路由跳转_vue路由跳转的方式
  4. registerClassAlias()函数和getClassByAlias()函数
  5. tcp压力测试工具_DNS压力测试工具之——DNSperf
  6. python2项目出现的错误(UnicodeDecodeError)
  7. 第4章 同步控制 Synchronization ----同步机制的摘要
  8. 计算机组成原理考研笔记
  9. 五笔字根表识别码图_怎么学五笔 五笔字根表键盘图 【详细介绍】
  10. 关于 idea 快捷键 alt + f7 无法使用的一些尝试
  11. Springer LNCS Latex 模板 无法下载
  12. Axure交互式设计
  13. 自然语言生成技术现状调查:核心任务、应用和评估(2)
  14. 在cygwin安装HOMER和最全使用说明
  15. 学习ios Metal(3)—宽度可调的线条的绘制
  16. 【综述】3D智能数字化与3D打印:中国制造向中国智造转变的机遇
  17. 【中医学】7 预防·治则·治法
  18. IPC和RPC的区别
  19. 利用GSEA对基因表达数据做富集分析
  20. CFA三级考试内容你了解吗?

热门文章

  1. 不用向日葵 teamview 利用云服务器部署FRP穿透内网实现控制远程桌面
  2. 智能手表FCC CE最新法规简述
  3. 谷歌创始人退位!印度籍 CEO 这是要“接管”美国科技圈?
  4. java中子类会继承父类的构造方法吗
  5. 理论力学静力学与运动学补充(二):点的复合运动
  6. 黑马旅游网学习笔记之分页展示(六)
  7. Userspace RCU原理
  8. C语言书写推箱子(坤坤版easyx库)
  9. 大数据方向学习方向和目标
  10. 移动端字体大小单位rem