好好学习,天天向上.

作者

Jianqin Yin1, Bin Wang2, Xiaoli Liu1, Bin Fang2, Yanchun Wu1, Yanyan Bao2

思路

提取CNN(主要捕获外观特征) , MBH 和 stacked C3D 特征(主要捕获动态特征) ,构造one-vs-rest 线性 SVM ,对结果进行投票

特征提取

  • MBH:运动边界直方图,通过GMM和Fisher Vector 进行编码
  • Stacked C3D:提取时间和空间信息。由数据集Sport-1M 进行训练,通过PCA降维。通过把序列分为3部分mean-pool 获取时间信息。最后对特征堆叠获得stacked 3D
  • CNN(ImageNetShuffle) :从Google inception net提取,在每秒2帧的pool5层提取CNN特征,对帧进行mean-pool,然后使用L1-normalization.

分类

通过one-vs-rest linear SVM分类,weight voting 和 hard voting 做决策
如果3个结果都不同,使用weight voting:通过one-vs-rest linear SVM 学习每个动作的权重,归一所有动作得到每个动作的置信度,最高票动作是最终结果
如果至少2个结果相同,使用one-vs-rest linear SVM 对每类特征学习其置信度

置信度计算公式:
  • cof =1- (1- c1) (1- c2)
  • cof =1- (1- c1) (1- c2) (1- c3)
Read More
post @ 2018-05-10

1. Untrimmed Video Classification

描述

预测未剪辑视频中的活动。未剪辑视频视频可以包含不止一个活动,并包含包含大量活动上下文信息。要求算法可以整体分析一个视频并进行分类。

数据集

ActivityNet Version 1.3 dataset,包含超过648小时的20k视频,平均一个视频1.5个注解。包含200个不同的活动,50%为训练集,25%验证集,25%测试集

评估指标

用 top-1 error (e)评估算法好坏

m个视频,n个标签,p为预测值,g为真实值,计算公式如下:

1
2
3
e = \frac{1}{m} \sum_{i=1}^{m} f(i)

f(i) = \frac{1}{n} \sum_{j=1}^{n} d(p_i, g_{ij})

预测成功时fd = 1

代码在这里:
https://github.com/activitynet/ActivityNet/blob/master/Evaluation/get_classification_performance.py

2. Trimmed Action Recognition

描述

在经过裁剪的视频中进行动作识别,每个视频只有一个单度的动作,动作都持续10秒

数据集

使用 Kinetics 数据集,包含大约300k视频剪辑,400个人类动作,每个视频只有1类,取自不同的YouTube视频,包括人与物的交互以及人与人的交互

评估指标

算法对每个视频预测k个预测标签lj,j = 1,2…k。该视频的真实标签是g,预测成功时d = 1 否则 d=0

1
e = \min_{j} d(l_{j}, g)

代码在这
https://github.com/activitynet/ActivityNet/blob/master/Evaluation/get_kinetics_performance.py

3. Temporal Action Proposals

描述

在未剪辑视频中定位并识别发生了人类活动的短期片段,要计算编码评分是高效的,且可以有效识别时间段。

在许多大规模视频分析场景中,人们有兴趣定位和识别长时间未修剪的视频中短时间间隔内出现的人类活动。目前的行为检测方法仍然很难处理大规模视频集合,并且有效地解决这一任务对于计算机视觉系统仍然很难。这是由于:
(1)当前动作识别方法的计算复杂性;
(2)缺少可以针对每个视频提出更少间隔的方法,使得行为处理仍然集中在大量候选时间片段中。这些候选时间片段被广泛称为行为建议(Action Proposals)。

为了在大规模和实际情况下适用,有用的Action Proposals方法由两个目标驱动:
(1)Proposal方法必须在计算上高效,对时间段进行表示,编码和打分。
(2)Proposal方法必须区分我们感兴趣的活动,以便仅检索包含指示这些活动类别的视觉信息的时间片段。

数据集

ActivityNet Version 1.3 dataset ,该数据集包含超过648个小时的未修剪视频,共约2万个视频。它包含200种不同的日常活动,例如:’walking the dog’, ‘long jump’, and ‘vacuuming floor’等。数据量分布:train(~50%), validation(~25%), test(~25%)。
下载链接

评估指标

此任务使用Average Recall和Average Number of Proposals per Video(AR-AN)曲线作为评估指标。一个proposal为真的条件:该proposal的时间区间和真实值(ground-truth)的区间的tIOU(temporal intersection orver union)大于等于一个阈值(比如:tIOU>0.5
)。AR
被定义为召回值的平均值(满足0.5<tIOU≤0.9
,步长为0.05
)。AN
被定义为proposals总数除以测试子集中的视频数量。当计算 AR−AN
曲线上的值时,我们考虑 AN
集中在1到100(含)之间的值,步长为1。

