ML Engine - медленное время вывода - PullRequest
0 голосов
/ 17 мая 2018

Из Google Cloud Documentation у нас есть

Система онлайн-обучения Cloud Machine Learning Engine - это сервис, оптимизированный для обработки ваших данных через размещенные модели с минимальной задержкой.Вы отправляете небольшие пакеты данных в службу, и она возвращает ваши прогнозы в ответе.Вы можете узнать более общую информацию об онлайн-прогнозировании с другими концепциями прогнозирования.Цитата

https://cloud.google.com/ml-engine/docs/tensorflow/online-predict

И мой опыт работы с ним ниже среднего, я должен сказать.Не поймите меня неправильно, я люблю ML Engine и много тренируюсь там, но по моему опыту, время вывода смешно.

Я создал небольшую семантическую сеть сегментации на изображенияхРазмер 256х256.Я использую Оценщики, и я конвертирую модель в формат SavedModel, а затем делаю прогнозы, используя этот код

predictor_fn = tf.contrib.predictor.from_saved_model(
    export_dir=saved_model_dir,
    signature_def_key="prediction"
)

На моем компьютере это дало мне время вывода около 0,9 секунды.Я попробовал тот же код на экземпляре Datalab, с типом машины n1-highmem-2 , который дал мне время вывода около 2,3 секунд.

Теперь, если я буду обслуживать свою сохраненную модельна ML-Engine вместо этого

gcloud ml-engine models create SEM --regions europe-west1
gcloud ml-engine versions create SEM --model V0 --origin "MY_BUCKET_PATH" --runtime-version=1.6

И функция входного обслуживания такова:

def parse_incoming_tensors(incoming):
    img = vgg16_normalize(tf.reshape(incoming, [-1, 256, 256, 3]))
    return img


def serving_input_fn_web():
    """Input function to use when serving the model on ML Engine."""
    inputs = tf.placeholder(tf.string, shape=(None, ))
    feature_input = batch_base64_to_tensor(inputs)
    feature_input = {'img': parse_incoming_tensors(feature_input)}

    return tf.estimator.export.ServingInputReceiver(feature_input, inputs)

Затем я делаю прогнозы, используя этот класс:

class MakeQuery():
    def __init__(self, project, model, version=None, client_secret=None):
        # Set the environment variable
        secret_path = os.path.abspath('./client_secret.json')
        os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = secret_path

        # Create service object and prepare the name of the model we are going to query
        self._service = googleapiclient.discovery.build('ml', 'v1')
        self._name = 'projects/{}/models/{}'.format(project, model)
        self._project = self._service.projects()

        if version is not None:
            self._name += '/versions/{}'.format(version)

    def predict(self, instances):
        response = self._project.predict(name=self._name, body=instances).execute()

        if 'error' in response:
            raise RuntimeError(response['error'])

        return response

    def get_prediction(self, img_arrays):
        input_list = [{'input': array_to_base64_websafe_resize(img)} for img in img_arrays]
        input_format = {'instances': input_list}

        return self.predict(input_format)

ЗатемКаждый запрос на прогнозирование занимает 10 секунд!ML-Engine серьезно разворачивает модель каждый раз, когда я делаю запрос?

TL; DR При использовании формата Tensorflow SavedModel от Estimators время вывода в Google ML-Engine очень медленное.

  • Razer 2017: 0,9 с
  • Datalab n1-highmem-2: 2,3 секунды
  • ML-Engine 10 секунд
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...