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:
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/
轉載于:https://www.cnblogs.com/makefile/p/py4j.html
總結
- 上一篇: PAT 1038. 统计同成绩学生
- 下一篇: 虚幻4 ue4 学习笔记pwan篇 1.