可以将自定义sklearn模型上传到gcloud ml-engine吗?

时间:2018-04-29 12:41:11

标签: scikit-learn pipeline gcloud google-cloud-ml

我尝试了新功能,在gcloud tutorial之后将sklearn模型部署到ml-engine。我已经为sklearn Estimator GaussianMixture创建了一个包装器,以便改变预测函数,使其输出概率输出(如sample_scores)而不是默认的类预测。

GMMWrapper.py

class GMMWrapper(GaussianMixture):
    def predict(self, X):
        return self.score_samples(X)

我创建了管道并以标准方式保存:

gmm = GMMWrapper()
pipegmm = Pipeline([('gmm', gmm)])
pipegmm.fit(data)
with tf.gfile.Open(model_output_path, 'wb') as model_file:
    joblib.dump(pipegmm, model_output_path + '.joblib')

但是当使用gcloud beta ml-engine versions create部署到gcloud时,当然找不到模块GMMWrapper

ERROR: (gcloud.beta.ml-engine.versions.create) Bad model detected with
error:  "Failed to load model: Could not load the model: 
/tmp/model/0001/model.joblib. No module named 'GMMWrapper'.

我尝试将其包含在部署源文件夹中,该文件夹将上传到暂存存储桶。

DEPLOYMENT_SOURCE="/folder-containing-model-and-GMMWrapper"
MODEL_NAME="GMMs"
FRAMEWORK="SCIKIT_LEARN"
STAGING_BUCKET="gs://sklearn-models"

gcloud beta ml-engine versions create v1 \
    --model $MODEL_NAME --origin $DEPLOYMENT_SOURCE \
    --framework $FRAMEWORK --staging-bucket $STAGING_BUCKET \
    --runtime-version=1.5 --python-version=3.5

但是返回相同的错误。我需要以某种方式通知gcloud在哪里寻找模块。我怀疑这不可能做到,但我想如果有办法,我会问。

(或者,如果有一种方法可以改变在管道上调用预测时调用哪个函数,这也可以解决我的问题。)

1 个答案:

答案 0 :(得分:1)

目前不支持此功能。我们一直在寻求改进产品的方法,并会考虑这个建议的功能。