辛辛苦苦做了模型,采样、调参、讨论、写文档.....模型终于要上线了~什么?
Version `GLIBC_x.xx` not found
无法服务!!! 还能再爱吗?
痛在哪
- 生产环境机器老,gcc老,glibc也老,基本都在2.12以下
- 服务还是要用java或者c++,python服务靠不住,运算效率至少差了10倍
- 速度要快,操作要简单,还必须稳定,数据量一大就崩肯定不行
怎么办
这里列一下真正可移植的服务方案
- 实现前向传播算法,c++和java都有矩阵运算包,如果模型不复杂,这个可以说是最轻量的
- 借助java框架dl4j进行训练然后服务,jvm可移植性不是盖的
- 静态编译glibc之后,用c++的tensorflow或者tiny-dnn进行训练然后服务
- 通过keras实现各个框架之间的模型转换,tensorflow、dl4j各种切换,用最合适的框架训练、服务
- 借助hive streaming实现tensorflow的离线服务,数据量大也不怕
- 使用docker搭建专门的环境,用tensorflow、tiny-dnn服务也不需要静态编译glibc了
这几种方案我后续博客会跟进,敬请期待
可是我就是想用python,想用tensorflow训练模型,想看tensorboard,而且还不想用keras搞来搞去
这就是本文的中心思想
java直接读取tensorflow模型
方案优点
- 速度快,和本地跑差不多
- 如果写到hive的udf里面,还能借助分布式的优点,跑大数据量也不怕
有人肯定会说,tensorflow不是有java接口吗?
不好意思,这所谓的java接口,有部分是jni实现,也就是还是c++的,要调用本地的动态链接库,服务的时候,或者写成hive udf的时候,Version `GLIBC_x.xx` not found 教你做人
实际代码
maven依赖
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native-platform</artifactId>
<version>1.0.0-beta2</version>
</dependency>
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 示例
略有缺点
- 不支持batch_normalization
目前nd4j读取tensorflow的话,如果tf中有用到batch_normalization,因为预测的时候不能去更新moving_variance和moving_mean,需要区分训练、预测,因此tf的bn接口需要输入training=False 这可以通过传入bool类型的placeholder来解决,不过nd4j的tf接口暂时不支持bool值以及bool运算。。。所以,还是暂时别用batch_normalization,后续有新的解决方案会第一时间更新
- 打出来的包比较大,毕竟是platform方法,包含了各种cpu的支持,自然比较大,有280m以上
如果对jar包大小有要求 改用如下依赖,然后在linux上 用mvn打包 这样生成的包在50m以内,因为只针对linux的cpu,自然是小了很多
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>1.0.0-beta2</version>
</dependency>
祝你成为一个快乐的tf boy >_<
欢迎关注我的个人主页 https://duanyy.xyz
网友评论