使用此评估指标评估提交文件的具体过程:

使

1
\frac{\text{total number of proposals in the submission file}}{\text{total number of videos in the testing subset}}

ANmax
表示在评估方法允许每个视频平均proposals数量的最大值。这里,ANmax=100
。让 R=ANmaxANsubmission
,那么我们按照以下方式预处理提交文件:

若 R<1
,那么对于测试子集中的每个视频,我们会根据proposal得分对其proposal进行分类,并丢弃得分最低的 R%
的proposal。
若 R≥1
,那么对于测试子集中的每个视频,我们会根据提案得分对提案进行排序,并复制每个视频中得分最低的 (R−1)%
提案,并将结果数据点添加到 AR−AN
曲线上。然后计算所得到的最终曲线下的面积并将其作为提交文件的度量分数。
过滤后的提交结果文件将有:AN=ANmax
。对于每一个 p
值(从1到100,步长为1),仅仅使用得分前 p%
的proposal计算 AR
,并将结果数据点添加到 AR−AN
曲线上。然后计算所得到的最终曲线下的面积并将其作为提交文件的度量分数。

在验证子集上提供基线proposal方法(称为统一随机)的结果。统一随机(Uniform Random):每个proposal的中心和长度是独立地从间隔内的均匀随机分布 [0,d]
中抽取的,其中 d
为视频长度。这个模型的得分:44.88%

虚线表示在平均超过一个 tIoU
阈值时的召回性能,而实线表示跨所有 tIoU
阈值的平均召回率。可以看出,在 tIoU
比较小时召回性能较高,但在 tIoU
较大时急速下降。因此,对于在评估指标上得分较高的proposal方法,需要重点关注对低和高 tIoU
阈值下都得到相对较高的召回率。

4. Temporal Action Localization

描述

尽管最近在大规模视频分析方面取得了进展,但Temporal Action Localization仍然是计算机视觉中最具挑战性的未解决问题之一。这种搜索问题阻碍了从消费者视频摘要到监控,人群监控和老年护理等各种实际应用。因此,我们致力于推动开发高效,准确的自动化方法,以搜索和检索视频集合中的事件和活动。

这项任务旨在鼓励计算机视觉研究人员设计高性能的行为定位系统。

数据集

此任务采用ActivityNet 1.3版本数据集。该数据集包含超过648个小时的未修剪视频,共约2万个视频。它包含200种不同的日常活动,例如:’walking the dog’, ‘long jump’, and ‘vacuuming floor’等。数据量分布:train(~50%), validation(~25%), test(~25%)。

评估指标

评估服务器使用的评估代码可以在这里
https://github.com/activitynet/ActivityNet/blob/master/Evaluation/get_detection_performance.py。

插值平均精度(Average Precision,AP)作为评估每个行为类别结果的指标。然后,AP
对所有活动类别进行平均,得到 mAP

一个detection为真的条件:该tIOU(temporal intersection orver union)大于等于一个阈值(比如:tIOU>0.5
)。此任务中使用的官方指标是平均mAP,其被定义为所有mAP值的平均值,其中 tIOU
阈值满足:0.5<tIOU≤0.9
,步长为0.05

5. Dense-Captioning Events in Videos

描述

大多数自然视频包含众多活动。例如,在“人弹钢琴”的视频中,视频可能还会包含另一个“人跳舞”或“人群鼓掌”。这项挑战研究密集字幕事件的任务,其中涉及检测和描述视频中的事件。这个挑战使用了ActivityNet Captions数据集,这是一个新的密集字幕事件的大型基准。ActivityNet Captions包含20K个视频,总计849个视频小时,总共有100K个描述,每个视频都有其独特的开始和结束时间。

数据集

ActivityNet Captions数据集将用于此挑战。数据集对视频用一系列时间注释的句子进行描述。每个句子涵盖视频的一个唯一的片段,描述发生的多个事件。这些事件可能会在很长或很短的时间内发生。平均而言,Captivity网络中的每个视频都包含3.65个句子,总共产生了10万个句子。每个视频的句子数量遵循相对正态的分布。而且,随着视频持续时间的增加,句子的数量也增加。每个句子的平均长度为13.48个字,也是正态分布的。

评估指标

评估代码可以在这里:https://github.com/ranjaykrishna/densevid_eval

