python 使用灵活、方便在科研中被广泛的使用,Numpy和SciPy等科学计算库使其拥有强大的计算方式。很多机器学习和深度学习的库也都采用了python,然而在大数据、后台开发中仍然较多的使用Java来开发健壮的服务。如果你想要在Java中来调用Python代码的话,本文提供了一种思路,虽然不够健壮。

本文的初衷是在Java中调用Keras训练好的深度学习模型进行inference,模型的输入是Numpy数组。主要考虑几点:1).Java这边可以方便的打包成Jar包,方便部署,比如作为 spark 的 job 运行。2). Python这边如果要安装额外的库,安装方式越简单越好。

针对1).首先考虑的有deeplearning4j,可以通过maven使用。其次是Jython,Jep等工具提供了Java直接运行python代码的功能;再其次是完全通过网络来传递参数获取返回结果。另外,可考虑的是如果采用了Tensorflow训练模型,可以保存为Tensorflow模型,然后使用Java接口直接来调用。

deeplearning4j

deeplearning4j是一个Java语言的深度学习库,其能够与Spark框架对接。并且提供了导入keras模型的功能,然而对keras模型的支持并不完善,很多层还没有实现,尤其是keras2的出现,deeplearning4j支持情况很差。

Jython

Jython是纯Java实现的Jython VM。Jython在import 一个Python文件的时候,会编译生成.class文件,而不是.pyc文件。

使用Jython可以运行纯python实现的python库,无法使用用C写的Python扩展库,因为没有在ABI层兼容CPython。

Jython调用第三方的库,如自己编写的库,需要将包路径添加到sys.path中。

maven:

<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.1</version>
</dependency>

Jep 是一个能够让Python和Java互相调用的软件包。可以使用CPython的扩展包,如Numpy和Pandas。其可以将Java的数组自动转换为numpy数组。

在使用pip install jep安装时需要编译本地模块。


RPC

对上面的工具都不满意,只能走一些其它路子了。想到跨语言、跨平台、数据交换等概念时自然容易想到JSON、XML、RPC这些词。那么采用远程过程调用是一种不错的方式。各种语言都有远程过程调用的工具,如Java的RMI,对象被序列化后通过网络传输。序列化可以是任意形式,JSON、XML或者自定义的格式。JSON-RPC-2.0的规范定义比较简单,可以为我们所使用。

RPC-server (Python)

建立TCP server监听连接,在每个连接中按照JSON-RPC 2.0规范解读和发送内容。建立函数名称到函数的map,这些函数供Java调用。函数的参数需要是一些基本类型,如果原来的参数是numpy数组,可以改成一维数组,再加额外个参数表示维度信息,如行数和列数。然后在函数中进行reshape,复制到numpy数组。

RPC-client (Java)

建立到RPC-server的socket连接,使用com.thetransactioncompany.jsonrpc2包向RPC-server发送请求。

参数传递可以使用Java的Map,会映射到Python的dict。

链接

Py4j-RPC的更多相关文章

  1. 从RPC开始(一)

    这是一篇关于纯C++RPC框架的文章.所以,我们先看看,我们有什么? 1.一个什么都能干的C++.(前提是,你什么都干了) 2.原始的Socket接口,还是C API.还得自己去二次封装... 3.C ...

  2. RPC 使用中的一些注意点

    最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...

  3. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  4. 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验

    运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...

  5. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  6. spider RPC入门指南

    本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...

  7. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  8. 基于Netty打造RPC服务器设计经验谈

    自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热 ...

  9. Redola.Rpc 的一个小目标

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...

  10. 闲话RPC调用

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 自SOA架构理念提出以来,应用程序间如何以最低耦合度通信的问题便呈现在所有架构师面前. 互联网系统的复杂度让我们不 ...

随机推荐

  1. java中可变长参数的定义及使用方法

    JAVA中可以为方法定义可变长参数( Varargs)来匹配不确定数量的多个参数,其定义用“...”表示.其实,这类似于为方法传了一个数组,且在使用方法上也和数组相同,如下: public void ...

  2. 用Markdown格式写一份前端简历

    1. 基本信息 姓名:xxx 手机号码:1380000xxxx 学校:南昌大学 学历:大学本科/硕士/博士 工作经验:3年以上Web前端 电子邮件:xxx@outlook.com 2. 求职意向 工作 ...

  3. Shader 入门笔记(三) ShaderLab 初识

    Unity中,Unity Shader 都是ShaderLab 来编写的.ShaderLab 是Unity提供的编写Unity Shader 的一种说明性语言. 1)Properties :定义了着色 ...

  4. Percona监控MySQL模板详解

    InnoDB Adaptive Hash Index 显示了"自适应哈希索引"的使用情况,哈希索引只能用来搜索等值的查询. # Hash table size 17700827, ...

  5. ferror,clearerr和EOF含义

    1.我们并不是实时操纵文件,也不是实时生效,它依赖于缓冲区.非缓冲模式编程与常规区别,就是实时与不实时的区别. 2.//fgetc fputc, fgets fputs, fgetwc fputwc, ...

  6. [DeeplearningAI笔记]改善深层神经网络_优化算法2.1_2.2_mini-batch梯度下降法

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1 mini-batch gradient descent mini-batch梯度下降法 我们将训练数据组合到一个大的矩阵中 \(X=\b ...

  7. spring之setter注入

    setter注入分为2种 第一:普通属性注入 <bean id="userAction" class="com.xx.action.UserAction" ...

  8. JavaScript 优雅简单的拼接字符串

    前言 最近维护一个老系统,里面有大量js拼接字符串的代码,这里总计一下js拼接字符串 JS 原生字符串拼接 JavaScript里面的字符串可以直接用 + 来拼接 return "<a ...

  9. iOS-Mac远程连接控制Window【苹果电脑远程连接控制Windows电脑】

    用Mac电脑时想远程控制Windows电脑,摸索了半天搞定了 1.下载Mac远程控制安装包:http://pan.baidu.com/s/1o7ZsDQy  提取密码:r2ja 2.安装好之后打开,就 ...

  10. .net使用AsposeWord导出word table表格

    本文为原创,转载请注明出处 1.前言 .net平台下导出word文件还可以使用Microsoft.Office.Interop和NPOI,但是这两者都有缺点,微软的Office.Interop组件需要 ...