我对在python中部署机器学习模型感兴趣,因此可以通过对服务器的请求进行预测。
我将创建一个Cloudera集群,并利用Spark开发模型,使用库 pyspark 。我想知道如何保存模型以便在服务器上使用它。
我已经看到不同的算法都有.save函数(就像在这篇文章How to save and load MLLib model in Apache Spark中回答的那样),但是由于服务器将在没有Spark而不在Cloudera集群中的不同机器中,我不知道是否可以使用他们的.load和.predict函数。
是否可以使用 pyspark 库函数进行预测而不使用Spark?或者我是否必须进行任何转换才能保存模型并在其他地方使用它?
答案 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