受密集图像字幕指标的启发,使用类似的指标来衡量模型对定位和字幕事件的联合能力。在前1000个proposal时,评估指标计算 tIOU
在 0.3,0.5,0.7
阈值上的平均准确率(AP)。使用传统评估指标来衡量我们标题的精确度:BLEU,METEOR和CIDDEr。

Read More
post @ 2018-05-01

git(改变指针来管理版本)

基本概念

Working Tree 工作区:本地文件夹
Repository 版本库 :工作区中的隐藏目录.git .git中包含了暂存区(stage或index),分支(master),以及指针head
add 把文件添加进暂存区,commit把repo里的文件提交到当前分区

基本操作

1
2
3
4
5
6
git init 新建本地版本库
git add <filename>把文件添加到repo
git commit -m “XXXXXXX说明”
git status 查看repo状态 (有3种状态)
git diff 查看修改
git diff HEAD —<filename>查看filename在工作区和repo的区别

撤销操作

1
2
3
4
5
6
7
8
git checkout —<filename>丢弃工作区修改
git reset HEAD <filename> 丢弃暂存区修改
撤销本地提交:版本退回

git log 查看历史提交版本
git reset —hard HEAD^ 退回上个版本
git reset —hard XXXXid 前进到新版本
git reflog 记录命令历史

删除操作

1
2
3
4
5
6
工作区文件删除后删除版本库文件
git rm <filename>
git commit -m “delete filename”

工作区文件删除后通过版本库文件进行删除
git checkout — <filename>

远程仓库

1
2
3
git remote  -v查看远程repo版本
git push -u origin master 把本地仓库push到远程仓库上
git clone git@github.com:XXXXXXX/XXXXXXXXXX.git 从远程仓库克隆项目到本地仓库

分支

1
2
3
4
5
6
7
git checkout -b dev 创建dev分支并切换过去
git branch dev 创建dev分支
git checkout dev 切换dev分支
git branch 查看当前分支
git merge dev 合并分支
git branch -d dev删除分支
git log --graph 查看分支合并图
Read More
  • FaaS,serverless分布式事件驱动型计算服务,也称为无服务器计算或功能即服务 Function-as-a-Service
  • 计算单元:不是虚拟机,而是一个封装了待执行代码(事件触发)的函数
  • yaml:”Yet Another Markup Language”(仍是一种置标语言)
  • post与get http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

  • 微服务:一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务。在所有情况下,每个任务代表着一个小的业务能力。

  • 反向代理,用于外部网络访问内部网络时使用,正向代理或包过滤方式用于拒绝其他外部访问方式并提供内部网络对外部网络的访问能力。因此可以结合这些方式提供最佳的安全访问方式。
  • nginx:web服务器
  • Spray:spray is an open-source toolkit for building REST/HTTP-based integration layers on top of Scala and Akka.

  • Akka:Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口

  • rest api :http://blog.csdn.net/px01ih8/article/details/78674685

  • openwhisk:从CouchDB 中的 whisks 数据库装入操作

  • Scala:一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性,Scala 运行在Java虚拟机上,并兼容现有的Java程序。

  • 异步调用模型,其中一旦系统接受调用操作的 HTTP 请求后,该请求即会终止

  • Docker 用于以快速、隔离且受控的方式为我们调用的每个操作设置新的自封装环境(称为容器)。对于每个操作调用,都会衍生一个 Docker 容器,将操作码注入其中

  • Restful:网络上的所有事物都被抽象为资源,每个资源都有一个唯一的资源标识符,同一个资源具有多种表现形式(xml,json等),对资源的各种操作不会改变资源标识符,所有的操作都是无状态的

  • ssl终止:在处理SSL加密/解密的负载均衡器上发生的进程,以便负载均衡器和后端服务器之间的流量处于HTTP中。 后端必须通过限制对负载均衡器的IP的访问来加以保护

  • Ansible是一个简单的自动化运维管理工具

  • Cloud Functions 处理流入系统的事件。

  • 触发器在技术上是指某类事件的名称。每个事件属于恰好一个触发器;若用类比说明,触发器类似于基于主题的发布/预订系统中的主题。规则 T -> A 表示“每当来自触发器 T 的事件到达时,通过触发器有效内容调用操作 A。”

  • 订阅源是全部属于某个触发器 T 的事件的流。订阅源通过订阅源操作进行控制,订阅源操作用于处理组成订阅源的事件流的创建、删除、暂停和恢复。通常,订阅源操作通过使用管理通知的 REST API 来与生成事件的外部服务进行交互。

Read More

1. fission命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function, fn                  Create, update and manage functions

httptrigger, ht, route Manage HTTP triggers (routes) for functions

timetrigger, tt, timer Manage Time triggers (timers) for functions

