Py4j-RPC
python 使用靈活、方便在科研中被廣泛的使用,Numpy和SciPy等科學(xué)計算庫使其擁有強(qiáng)大的計算方式。很多機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的庫也都采用了python,然而在大數(shù)據(jù)、后臺開發(fā)中仍然較多的使用Java來開發(fā)健壯的服務(wù)。如果你想要在Java中來調(diào)用Python代碼的話,本文提供了一種思路,雖然不夠健壯。
本文的初衷是在Java中調(diào)用Keras訓(xùn)練好的深度學(xué)習(xí)模型進(jìn)行inference,模型的輸入是Numpy數(shù)組。主要考慮幾點:1).Java這邊可以方便的打包成Jar包,方便部署,比如作為 spark 的 job 運行。2). Python這邊如果要安裝額外的庫,安裝方式越簡單越好。
針對1).首先考慮的有deeplearning4j,可以通過maven使用。其次是Jython,Jep等工具提供了Java直接運行python代碼的功能;再其次是完全通過網(wǎng)絡(luò)來傳遞參數(shù)獲取返回結(jié)果。另外,可考慮的是如果采用了Tensorflow訓(xùn)練模型,可以保存為Tensorflow模型,然后使用Java接口直接來調(diào)用。
deeplearning4j
deeplearning4j是一個Java語言的深度學(xué)習(xí)庫,其能夠與Spark框架對接。并且提供了導(dǎo)入keras模型的功能,然而對keras模型的支持并不完善,很多層還沒有實現(xiàn),尤其是keras2的出現(xiàn),deeplearning4j支持情況很差。
Jython
Jython是純Java實現(xiàn)的Jython VM。Jython在import 一個Python文件的時候,會編譯生成.class文件,而不是.pyc文件。
使用Jython可以運行純python實現(xiàn)的python庫,無法使用用C寫的Python擴(kuò)展庫,因為沒有在ABI層兼容CPython。
Jython調(diào)用第三方的庫,如自己編寫的庫,需要將包路徑添加到sys.path中。
maven:
Jep 是一個能夠讓Python和Java互相調(diào)用的軟件包。可以使用CPython的擴(kuò)展包,如Numpy和Pandas。其可以將Java的數(shù)組自動轉(zhuǎn)換為numpy數(shù)組。
在使用pip install jep安裝時需要編譯本地模塊。
RPC
對上面的工具都不滿意,只能走一些其它路子了。想到跨語言、跨平臺、數(shù)據(jù)交換等概念時自然容易想到JSON、XML、RPC這些詞。那么采用遠(yuǎn)程過程調(diào)用是一種不錯的方式。各種語言都有遠(yuǎn)程過程調(diào)用的工具,如Java的RMI,對象被序列化后通過網(wǎng)絡(luò)傳輸。序列化可以是任意形式,JSON、XML或者自定義的格式。JSON-RPC-2.0的規(guī)范定義比較簡單,可以為我們所使用。
RPC-server (Python)
建立TCP server監(jiān)聽連接,在每個連接中按照J(rèn)SON-RPC 2.0規(guī)范解讀和發(fā)送內(nèi)容。建立函數(shù)名稱到函數(shù)的map,這些函數(shù)供Java調(diào)用。函數(shù)的參數(shù)需要是一些基本類型,如果原來的參數(shù)是numpy數(shù)組,可以改成一維數(shù)組,再加額外個參數(shù)表示維度信息,如行數(shù)和列數(shù)。然后在函數(shù)中進(jìn)行reshape,復(fù)制到numpy數(shù)組。
RPC-client (Java)
建立到RPC-server的socket連接,使用com.thetransactioncompany.jsonrpc2包向RPC-server發(fā)送請求。
參數(shù)傳遞可以使用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/
轉(zhuǎn)載于:https://www.cnblogs.com/makefile/p/py4j.html
總結(jié)
- 上一篇: PAT 1038. 统计同成绩学生
- 下一篇: 虚幻4 ue4 学习笔记pwan篇 1.