Я пытался использовать 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