能随意移植的深度学习服务

辛辛苦苦做了模型,采样、调参、讨论、写文档.....模型终于要上线了~什么?

Version `GLIBC_x.xx` not found

无法服务!!! 还能再爱吗?

痛在哪

  1. 生产环境机器老,gcc老,glibc也老,基本都在2.12以下
  2. 服务还是要用java或者c++,python服务靠不住,运算效率至少差了10倍
  3. 速度要快,操作要简单,还必须稳定,数据量一大就崩肯定不行

怎么办

这里列一下真正可移植的服务方案

  1. 实现前向传播算法,c++和java都有矩阵运算包,如果模型不复杂,这个可以说是最轻量的
  2. 借助java框架dl4j进行训练然后服务,jvm可移植性不是盖的
  3. 静态编译glibc之后,用c++的tensorflow或者tiny-dnn进行训练然后服务
  4. 通过keras实现各个框架之间的模型转换,tensorflow、dl4j各种切换,用最合适的框架训练、服务
  5. 借助hive streaming实现tensorflow的离线服务,数据量大也不怕
  6. 使用docker搭建专门的环境,用tensorflow、tiny-dnn服务也不需要静态编译glibc了

这几种方案我后续博客会跟进,敬请期待

可是我就是想用python,想用tensorflow训练模型,想看tensorboard,而且还不想用keras搞来搞去
这就是本文的中心思想

java直接读取tensorflow模型

方案优点

  1. 速度快,和本地跑差不多
  2. 如果写到hive的udf里面,还能借助分布式的优点,跑大数据量也不怕

有人肯定会说,tensorflow不是有java接口吗?
不好意思,这所谓的java接口,有部分是jni实现,也就是还是c++的,要调用本地的动态链接库,服务的时候,或者写成hive udf的时候,Version `GLIBC_x.xx` not found 教你做人

实际代码

maven依赖


    org.nd4j
    nd4j-native-platform
    1.0.0-beta2

nd4j调用pb模型

读取模型

private SameDiff graph = TFGraphMapper.getInstance().importGraph(new File(pbModelPath));

获取tensor

//根据tensor_name获取计算图定义的输入输出的tensor
SDVariable inTensor = graph.getVariable("input");
SDVariable outTensor = graph.getVariable("prediction");

往tensor里面写值

//feature是向量化的结果 类型是 float[]
inTensor.setArray(Nd4j.create(feature).reshape(-1, 1));

拿到输出值

//eval()之后得到nd4j定义的数组,如果是softmax会有多个值,如果是logit,则如下取出输出概率
float output = outTensor.eval().getFloat(0);

就是这么简单,一切本该如此简单

如果只是单线程调用,这样用就可以了,如果想要做到并发,就要做一下额外的处理
需要代码的话请参看我的github写的一个示例udf 并发调用tensorflow模型之 hive UDF 示例

略有缺点

  1. 不支持batch_normalization

目前nd4j读取tensorflow的话,如果tf中有用到batch_normalization,因为预测的时候不能去更新moving_variance和moving_mean,需要区分训练、预测,因此tf的bn接口需要输入training=False 这可以通过传入bool类型的placeholder来解决,不过nd4j的tf接口暂时不支持bool值以及bool运算。。。所以,还是暂时别用batch_normalization,后续有新的解决方案会第一时间更新

  1. 打出来的包比较大,毕竟是platform方法,包含了各种cpu的支持,自然比较大,有280m以上
    如果对jar包大小有要求 改用如下依赖,然后在linux上 用mvn打包 这样生成的包在50m以内,因为只针对linux的cpu,自然是小了很多

    org.nd4j
    nd4j-native
    1.0.0-beta2

祝你成为一个快乐的tf boy >_<
欢迎关注我的个人主页 https://duanyy.xyz

参考链接

[1]官网github上的例子
[2]并发调用tensorflow模型之 hive UDF 示例

你可能感兴趣的:(能随意移植的深度学习服务)