mqtrigger, mqt, messagequeue Manage message queue triggers for functions

environment, env Manage environments

watch, w Manage watches

package, pkg Manage packages

spec, specs Manage a declarative app specification

upgrade Upgrade tool from fission v0.1

tpr2crd Migrate tool for TPR to CRD

help, h Shows a list of commands or help for one command

2. 使用记录——function

  1. 已有函数hello.js
1
2
3
4
5
6
7

module.exports = async function(context) {
return {
status: 200,
body: "Hello, world!\n"
};
}
  1. 为函数创建route(http请求时用到):
1
fission route create --function hello --url /hello
  1. 创建基于pool executor 的函数
1
fission fn create --name hello --code hello.js --env node --executortype poolmgr
  1. 点击函数的url 获得结果

    1
    2
    curl http://$FISSION_ROUTER/hello
    Hello, world!
  2. 指定函数最大/最小规模

    1
    fission fn create --name hello --code hello.js --env node --minscale 1 --maxscale 5  --executortype newdeploy
  3. 更新函数:

    1
    fission fn update --name hello --code ../hello.js
  4. 测试函数:

    1
    fission fn test --name hello
  5. 函数运行出错,输出:

    1
    Error calling function hello: 500 Internal server error (fission)
  6. 查看函数运行日志:

    1
    fission fn logs --name hello
  7. building function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
sourcepkg/
├── __init__.py
├── build.sh
├── requirements.txt
└── user.py

$ cat user.py
import sys
import yaml

document = """
a: 1
b:
c: 3
d: 4
"""

def main():
return yaml.dump(yaml.load(document))

$ cat requirements.txt
pyyaml

$ cat build.sh
#!/bin/sh
pip3 install -r ${SRC_PKG}/requirements.txt -t ${SRC_PKG} && cp -r ${SRC_PKG} ${DEPLOY_PKG}
$zip -jr demo-src-pkg.zip sourcepkg/
adding: __init__.py (stored 0%)
adding: build.sh (deflated 24%)
adding: requirements.txt (stored 0%)
adding: user.py (deflated 25%)

fission fn create --name hellopy --env python --src demo-src-pkg.zip --entrypoint "user.main" --buildcmd "sh build.sh"


$ fission route create --function hellopy --url /hellopy



fission fn update --name hellopy --env python --src demo-src-pkg.zip --entrypoint "user.main" --buildcmd “sh build.sh”

11.compiled artifacts with Fission

3 使用记录————environment

  1. 准备环境
    1
    fission env create --name node --image fission/node-env:0.4.0 --mincpu 40 --maxcpu 80 --minmemory 64 --maxmemory 128 --poolsize 4

设置环境,语言镜像,环境中支持几个pre-warmed pod

  1. 在启动环境的时候设置builder

    1
    fission env create --name python --image fission/python-env:latest --builder fission/python-builder:latest
  2. 查看env信息

    1
    2
    fission env list
    fission env get --name node

使用记录————Controlling Function Execution

安装go
安装 hey

  1. 用hey

  2. HorizontalPodAutoscaler

4.使用记录————trigger

  1. http trigger:通过http get到一个函数

  2. time trigger:定时执行函数

  3. message queue trigger:基于message queue来执行函数

(NATS and Azure Storage Queue are supported queues.)

5.使用记录————打包

  1. 打包源码

    1
    fission package create --sourcearchive demo-src-pkg.zip --env pythonsrc --buildcmd "./build.sh"
  2. 打包deployment

    1
    fission env create --name pythondeploy --image fission/python-env:latest --builder fission/python-builder:latest --mincpu 40 --maxcpu 80 --minmemory 64 --maxmemory 128 --poolsize 2

6.使用问题记录:

  1. fission host路径问题,创建环境(go,python,js…),创建executors和函数(创建pod),创建trigger(调用函数)因为第二步和第三步存在依赖关系顺序不能反

    1
    2
    3
    fission env create --name nodejs --image fission/node-env:0.6.0
    fission route create --function hello --url /hello
    fission fn create --name hello --code hello.js --env nodejs --executortype poolmgr,
  2. fission创建package的时候有权限问题builder不起来,用sh 不用./ 或者用chmod给文件加权限777

    1
    chmod –R 777 *
  3. 测试时 ,需要把$FISSION_ROUTER换了,用的minikube直接换成它的地址,用的k8s换成外部ip

    1
    2
    curl http://$FISSION_ROUTER/hello 换成
    curl http://35.194.204.59/hello
  4. 按照fission命令删除函数以及删除trigger后,发现相关的pod没有被删除

    1
    fission fn delete --name hellopy
  5. build的路径问题未解决:

    1
    Error starting cmd: exec: "sh build.sh": executable file not found in $PATH
  6. 查看builder日志:

    1
    2
    k -n fission-builder logs -f py3-4214348-59555d9bd8-ks7m4 builder 换成
    kubectl logs python-39799-58b5b4f844-np94r -n fission-builder --container=builder
  7. 创建 fn,env,ht等时,一个属性赋值错误时:依然被创建会存在,但会使用失败

  8. 测试时的hey 和 k:需要安装go ,hey ,HorizontalPodAutoscaler
  9. 创建env时,在这里找镜像:https://docs.fission.io/0.6.0/concepts/environments/
  10. packge创建失败?感觉builder有问题
    1
    Build timeout due to environment builder not ready
