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架构理念提出以来,应用程序间如何以最低耦合度通信的问题便呈现在所有架构师面前. 互联网系统的复杂度让我们不 ...
随机推荐
- k8s 如何 Failover?- 每天5分钟玩转 Docker 容器技术(127)
上一节我们有 3 个 nginx 副本分别运行在 k8s-node1 和 k8s-node2 上.现在模拟 k8s-node2 故障,关闭该节点. 等待一段时间,Kubernetes 会检查到 k8s ...
- CopyOnWriteArrayList集合排序异常问题
1.集合自定义排序实现 对List集合的自定义排序想必大家都知道要使用如下的方式,通过实现Comparator接口并实现compare方法来实现. /** * * @方法名 changeChain * ...
- 二级缓存:EHCache的使用
EHCache的使用 在开发高并发量,高性能的网站应用系统时,缓存Cache起到了非常重要的作用.本文主要介绍EHCache的使用,以及使用EHCache的实践经验. 笔者使用过多种基于Java的开源 ...
- mysql 我们眼中的int(10)
自我总结,欢迎拍砖! 目的:定义int(3)和int(10)真的有区别吗? 论证: 1.创建student,student2表 分别定义一个student,student2表 create table ...
- 从iconfont下载项目所需的图标资源
前端开发中,经常会用到各种各样的图标(icon).这些icon,如果每个都要自己去做,那真的是耗时又耗力.但是,有了阿里巴巴矢量图标库这样的平台后,一切都变得简单了起来. 本文以此平台为例,演示如何搜 ...
- JavaScript基本语法 -- 条件语句 & 循环语句
条件语句 条件语句(Conditional statement)是JavaScript里面的基本结构之一,程序根据表达式的真假决定执行或者跳过某个分支,于是,条件语句有时候也可以称为"分支语 ...
- MySQL5学习笔记(三)
系统变量 mysqld服务器维护两种变量.全局变量(GLOBAL)影响服务器整体操作.会话变量(SESSION)影响具体客户端连接的操作. 当服务器启动时,它将所有全局变量初始化为默认值.这些 ...
- Java设计模式——代理模式
public interface People { public void work(); } public class RealPeople implements People { public v ...
- 洛谷 [P1265] 公路修建
本题的描述:城市联盟,最短距离.. 使人想到了prim求MST,再一看数据范围:完全图!,那么一定得用prim,因为只有5000个点,所以不加优化的prim就能过. #include <iost ...
- CF 208E. Blood Cousins [dsu on tree 倍增]
题意:给出一个森林,求和一个点有相同k级祖先的点有多少 倍增求父亲然后和上题一样还不用哈希了... #include <iostream> #include <cstdio> ...