Ответы на ошибки пользовательского прогноза google-ml-engine - PullRequest
0 голосов
/ 13 марта 2020

У меня есть пользовательская процедура прогнозирования в google-ml-engine. Работает очень хорошо.

Сейчас я делаю проверку ввода данных экземпляра и хочу вернуть ответы об ошибках из моей процедуры прогнозирования.

Пример: https://cloud.google.com/ai-platform/prediction/docs/custom-prediction-routines

Повышает исключения при ошибках ввода и т. Д. c. Тем не менее, когда это происходит, тело ответа всегда имеет {'error': Prediction failed: unknown error}.. Я вижу, что в облачной консоли Google регистрируются правильные ошибки, но https всегда совпадает с unknown error.

Мой вопрос:

Как заставить Процедуру пользовательского прогнозирования вернуть правильный код ошибки и строку сообщения об ошибке?

Вместо того, чтобы возвращать прогноз, я могу вернуть строку / код ошибки в прогнозе, но он заканчивается в части прогноза ответа, который кажется хакерским и не получает никаких ошибок Google, например, на основании Размер экземпляра.

root:test_deployment.py:35 {'predictions': {'error': "('Instance does not include required sensors', 'occurred at index 0')"}}

Какой лучший способ сделать это?

Спасибо! Дэвид

1 Ответ

0 голосов
/ 18 марта 2020

Пожалуйста, посмотрите на следующий код, я создал _validate функцию внутри predict и использую пользовательский класс Exception. По сути, я проверяю экземпляры перед тем, как вызвать метод model predic t и обработать исключение. При выполнении этой проверки может потребоваться некоторое время отклика, которое необходимо проверить для вашего варианта использования.

requests = [
    "god this episode sucks",
    "meh, I kinda like it",
    "what were the writer thinking, omg!",
    "omg! what a twist, who would'v though :o!",
    99999
]
api = discovery.build('ml', 'v1')

parent = 'projects/{}/models/{}/versions/{}'.format(PROJECT, MODEL_NAME, VERSION_NAME)
parent = 'projects/{}/models/{}'.format(PROJECT, MODEL_NAME)
response = api.projects().predict(body=request_data, name=parent).execute()
{'predictions': [{'Error code': 1, 'Message': 'Invalid instance type'}]}

Класс пользовательского прогнозирования:

import os
import pickle
import numpy as np
import logging

from datetime import date

import tensorflow.keras as keras


class CustomModelPredictionError(Exception):
    def __init__(self, code, message='Error found'):        
        self.code = code 
        self.message = message # you could add more args
    def __str__(self):
        return str(self.message)


def isstr(s):
    return isinstance(s, str) or isinstance(s, bytes)


def _validate(instances):
    for instance in instances:
        if not isstr(instance):
            raise CustomModelPredictionError(1, 'Invalid instance type')
    return instances


class CustomModelPrediction(object):
    def __init__(self, model, processor):    
        self._model = model
        self._processor = processor       

    def _postprocess(self, predictions):
        labels = ['negative', 'positive']
        return [
            {
                "label":labels[int(np.round(prediction))],
                "score":float(np.round(prediction, 4))
            } for prediction in predictions]

    def predict(self, instances, **kwargs):
        try:
            instances = _validate(instances)            
        except CustomModelPredictionError as c:            
            return [{"Error code": c.code, "Message": c.message}]
        else:
            preprocessed_data = self._processor.transform(instances)
            predictions =  self._model.predict(preprocessed_data)
            labels = self._postprocess(predictions)
            return labels

    @classmethod
    def from_path(cls, model_dir):                
        model = keras.models.load_model(
          os.path.join(model_dir,'keras_saved_model.h5'))
        with open(os.path.join(model_dir, 'processor_state.pkl'), 'rb') as f:
            processor = pickle.load(f)    
        return cls(model, processor)

Выполнено код в этот блокнот .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...