2

I am trying to deploy custom model on AI platform. I have followed the steps as mentioned in the Google Document: https://cloud.google.com/ai-platform/prediction/docs/deploying-models#global-endpoint.

The saved model is stored in Google Cloud Storage and trained with python 3.7.

These are the gcloud commands used to deploy

gcloud ai-platform models create title_topic_custom \
  --regions=europe-west1 --enable_logging
MODEL_DIR="gs://ai_platform_custom/SavedModel"
VERSION_NAME="V3"
MODEL_NAME="title_topic_custom"
CUSTOM_CODE_PATH="gs://ai_platform_custom/SavedModel/my_custom_code-0.1.tar.gz"
PREDICTOR_CLASS="predictor.py.MyPredictor"
gcloud beta ai-platform versions create $VERSION_NAME \
  --model=$MODEL_NAME \
  --origin=$MODEL_DIR \
  --runtime-version=2.1 \
  --python-version=3.7 \
  --machine-type=mls1-c1-m2 \
  --package-uris=$CUSTOM_CODE_PATH \
  --prediction-class=$PREDICTOR_CLASS

I get the following error after executing those commands:

Using endpoint [https://ml.googleapis.com/]
Creating version (this might take a few minutes)......failed.                                                                                                                          
ERROR: (gcloud.beta.ai-platform.versions.create) Create Version failed. Bad model detected with error:  "There was a problem processing the user code: predictor.py.MyPredictor cannot be found. Please make sure (1) prediction_class is the fully qualified function name, and (2) it uses the correct package name as provided by the package_uris: ['gs://ai_platform_custom/SavedModel/my_custom_code-0.1.tar.gz'] (Error code: 4)"

The predictor code is as below:

%%writefile predictor.py
import os
import spacy
import numpy as np
import joblib
import tensorflow as tf
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
class MyPredictor(object):
  def __init__(self, model, topic_encoder):
    self._model = model
    self._nlp = spacy.load('en_core_web_sm')
    self._stopwords = stopwords.words('english')
    self._topic_encoder = topic_encoder
  def predict(self, instances, **kwargs):
    inputs = np.asarray(instances)
    inputs_t = [' '.join([i for i in x.split() if i not in self._stopwords]) for x in inputs]
    preprocessed_inputs = [' '.join([i.lemma_ for i in self._nlp(x)]) for x in inputs_t]
    outputs = self._model.predict(preprocessed_inputs)
    return [self._topic_encoder[key] for key in np.argmax(outputs, axis=1)]
  @classmethod
  def from_path(cls, model_dir):
    model_path = os.path.join(model_dir)
    model = tf.keras.models.load_model(model_path)
    topic_encoder = {0:'topic1',1:'topic2',3:'topic3'}
    return cls(model, topic_encoder)

This is the setup file

from setuptools import setup
setup(
    name='my-custom-code',
    version='0.1',
    install_requires=['nltk','spacy','joblib'],
    scripts=['predictor.py'])

Any workarounds?

Ranga Vittal
  • 196
  • 2
  • 12
  • Can you share how is your package/class structure? – rmesteves Nov 11 '20 at 16:42
  • I have updated the package and class structure – Ranga Vittal Nov 16 '20 at 05:34
  • This is not the expected behavior when creating a custom model on AI Platform. I suggest that you open an issue on Google IssueTracker so the engineers can check and fix this issue if that is the case. You can create your issue through this link: https://issuetracker.google.com/issues/new?component=187220&template=1161235 – rmesteves Nov 25 '20 at 09:59
  • Hi, I'd like to know how you resolved this issue. – Mohith7548 Oct 25 '21 at 05:50

1 Answers1

0

Try using PREDICTOR_CLASS="predictor.MyPredictor" instead of "predictor.py.MyPredictor"

Mohith7548
  • 1,282
  • 2
  • 16
  • 24