Gcloud ai-platform, не может создать модель с собственным классом предсказания - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь следовать AI Platform , учебник , чтобы загрузить модель и процедуру прогнозирования, но одна часть не удалась, и я не понимаю, почему.

Мой класс прогнозирования такой же, как в ихучебное пособие:

%%writefile predictor.py
import os
import pickle

import numpy as np
from sklearn.datasets import load_iris
from sklearn.externals import joblib

class MyPredictor(object):
  def __init__(self, model, preprocessor):
    self._model = model
    self._preprocessor = preprocessor
    self._class_names = load_iris().target_names

  def predict(self, instances, **kwargs):
    inputs = np.asarray(instances)
    preprocessed_inputs = self._preprocessor.preprocess(inputs)
    if kwargs.get('probabilities'):
      probabilities = self._model.predict_proba(preprocessed_inputs)
      return probabilities.tolist()
    else:
      outputs = self._model.predict(preprocessed_inputs)
      return [self._class_names[class_num] for class_num in outputs]

  @classmethod
  def from_path(cls, model_dir):
    model_path = os.path.join(model_dir, 'model.joblib')
    model = joblib.load(model_path)

    preprocessor_path = os.path.join(model_dir, 'preprocessor.pkl')
    with open(preprocessor_path, 'rb') as f:
      preprocessor = pickle.load(f)

    return cls(model, preprocessor)

код, который я использую для создания своей модели в облаке:

! gcloud beta ai-platform versions create {VERSION_NAME} \
  --model {MODEL_NAME} \
  --runtime-version 1.13 \
  --python-version 3.5 \
  --origin gs://{BUCKET_NAME}/custom_prediction_routine_tutorial/model/ \
  --package-uris gs://{BUCKET_NAME}/custom_prediction_routine_tutorial/my_custom_code-0.1.tar.gz \
  --prediction-class predictor.MyPredictor

Но я получаю такую ​​странную ошибку:

ERROR: (gcloud.beta.ai-platform.versions.create) Bad model detected with error:  "Failed to load model: Unexpected error when loading the model: 'ascii' codec can't decode byte 0xf9 in position 2: ordinal not in range(128) (Error code: 0)"

Дело в том, что когда я запускаю ту же команду без:

--prediction-class predictor.MyPredictor

, она отлично работает.

Кто-то знает причину этого?Я думаю model.joblib может иметь проблемы с кодировкой, но когда я загружаю его сам, в этом нет ничего плохого

1 Ответ

0 голосов
/ 27 мая 2019

Я нашел решение,

В учебнике они используют pickle для сохранения созданного объекта препроцессора и Joblib для сохранения модели.

Вам нужно использовать Joblib для сохранения обоиха затем отправьте его в хранилище Google.

...