Read More

实现层面

fission运行流程

image

  1. controller:对外提供api,通过fission CLI 控制内部组件
  2. router:用户发送http请求请求服务(调用函数)。收到请求,查看缓存(fiction与podurl间的映射)。对于调用过function,router会很快的拿到返回值;没调用过,向 poolmgr 请求一个新的实例。poolmgr 有一个空闲 pods 池,它会选择一个 pod,将函数加载进去(将请求发送到 pod 的容器中),并将 pod 地址返回给 router。
  3. 创建环境:对于用户创建的environment,poolmgr中有循环的线程自动在kubernetes中根据env的镜像创建包含三副本pod的deployment,每个pod中有两个container,一个使用env的镜像创建,另一个是fission中的辅助container,镜像是fission/fetcher。两个container共享一个volume。因为env是定义基础镜像,而一个env可能会关联许多function,所以需要fetcher根据具体的function在通用的container里运行不同的code。
  4. poolmgr还会定期清理“不活跃”的deployment,如env。还会定期删除不活跃的pod,让kubernetes自动创建新的、干净的pod供其他function使用。poolmgr提供的API只有两个,一个是根据function获取对应的service url,另一个是类似心跳API帮助维护缓存。因为router里也维护有function到service url的缓存,所以当function被调用时,router会通知poolmgr更新一下对应service对象的时间,避免被误删。

openwhisk运行流程

image

  1. nginx:处理用户发送(如调用函数操作等)将其转发(以及ssl终止)。
  2. contraller:是用户可执行操作( CRUD请求以及操作调用)的接口。
  3. CouchDB:存储操作(whisk数据库),身份验证(subjects数据库)。
  4. consul:服务发现组件,持续检查系统中可用执行者的运行状态来监视invoker,告诉contraller哪些invoker可用
  5. kafka:contraller和invoker只通过由 Kafka 缓冲和持久存储的消息进行通信。缓冲,减轻内存负担。确保消息不会在系统崩溃时丢失。
  6. invoker:启动Docker执行操作。对于每个操作调用,衍生一个 Docker 容器,将操作码注入。使用传递给代码的参数来执行代码,获取结果,然后销毁该容器
  7. 储存结果:存储在CouchDB终端 whisks 数据库中作为 ActivationId 下的激活

开发语言

fission
  • Go语言
openwhisk
  • scala语言

组件

fission
  • controller
  • router
  • executor
  • kubeWatcher
  • timer
  • MessageQueueMgr
  • storageSvc
  • builderMgr
openwhisk
  • nginx
  • contraller
  • CouchDB
  • consul
  • kafka
  • invoker

功能层面

组件

控制器

fission
  • controller,是fission对外提供管理API的组件。所有其他组件通过关注 controller 来更新负责追踪函数、HTTP 路由、事件触发器和环境镜像
openwhisk
  • contraller:是用户可执行操作(如CRUD请求以及操作调用)的接口。
  • consul:服务发现组件,持续检查系统中可用执行者的运行状态来监视invoker,告诉contraller哪些invoker可用
  • kafka:一种高吞吐量、分布式的发布/预订消息传递系统。contraller和invoker只通过由 Kafka 缓冲和持久存储的消息进行通信。可以减轻在内存中进行缓冲的负担并降低伴随的 OutOfMemoryException 风险,确保消息不会在系统崩溃时丢失。使用异步调用模型

请求响应

fission
  • router:收到请求,查看缓存(fiction与podurl间的映射)。对于调用过function,router会很快的拿到返回值;没调用过,向 poolmgr 请求一个新的实例。poolmgr 有一个空闲 pods 池,它会选择一个 pod,将函数加载进去(将请求发送到 pod 的容器中),并将 pod 地址返回给 router。

    openwhisk
  • API网关

服务发现组件

