美文网首页
能随意移植的深度学习服务

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

作者: duan_yy | 来源:发表于2018-10-19 21:30 被阅读0次

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

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依赖

<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 示例

略有缺点

  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,自然是小了很多
<dependency>
    <groupId>org.nd4j</groupId>
    <artifactId>nd4j-native</artifactId>
    <version>1.0.0-beta2</version>
</dependency>

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

参考链接

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

相关文章

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

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

  • 嵌入式11月3日总结。

    今天学习了boa服务器的移植,在Linux系统下安装boa服务器。修改对应的参数。在移植了对应的网页设置。上午对应...

  • 当 Tensorflow 遇见 Android

    深度学习的模型有很多,但是考虑到移动端的硬件限制,并不是所有模型都适合移植,在这里整理一下适合移植的模型。 图片 ...

  • scrapy项目移植到centos6.9上的mqsql注意事项

    学习所用,可随意转载,转载请注明出处,或在本文下方留言说明即可,谢谢! 将前文的scrapy项目移植到centos...

  • jsp网站只有首页能打开,栏目页都打不开,报"***

    今天把一个jsp网站从win服务器移植到linux服务器,发现只有首页能打开,栏目页都报错:*** cannot ...

  • 11.3

    今天学习了boa服务器的移植,在Linux系统下安装boa服务器,来修改参数。上午按照老师发的表修改了boa服务器...

  • 深度学习车型识别APP(毕业设计)

    简介 通过深度学习技术搭建残差网络,使用CompsCars数据集 进行车型识别模型的训练,并将训练好的模型移植到了...

  • CPU深度学习环境配置-PyTorch

    CPU环境主要用来做深度学习部署,毕竟显存太贵,模型如果能压缩部署在CPU服务器上,能节约大量成本。 模型部署技术...

  • uboot内存重定向详解--Apple的学习笔记

    1.前言 对于uboot中的重定向,之前大概了解,因为不是我要学习的重点,所以没有去深度思考。那么本次移植uboo...

  • 如何切换opencv2 3

    背景: 最近,在Nvidia的GPU嵌入式开发板Jetson TX1(简称TX1)上移植深度学习目标检测算法YOL...

网友评论

      本文标题:能随意移植的深度学习服务

      本文链接:https://www.haomeiwen.com/subject/kbguzftx.html