在非Spark环境中加载pyspark ML模型

时间:2016-11-21 08:11:49

标签: python apache-spark machine-learning pyspark

我对在python中部署机器学习模型感兴趣,因此可以通过对服务器的请求进行预测。

我将创建一个Cloudera集群,并利用Spark开发模型,使用库 pyspark 。我想知道如何保存模型以便在服务器上使用它。

我已经看到不同的算法都有.save函数(就像在这篇文章How to save and load MLLib model in Apache Spark中回答的那样),但是由于服务器将在没有Spark而不在Cloudera集群中的不同机器中,我不知道是否可以使用他们的.load和.predict函数。

是否可以使用 pyspark 库函数进行预测而不使用Spark?或者我是否必须进行任何转换才能保存模型并在其他地方使用它?

3 个答案:

答案 0 :(得分:3)

花了一个小时后我得到了这个工作代码,这可能没有优化,

Mymodel.py:

import os
import sys

# Path for spark source folder
os.environ['SPARK_HOME']="E:\\Work\\spark\\installtion\\spark"

# Append pyspark  to Python Path
sys.path.append("E:\\Work\\spark\\installtion\\spark\\python")

try:
    from pyspark.ml.feature import StringIndexer
    # $example on$
    from numpy import array
    from math import sqrt
    from pyspark import SparkConf
    # $example off$

    from pyspark import SparkContext
    # $example on$
    from pyspark.mllib.clustering import KMeans, KMeansModel

    print ("Successfully imported Spark Modules")

except ImportError as e:
    sys.exit(1)


if __name__ == "__main__":
    sconf = SparkConf().setAppName("KMeansExample").set('spark.sql.warehouse.dir', 'file:///E:/Work/spark/installtion/spark/spark-warehouse/')
    sc = SparkContext(conf=sconf)  # SparkContext
    parsedData =  array([0.0,0.0, 1.0,1.0, 9.0,8.0, 8.0,9.0]).reshape(4,2)
    clusters = KMeans.train(sc.parallelize(parsedData), 2, maxIterations=10,
                            runs=10, initializationMode="random")
    clusters.save(sc, "mymodel")  // this will save model to file system
    sc.stop()

此代码将创建一个kmean集群模型并将其保存在文件系统中。

API.py

from flask import jsonify, request, Flask
from sklearn.externals import joblib
import os
import sys

# Path for spark source folder
os.environ['SPARK_HOME']="E:\\Work\\spark\\installtion\\spark"

# Append pyspark  to Python Path
sys.path.append("E:\\Work\\spark\\installtion\\spark\\python")

try:
    from pyspark.ml.feature import StringIndexer
    # $example on$
    from numpy import array
    from math import sqrt
    from pyspark import SparkConf
    # $example off$

    from pyspark import SparkContext
    # $example on$
    from pyspark.mllib.clustering import KMeans, KMeansModel

    print ("Successfully imported Spark Modules")

except ImportError as e:
    sys.exit(1)


app = Flask(__name__)

@app.route('/', methods=['GET'])
def predict():

    sconf = SparkConf().setAppName("KMeansExample").set('spark.sql.warehouse.dir', 'file:///E:/Work/spark/installtion/spark/spark-warehouse/')
    sc = SparkContext(conf=sconf)  # SparkContext
    sameModel = KMeansModel.load(sc, "clus")  // load from file system 

    response = sameModel.predict(array([0.0, 0.0]))  // pass your data

    return jsonify(response)

if __name__ == '__main__':
    app.run()

上面是我用REST烧写的REST api。

拨打http://127.0.0.1:5000/。您可以在浏览器中看到响应。

答案 1 :(得分:2)

看看MLeap(我参与的项目) - 它提供了整个ML管道(不仅仅是估算器)的序列化/反序列化以及不依赖于spark上下文的执行引擎,分布式数据框架和执行计划。

截至今天,MLeap执行模型的运行时没有python绑定,只有scala / java,但添加它们不应该复杂。如果您需要帮助从Spark培训的管道和模型中创建评分引擎,请随意联系github给我自己和其他MLeap开发人员。

答案 2 :(得分:1)

这可能不是完整的解决方案

Model.py

from sklearn.externals import joblib
from sklearn.pipeline import make_pipeline
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.svm import LinearSVC

# code to load training data into X_train, y_train, split train/test set

vec = HashingVectorizer()
svc = LinearSVC()
clf = make_pipeline(vec, svc)
svc.fit(X_train, y_train)

joblib.dump({'class1': clf}, 'models', compress=9)

myRest.py

from flask import jsonify, request, Flask
from sklearn.externals import joblib

models = joblib.load('models')
app = Flask(__name__)

@app.route('/', methods=['POST'])
def predict():
    text = request.form.get('text')
    results = {}
    for name, clf in models.iteritems():
        results[name] = clf.predict([text])[0]
    return jsonify(results)

if __name__ == '__main__':
    app.run()
你可以这样做。参考:https://loads.pickle.me.uk/2016/04/04/deploying-a-scikit-learn-classifier-to-production/

表示spark:http://spark.apache.org/docs/latest/mllib-collaborative-filtering.html