最近のプロジェクトでは、ビジネス ロジックの決定を行うために Java プログラムを通じてモデルの予測結果を取得する必要があるため、モデルをトレーニングしてサーバーにデプロイし、Python を呼び出して予測結果を取得する Java プログラムを作成します。脚本。
モデルのデプロイメントプロセス: TensorFlow モデルのデプロイメント
1.アナコンダをインストールする
2.pyプログラムを書く
結果予測のために予測モデルインターフェイスを呼び出します。
[ここでpy環境の問題に注意してください。ツールキットがインポートされない状況があります]
import requests
import json
import numpy as np
import sys
class NpEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(NpEncoder, self).default(obj)
def getPredict(list):
data = json.dumps({
"instances":list},cls=NpEncoder)
# headers = {"content-type":"applicaiton/json"}
response = requests.post("http://192.168.152.111:8501/v1/models/model:predict",data=data)
# print(response.text)
embeddings = json.loads(response.text)['predictions']
return embeddings[0][0]
if __name__ == '__main__':
list = []
for i in range(1,len(sys.argv)):
list.append((float(sys.argv[i])))
list = np.array(list).reshape(1,6)
print(getPredict(list))
3. Java プログラムを作成する
Java を介して Python スクリプトを呼び出し、予測された戻り値を取得します
public static String getPredictInfo(NodeIndicatorsVo nodeIndicatorsVo){
String cpuIdle = nodeIndicatorsVo.getCpuIdle();
String diskFree = nodeIndicatorsVo.getDiskFree();
String memFree = nodeIndicatorsVo.getMemFree();
String AvgWaitTime = String.valueOf(nodeIndicatorsVo.getAvgWaitTime());
String AvgDealTime = String.valueOf(nodeIndicatorsVo.getAvgDealTime());
String Cap = String.valueOf(nodeIndicatorsVo.getCapacity());
String result = null;
try {
String[] arg1 = new String[] {
"/usr/local/anaconda3/envs/common/bin/python3.8", "/home/hl/model.py", cpuIdle, diskFree, memFree, AvgWaitTime, AvgDealTime, Cap };
Process proc = Runtime.getRuntime().exec(arg1);// 执行py文件
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
result = in.readLine();
in.close();
proc.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
if (result == null){
return "NULL";
}
if (Float.parseFloat(result) > 0.5){
return "1";
}else {
return "0";
}
}