Развертывание модели, содержащей The Universal Sentence Encoder Multilingual, на Google AI-платформе - PullRequest
0 голосов
/ 28 мая 2020

Я пытался использовать The Universal Sentence Encoder Multilingual для обучения передачи с помощью tenorflow (1.15) keras. Я использовал кодировщик предложений как KerasLayer в последовательной модели. После обучения я сохраняю свою модель как saved_model.pb, используя tf.saved_model.save. Вот моя модель:

import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_text

USE_V3 = "https://tfhub.dev/google/universal-sentence-encoder-multilingual-large/3"
my_model = tf.keras.models.Sequential(
    [
        tf.keras.layers.InputLayer(input_shape=(), dtype=tf.string),
        hub.KerasLayer(USE_V3, trainable=False),
        tf.keras.layers.Dense(3, activation="softmax"),
    ]
)
my_model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

Я использую Google AI-платформу для обучения и прогнозирования. С обучением проблем нет, он тренирует и сохраняет модель в облачном хранилище google. Когда я развертываю сохраненную модель для прогнозирования, в разделе моделей AI-платформы создается версия выпуска. Я использовал TensorFlow как Framework, python 3.7, версия 1.15. Когда я использую раздел TEST & USE для получения прогноза образца, он дает следующую ошибку: (Я также пробовал api, возвращается та же ошибка)

{
  "error": "Prediction failed: Error during model execution: AbortionError(code=StatusCode.NOT_FOUND, details=\"{{function_node __inference_signature_wrapper_139623}} {{function_node __inference_signature_wrapper_139623}} {{function_node __inference___call___137889}} {{function_node __inference___call___137889}} {{function_node __inference_restored_function_body_100331}} {{function_node __inference_restored_function_body_100331}} [_Derived_]{{function_node __inference___call___55591}} {{function_node __inference___call___55591}} Op type not registered 'SentencepieceOp' in binary running on localhost. Make sure the Op and Kernel are registered in the binary running in this process. Note that if you are loading a saved graph which used ops from tf.contrib, accessing (e.g.) `tf.contrib.resampler` should be done before importing the graph, as contrib ops are lazily registered when the module is first accessed.\n\t [[{{node StatefulPartitionedCall}}]]\n\t [[StatefulPartitionedCall]]\n\t [[muse_sentiment_classification/embedding/StatefulPartitionedCall]]\n\t [[StatefulPartitionedCall]]\n\t [[StatefulPartitionedCall]]\")"
}

Короче, SentencepieceOp (из tensorflow_text) не может можно найти в предсказательной машине. Затем я попытался использовать этот обходной путь, который нашел здесь . В этом посте использовалось обходное решение для отсутствия SentencepieceEncodeSparse, но я думаю, что причина аналогична. Я создал свой собственный Custom Prediction Routine, как было предложено, и поместил в него зависимость для tensorflow_text. Максимальный размер модели составляет 500 МБ для пользовательской процедуры прогнозирования, а моя модель составляет ~ 350 МБ. Когда я пытаюсь создать новую версию для своей модели, на этот раз она не создает версию выпуска и выдает следующую ошибку памяти:

Create Version failed. Bad model detected with error: Model requires more memory than allowed. Please try to decrease the model size and re-deploy. If you continue to experience errors, please contact support.

1-й вопрос: есть ли правильный способ развернуть модель, которая использует Universal Sentence Encoder Multilingual в AI-платформе без обходного пути пользовательской процедуры прогнозирования?

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

EDIT: я использовал как gcloud (v296.0.1), так и облачную консоль для развертывания с одинаковыми конфигурациями. Это сценарии развертывания для фреймворка TensorFlow и Custom Prediction Routine:

Развертывание TensorFlow:

MODEL_DIR="gs://my-bucket--us-central1/training/sentiment_training/_model/"
VERSION_NAME="test_v1"
MODEL_NAME="Sentiment"
FRAMEWORK="TensorFlow"

gcloud ai-platform versions create $VERSION_NAME \
  --model $MODEL_NAME \
  --origin $MODEL_DIR \
  --runtime-version=1.15 \
  --framework $FRAMEWORK \
  --python-version=3.7

Развертывание настраиваемой процедуры прогнозирования:

MODEL_DIR="gs://my-bucket--us-central1/training/sentiment_training/_model/"
VERSION_NAME="test_v1"
MODEL_NAME="Sentiment"
CUSTOM_CODE_PATH="gs://my-bucket--us-central1/packages/custom-op-tf-predictor-0.1.tar.gz"
PREDICTOR_CLASS="predictor.CustomOpTfPredictor"

gcloud beta ai-platform versions create $VERSION_NAME \
  --model $MODEL_NAME \
  --origin $MODEL_DIR \
  --runtime-version=1.15 \
  --python-version=3.7 \
  --package-uris=$CUSTOM_CODE_PATH \
  --prediction-class=$PREDICTOR_CLASS

1 Ответ

0 голосов
/ 07 августа 2020

По данным службы поддержки Google, использование недокументированного типа машины (mls1-c4-m4) в качестве машины для прогнозирования решило мою проблему. Я просто добавил --machine-type=mls1-c4-m4 в конце развертывания Custom Prediction Routine. У этой машины ограничение памяти 4 ГБ, но она все еще находится в альфа-версии.

...