Py4j-RPC
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。
链接
- 本文代码地址: github.com/makefile/py4j-rpc
- https://scito.ch/content/fast-remote-procedure-calls-python-introducing-new-json-rpc-stream-protocol
- http://software.dzhuvinov.com/json-rpc-2.0-base.html
- https://ws.apache.org/xmlrpc/client.html
- http://archive.apache.org/dist/ws/xmlrpc/
Py4j-RPC的更多相关文章
- 从RPC开始(一)
这是一篇关于纯C++RPC框架的文章.所以,我们先看看,我们有什么? 1.一个什么都能干的C++.(前提是,你什么都干了) 2.原始的Socket接口,还是C API.还得自己去二次封装... 3.C ...
- RPC 使用中的一些注意点
最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...
- 谈谈如何使用Netty开发实现高性能的RPC服务器
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验
运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...
- python通过protobuf实现rpc
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...
- spider RPC入门指南
本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
- 基于Netty打造RPC服务器设计经验谈
自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热 ...
- Redola.Rpc 的一个小目标
Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...
- 闲话RPC调用
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 自SOA架构理念提出以来,应用程序间如何以最低耦合度通信的问题便呈现在所有架构师面前. 互联网系统的复杂度让我们不 ...
随机推荐
- C# 多线程复习笔记
编码的日子其实也有一段时间了,但是,作为一个客户端程序,因为自己是做游戏开发的,一直没有对线程这个概念比较模糊吧. 记录下线程的整理学习路线.原文:http://www.cnblogs.com/min ...
- 13 Basic Cat Command Examples in Linux(转) Linux中cat命令的13中基本用法
Cat (串联) 命令是Linux/Unix开源系统中比较常用的一个命令.我们可以通过Cat命令创建一个或多个文件,查看文件内容,串联文件并将内容输出到终端设备或新的文件当中,这篇文章我们将会以实例的 ...
- 备忘:java在cmd中编译运行
防止每次用的时候都想不起来 1.进入.java文件所在的路径 (cls清除控制台的命令) 2.javac编译 javac -d . demo1.java javac demo1.java 如所编译的文 ...
- 记录下直接在git里读取出差异并打包的代码
一行命令: git diff --name-only HEAD commit_id | xargs tar -zcvf diff_head.tar.gz 这里的HEAD可以理解为最新的版本 HEAD本 ...
- Java垃圾回收机制[转]
原文地址:http://blog.csdn.net/zsuguangh/article/details/6429592 综合了若干人的blog- 1. 垃圾回收的意义 在C++中,对象所占的内存在程序 ...
- Spring对远程服务的支持
Java程序有以下的远程调用技术选择: 远程过程调用(RPC)是同步的,客户端在服务器端返回结果之前将一直被阻塞. 各种技术适用的场景如下: 典型的RMI开发的过程如下: 定义一个接口,用于客户端和服 ...
- 如何解决Linux 系统下 ifconfig 命令无网络接口 ens33
今天我在做Redis的哨兵集群模式的时候,以前都是好的,也不知道从什么时候开始就无法连接Redis服务器了,就是运行如下命令,没有效果:redis-server redis.conf,然后在通过命令查 ...
- demo说明
访问http://192.168.90.63:30111/face_mark/, 会看到上图的界面. 下面简单说下如何使用这个demo. 一.选择选择同一个人不同角度的五张图. 选中了五张图片.此时任 ...
- 【模板小程序】求第n个fibonacci数
//fibonacci,find the nth num. 1 1 2 3 5 8... #include <iostream> using namespace std; int fib( ...
- 剑指offer试题(PHP篇四)
16.合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 时间限制:1秒 空间限制:32768K <?php /*c ...