fission
  • router,与controller和poolmgr打交道,会监听 controller 中triggers的更新,动态的更新web service的route定义。
  • poolmgr 负责管理空闲的环境容器池、将函数加载到这些容器当中、以及杀死空闲的函数实例。
openwhisk
  • consul:服务发现组件,持续检查系统中可用执行者的运行状态来监视invoker,告诉contraller哪些invoker可用

触发器

fission
  • Http Trigger
  • Time Trigger
  • MQ Trigger
openwhisk
  • invoker:启动Docker执行操作,对于每个操作调用,都会衍生一个 Docker 容器,将操作码注入。使用传递给代码的参数来执行代码,获取结果,然后销毁该容器

  • cloudant

  • custom trigger
  • github
  • messahub
  • moblie push
  • priodic

数据存储

fission
  • etcd
openwhisk
  • CouchDB

函数

语言支持

fission
  • Binary
  • Go
  • .NET
  • .NET 2.0
  • NodeJS (Alpine)
  • NodeJS (Debian)
  • Perl
  • PHP 7
  • Python 3
  • Ruby
openwhisk
  • JavaScript
  • Python
  • Swift
  • PhP
  • Docker

函数上传支持

fission
  • 环境支持的语言
  • 任何兼容二进制的可执行文件和脚本
openwhisk
  • 环境支持的语言
  • Java 方法
  • 任何兼容二进制的可执行文件,包括打包为 Docker 容器的 Go 程序和定制可执行文件
源码形式
云端编译环境

####### 内容

####### 指令

二进制形式
本地编译环境要求

开发方式

fission
  • CLI
openwhisk
  • 浏览器开发
  • Cloud Functions CLI

启动方式

fission
  • 冷启动
openwhisk

函数操作

fission
  • 通过kubectl对pod进行操作
openwhisk
  • contraller:是用户可执行操作(如CRUD请求以及操作调用)的接口。
打包上传
调用方式
fission
  • 触发器关联
openwhisk
  • 触发器关联
  • Cloud Functions API
  • Cloud Functions CLI
  • iOS移动SDK
执行时间上限

运行环境

fission
  • k8s的pod
openwhisk
  • docker
运行环境的启动
fission
  • Pool-based executor(poolmgr):
  • New-deployment executor(newdeploy):创建一个Kubernetes部署、Service和HorizontalPodAutoscaler
openwhisk
运行环境的回收
fission
  • poolmgr定期清理“不活跃”的deployment,定期删除不活跃的pod,让kubernetes自动创建新的、干净的pod供其他function使用。(如何定期待查)
openwhisk

结果返回

fission
  • 直接返回
openwhisk
  • 储存在CouchDB的输出中

使用

事件

fission
openwhisk
  • package
  • 包含操作和订阅源
  • 绑定到包指定缺省参数

身份认证

fission
openwhisk
  • CouchDB:在whisk数据库中存储操作,subjects数据库用于身份验证与授权操作并装入操作

订阅源支持

全部属于某个触发器 T 的事件的流

fission
  • workflow?
openwhisk

发布自己的订阅源使用,创建订阅源体系结构:

  • Hook
  • 轮询
  • 连接

自动伸缩

fission
  • 自动伸缩
openwhisk

图形仪表盘

fission

不支持

openwhisk
  • 存在。用于监视活动摘要,活动日志,时间线以及过滤选项

项目发展现况

社区发展

fission
  • 3.2k star
openwhisk
  • 3k star

使用者

fission
  • Autodesk
  • cielo24
openwhisk

支持厂商

fission
  • Platform9
openwhisk
  • Apache/IBM

底层基础设施对接层面

组建部署方式

fission
  • 通过helm部署在kubernetes上
openwhisk
  • 通过 Ansible部署在docker中

function部署方式

fission
  • 以pod形式运行在kubernetes中
openwhisk
  • 运行在docker中

参考:

Read More
post @ 2018-04-10

上个月申请了sel实验室,来到公司。和丁博士沟通了一下,确定方向是边缘计算中的faas,给我布置了下任务,用一周的时间把fission跑起来,熟悉fission的用法,并比较fission和openwhisk。

fission是跑在k8s上的服务,因此要先申请几个公司的虚拟机做集群,在虚拟机上安装k8s,再安装k8s上的包管理工具helm,最后装fission。安装k8s比较麻烦,丁博士让我不懂就问一个前辈,前辈装过minikube,所以让我从minikube开始。
对docker完全真空的我感觉有点懵逼,不过感觉很激动。。就开始啦。

参考 fission官网安装文档

0. 科学上网

