我使用GCP(谷歌云平台)来训练我的模型,我可以导出导出的模型。我使用了该模型并使用了服务 1.8 CPU 的 Tensorflow 的本地 docker 映像,我得到以下结果作为 REST 后调用的输出 { “错误”:“服务签名名称:\“serving_default\”在签名定义中找不到” }
使用
SavedModelCLI
命令查看模型的 SignatureDefs,如下所示:
saved_model_cli show --dir /usr/local/google/home/abc/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three/00000123
它应该显示如下所示的内容:
signature_def['Classify']:
The given SavedModel SignatureDef contains the following input(s):
inputs['inputs'] tensor_info:
dtype: DT_STRING
shape: unknown_rank
name: tf_example:0
The given SavedModel SignatureDef contains the following output(s):
outputs['outputs'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: y2:0
Method name is: tensorflow/serving/regress
signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['x'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: x:0
The given SavedModel SignatureDef contains the following output(s):
outputs['y'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: y:0
Method name is: tensorflow/serving/predict
检查您是否可以在上述签名定义中看到名为
serving_default
的签名。
根据我的理解,最有可能的是该签名丢失,因此导致错误。
您如何导出模型? 看来您已经识别了自定义签名,但没有识别默认值。只需将“serving_default”更改为您的签名即可。
您可以在部署之前将serving_default签名添加到导出的模型中
@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def serving_fn(bytes_inputs):
# Decode base64 image
decoded_images = tf.map_fn(
tf.io.decode_base64,
bytes_inputs,
dtype=tf.string
)
# Convert to float32 tensor
images = tf.map_fn(
tf.io.decode_image,
decoded_images,
dtype=tf.uint8
)
images = tf.cast(images, tf.float32)
# Make prediction
predictions = model(images)
return predictions
# Save model with serving signature
tf.saved_model.save(model,
export_dir,
signatures={
"serving_default": serving_fn
})
或者,如果您使用的是 vertex AI,则可以使用 https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.endpoints/rawPredict。