实时数据流上的机器学习——Tensorflow on Flink

2020-07-03 00:00:00 模型 更新 文件 机器 利用

所有代码开源在:

TsingJyujing/tf.js-on-flinkgithub.com

前言

2019年伊始的时候,给自己定下了一个小目标,不用JNI把TensorFlow撸上Flink做实时的预测。把去年放出去的狠话收个尾。

之所以定这个目标,主要是因为在机器学习+流计算的场景有两大诉求:

  1. 如何给流计算赋能机器学习,做一些在线的预测(不是训练)?
  2. 要是能直接利用训练好的Keras或者Tensorflow模型就更好了嘿嘿嘿……
  3. 如何方便的部署?


目前大多的方案还是Flask或者Django写一个Http接口,利用 TensorFlow 原生的 Python API + 某个 Http/RPC Server 作为机器学习中心,然后在流计算中无状态的调用这些接口。

这样做的好处是可以无缝衔接研究者训练好的模型,毕竟大部分的机器学习框架都是Python友好的。但是缺点也很明显: - 网络IO消耗较大 - 为了适配接口编写代码复杂 - 流计算和机器学习服务集群压力不匹配,单方面处理速度过快导致机器学习服务器侧压力太大但是不能背压 - ……

为了解决这样的问题,我们需要把 Tensorflow 直接嵌入到 JVM 中去,这样的话有好几个方案:

  1. 利用原生的 Tensorflow Java API
  2. 把 Python 解释器嵌入JVM
  3. 利用 JNI,调用 C++ API,完成预测(某种程度和1有点像)
  4. 利用 JavaScript Engine 运行 Tensorflow.js


本文终用的是方案4。

先说说几个方案的问题: 1. Java API 官方不保证不稳定是大的坑,其次部署麻烦,有些glibc不能升级的场景很难部署,更新也很麻烦。 2. 没有找到较好的 Python 解释器的Java库,Jython不能用的,详细原因过长不解释。 3. 依然是glibc等基础库的坑,而且还有在运行中模型不易更新等问题。 4. 也是有坑的,我这一套工具用起来并不是很方便,模型编译出来较大,如果设置不恰当,因为V8引擎的特性,不易使用多核(其实是可以滴)

后我们的V8依旧是用JNI上的,但是这个库对其他依赖的要求要小很多,基本可以做到是个64位的Linux就可以上(J2V8也支持Windows/Mac/Linux x86/Android等等,但是需要修改POM重新编译)。

Talk is Cheap

1. 用Keras构建一个模型

我这里利用Wine数据集构建了一个简单的模型,详情参见:

TsingJyujing/tf.js-on-flinkgithub.com

这只是一个用于演示的测试模型。

2. 将模型编译为js文件

首先找个网站(自己本机搭建也可以),把你的模型放上去,确保通过http可以访问,像这样:

Index of /tof/models/wine/v1.0.0/fileserver.shinonomelab.com

相关文章