科学上网太重要了。这14天学到各种姿势:

  1. 本地设置http代理在浏览器翻

  2. shadowsocks : 转化socks5协议,可以设置pac自动模式访问墙内网站不走代理。

  3. shadowsocks + privoxy:终端翻,每次运行下面的脚本

1
2
3
4
5
6
7
8

sudo /usr/local/sbin/privoxy /usr/local/etc/privoxy/config

export http_proxy='http://localhost:8118'

export https_proxy='http://localhost:8118'

curl www.google.com
  1. ss + privoxy + proxifier :配置所有应用的流量走ss,可以直接docker pull 墙外镜像

  2. ssh到虚拟机(比如k8s)一直没实现有些遗憾不然又能跳过一堆坑

1. 安装minikube

minikubi是只有一个节点的,可以看成是单机版的k8s,用来编排docker(类似虚拟机,感觉像是运行在镜像上的进程)的工具,可以在minikube上面运行各种跑在docker上的服务(比如fission)。

每一个服务有一个namespace用于防止服务间命名冲突,服务由各种deployment组成,deployment负责启动相关pod,pod可以看成包含很多豆子(docker/image)的豆荚,里面的豆子包括跑着服务的组件和fission里起来的函数。

通过命令行kubectl可以对相关deployment,pod,namespace进行操作如查看或删除等。之后安装fission会经常有pod没起来,用kubectl查看或删除fission重新安装。常用命令有:

1
2
3
4
5
6
7
8
9
kubectl get svc --all-namespaces 查看所有服务
kubectl get pods --all-namespaces 查看所有pod
kubectl get ns --all-namespaces 查看所有命名空间
kubectl get secrets --all-namespaces 查看所有secret
kubectl get deployment --all-namespaces 查看deployment
kubectl describe kube-dns-1326421443-19zxq 查看某一pod
kubectl describe pod python-39799-58b5b4f844-zwlc6 -n fission-builder命名空间下查看pod
kubectl describe pods kube-dns-1326421443-19zxq -n kube-system
kubectl logs python-39799-58b5b4f844-zwlc6 -n fission-builder —container=builder 查看pod 的logs

安装minikube,就是安装一个linux,并在上面安装minikube的相关组件,当所有pod跑起来之后就可以了。
参考了其他博客,感觉写的很好,按照博客安装的。
https://blog.csdn.net/aixiaoyang168/article/details/78331847?locationNum=6&fps=1

因为minikube在墙内,安装所需的gcr镜像没有拉下来,通过阿里的镜像库和公司的私有库把镜像docker pull下来传到本机,在本地虚拟机加绝对路径直接docker load进来(感觉非常神奇,不知道本机和本机虚拟机怎么交流的)

或者 1. 安装k8s

申请三台虚拟机(4c8g50g)。
参考观云台部署文档+脚本一键部署k8s,很快就装好了。
然后把k8s的~/.kube/admin.conf传入本机/etc/kubernetes中,让本机连上集群。

坑如下:

  1. 部署时默认部署单节点集群,还有高可用集群可选(安装时加参数HA)。单节点集群只有一个master不是只有一个节点,高可用集群有多个master。按默认即可差点装错。
  2. k8s虚拟机里的DNS服务器能ping通,但是ping其他的网站ping不通。因为公司虚拟机的dns服务器是自己搭建的,什么都解析不了。所以无法用docker pull(因为docker官网都不知道是什么)需要自己添加dns服务器

    1
    2
    3
    vim /etc/resolv.conf
    nameserver 8.8.8.8
    /etc/init.d/network restart
  3. 添加了dns服务器好像也不能解析个别地址,比如helm里阿里的repo,所以还要自己添加地址。

    1
    2
    vim /etc/hosts
    116.62.99.172 https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com

再或者 1. 申请谷歌云

在谷歌云上建k8s集群。终端连到谷歌云的集群上。
完全无坑,如果只玩fission的话强烈安利,不用拉镜像换repo也没有各种诡异的问题(处理安装helm时多了一步,见安装helm)。但是自己用着玩可以,不能移植到边缘设备如网关,长远看做不成边缘计算的项目。

1
2
启动集群:gcloud container clusters create example-cluster  
关闭集群:gcloud container clusters delete example-cluster

2. 安装helm

helm是k8s上的包管理工具,可以方便的从repo源(相当于yum源)中的chart(相当于rpm包)安装在k8s。分客户端helm和服务端tiller,分别部署在本地和k8s内部上(也可以客户端也部署在k8s中),版本号要一致。客户端直接下载到本地,服务端通过helm init 自动安装到本机连接的k8s集群中。

1
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.8.7 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

安装参考博客:https://blog.csdn.net/weiguang1017/article/details/78045013

