Tensorflow VS PMML

對於tensorflow模型的線上部署,有如下幾個方式:

1、通過tensorflow serving方式;

2、通過java調用tensorflow保存的模型;

3、通過將tensorflow模型轉換為PMML模型文件,將PMML模型文件部署到線上。

那麼,tensorflow serving 和PMML文件相比,有什麼差別嗎?

JPMML的作者Villu Ruusmann首先測試了tensorflow模型轉換為PMML文件後的正確性。

The correctness check asserts that TensorFlow predictions and PMML predictions are equivalent. The goal is to reach absolute equivalence, which means that TensorFlow and PMML predictions will not differ more than by 1 ULP.

如果要理解什麼是ulp,先要了解在計算機中保存的數和我們在數學上認為的數是不一樣的;比方說2.0和3.0之間有多少個數,在數學中是無限的,但是在計算機中是有限的,因為計算機需要用一堆位元組來表示double或者float,但是因為計算機表示不了無限的數。所以就有了ulp,假設在float 2.0和3.0之間有1,000,000個數,那麼在2.0和3.0之間的數的ulp就是1.0/1,000,000約等於0.000001。

測試結果表明,PMML文件部署準確性是肯定的。

關於PMML文件部署的效率,作者使用了DNNRegressionAuto model (https://github.com/jpmml/jpmml-tensorflow/tree/master/src/test/resources/savedmodel/DNNRegressionAuto) ,將其轉換為PMML文件格式,在一個老式電腦上進行測試。

測試數據格式如圖:

共有392行數據。

轉換方式如下:

使用了org.jpmml.evaluator.EvaluationExample command-line example application:

$ cd jpmml-tensorflow

$ java -jar target/converter-executable-1.0-SNAPSHOT.jar --tf-savedmodel-input src/test/resources/savedmodel/DNNRegressionAuto/ --pmml-output Auto.pmml

得到Auto.pmml文件,調用方式如下:

$ java -cp ../jpmml-evaluator/pmml-evaluator-example/target/example-1.3-SNAPSHOT.jar org.jpmml.evaluator.EvaluationExample --input src/test/resources/csv/Auto.csv --model Auto.pmml --output /dev/null --loop 10000

結果如下:

<stdout>

main count = 10000

mean rate = 343,65 calls/second

1-minute rate = 292,76 calls/second

5-minute rate = 271,78 calls/second

15-minute rate = 267,71 calls/second

min = 2,56 milliseconds

max = 124,31 milliseconds

mean = 2,91 milliseconds

stddev = 1,79 milliseconds

median = 2,63 milliseconds

75% <= 2,71 milliseconds

95% <= 3,72 milliseconds

98% <= 4,88 milliseconds

99% <= 8,26 milliseconds

99.9% <= 21,34 milliseconds

</stdout>

結果顯示平均花費 2.91 milliseconds 預測 392 data records, 也就是每秒 ~135000 data records。

JPMML的作者也強調PMML的賣點從來不是它的raw performance.

The selling point is having a standalone 1 MB JAR file, which can score pretty much any predictive model out there.

另外,對於深層神經網路,以及特徵數據大的情況,JPMML-Evaluator可以採用第三方計算工具,如tensorflow。 簡單來說,在PMML文件里確保輸入數據的有效性,進行數據預處理。然後將神經網路轉換成tensorflow腳本。這種轉換是直接的,因為PMML和tensorflow都是將預測模型轉換為圖的計算。一個將PMML文件轉換為tensorflow的python項目: https://github.com/yogeshhk/TensorFlowPMML

推薦閱讀:

馬庫斯:DeepMind新出的機器心智網路不錯,但有誤導性
[貝葉斯九]之EM演算法
基於NLP的股價預測
深入機器學習系列21-最大熵模型
數據嗨客 | 第6期:不平衡數據處理

TAG:TensorFlow | 機器學習 |