需要注意的有:

  1. 安装helm服务端是依然有个拉不下来的gcr镜像tiller。要么拉下来,要么在helm init时直接指定阿里的镜像进行替换。
  2. helm是从repo上给k8s安装服务,但那个repo也被墙了,helm init时也要指定阿里的repo替换默认repo
  3. 通过谷歌云安装helm时要先

    1
    2
    3
    kubectl create serviceaccount --namespace kube-system tiller
    kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
  4. (隐秘的坑,如果被替换的repo地址无法被k8s的dns服务器解析,白替换了)

3. 安装fission

安装文档上的一行代码往往运行不了的,看起来就是helm从github上直接直接把fission部署在集群上,但总会出现各种诡异的错误,一开始感觉是完全凭运气安装的,后来发现报错基本可以分成4类:无法下载、什么什么已存在、超时、编译出错
解决是这样的

  1. 把项目直接下载到本地,url变为本地绝对路径(虽然我一直感觉这个问题很奇怪,项目很小又不用翻墙为什么有时候会下不下来)
  2. 上次安装到一半出错了,这次安装就会报错,要把所有上次的东西删干净,再新建一个ns fission,最好写个shell,每次直接执行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
    kubectl delete clusterrolebindings fission-builder-crd

    kubectl delete clusterrolebindings fission-fetcher-crd

    kubectl delete clusterrolebindings fission-crd

    kubectl delete ns fission-function

    kubectl delete ns fission-builder

    kubectl delete ns fission

    kubectl delete secrets influxdb -n fission
  3. 这个错误只在通过公司脚本安装的k8s上遇到了,因为部署fission需要的镜像没拉下来,应该是k8s拉镜像有问题。于是需要镜像较少的精简版fission-core。
    先通过fission的源码查到需要镜像 fission/fission-bundle:0.6.0 和 fission/fluentd:0.6.0。拖进去发现还是不行,在谷歌云集群安装了一次fission-core发现上面还跑了一个镜像fission/alpinecurl,load进来把fission跑起来了。记得3个节点都要load,因为fission不一定在哪个节点跑着。

1
2
3
4
5
6
7
8
传镜像的代码
docker save id(XXX) > XXXXXX.tar
scp XXXXXX.tar root@XX.XX.XX.XX:/images
docker load XXXXXX.tar
docker images | grep XXX
docker images | more
docker tag id(XXX) 原名
docker save id(XXX) > XXXXXX.tar
  1. 安装fission-core有个奇怪的错误,如下,结果是fission源码错误
    1
    release harping-dragonfly failed: Deployment.apps "router" is invalid: [spec.template.spec.containers[0].livenessProbe.httpGet.port: Invalid value: "8888": must contain at least one letter or number (a-z, 0-9), spec.template.spec.containers[0].readinessProbe.httpGet.port: Invalid value: "8888": must contain at least one letter or number (a-z, 0-9)]。

。。感觉还是靠运气的。

4. 安装fission ctl

按文档安装没错的

5. fission使用

  1. 路径问题:触发函数时curl,FISSION_ROUTER 要换掉,若是minikube安装,直接换成minikube虚拟机地址;若是k8s安装,换成外部ip

    1
    curl http://$FISSION_ROUTER/hello 变成 curl http://35.194.204.59/hello
  2. 顺序问题:下面的每一步之间有依赖关系,顺序不能颠倒:
    创建环境(go,python,js…),创建executors和函数(创建pod),创建trigger(调用函数)

    1
    2
    3
    fission env create --name nodejs --image fission/node-env:0.6.0
    fission fn create --name hello --code hello.js --env nodejs --executortype poolmgr
    fission route create --function hello --url /hello
  3. package打包上传问题:

报错:Build timeout due to environment builder not ready ,builder组件有问题

更多关于fission的问题在后面写

参考

https://docs.fission.io/0.6.0/installation/installation
http://www.jdon.com/48109
https://www.jianshu.com/p/51a19ef5f8cf
https://www.cnblogs.com/Leo_wl/p/6055252.html
https://www.kubernetes.org.cn/3096.html
https://www.kubernetes.org.cn/3280.html
http://www.dockone.io/article/932
http://blog.csdn.net/moshenglv/article/details/55806421
http://blog.csdn.net/aixiaoyang168/article/details/78331847?locationNum=6&fps=1
https://blog.csdn.net/weiguang1017/article/details/78045013

感谢刘吉安学长虽然不在边缘计算组还每天教我填坑到晚上11点,丁博士教我k8s相关和fission源码分析,崔前辈和高前辈带我入门,没嫌弃我各种弱智的问题。

Read More
⬆︎TOP