Cha*_*ler 5 python json numpy predict google-cloud-ml
我有一个接受过大输入的训练模型。我通常将其作为形状 (1,473,473,3) 的 numpy 数组来执行。当我把它放到 JSON 中时,我最终得到了一个大约 9.2MB 的文件。即使我将其转换为 JSON 文件的 base64 编码,输入仍然相当大。
ml-engine predict 在发送 JSON 文件时拒绝我的请求,并出现以下错误:
(gcloud.ml-engine.predict) HTTP request failed. Response: {
"error": {
"code": 400,
"message": "Request payload size exceeds the limit: 1572864 bytes.",
"status": "INVALID_ARGUMENT"
}
}
Run Code Online (Sandbox Code Playgroud)
看起来我无法向 ML-engine 发送大小超过 1.5MB 的任何内容。这确定是一回事吗?其他人如何绕过对大数据进行在线预测?我必须启动计算引擎还是会遇到同样的问题?
编辑:
我从 Keras 模型开始并尝试导出到 tensorflow 服务。我将我的 Keras 模型加载到一个名为“model”的变量中,并定义了一个目录“export_path”。我像这样构建 tensorflow 服务模型:
signature = predict_signature_def(inputs={'input': model.input},
outputs={'output': model.output})
builder = saved_model_builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
sess=sess,
tags=[tag_constants.SERVING],
signature_def_map={
signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature
}
)
builder.save()
Run Code Online (Sandbox Code Playgroud)
输入将如何查找此 signature_def?JSON 会像 {'input': ' https://storage.googleapis.com/projectid/bucket/filename '} 这样的文件是 (1,473,473,3) numpy 数组吗?
第二次编辑:查看 Lak Lakshmanan 发布的代码,我尝试了一些不同的变体,但没有成功读取图像 url 并尝试以这种方式解析文件。我尝试了以下但没有成功:
inputs = {'imageurl': tf.placeholder(tf.string, shape=[None])}
filename = tf.squeeze(inputs['imageurl'])
image = read_and_preprocess(filename)#custom preprocessing function
image = tf.placeholder_with_default(image, shape=[None, HEIGHT, WIDTH, NUM_CHANNELS])
features = {'image' : image}
inputs.update(features)
signature = predict_signature_def(inputs= inputs,
outputs={'output': model.output})
with K.get_session() as session:
"""Convert the Keras HDF5 model into TensorFlow SavedModel."""
builder = saved_model_builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
sess=session,
tags=[tag_constants.SERVING],
signature_def_map={
signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature
}
)
builder.save()
Run Code Online (Sandbox Code Playgroud)
我相信问题在于从 imageurl 占位符获取映射到构建功能。关于我做错了什么的想法?
我通常做的是让 json 引用 Google Cloud Storage 中的文件。用户首先必须将他们的文件上传到 gcs,然后调用预测。但这种方法还有其他优点,因为存储实用程序允许并行和多线程上传。
在 TensorFlow 2.0 中,服务功能如下所示:
@tf.function(input_signature=[tf.TensorSpec([None,], dtype=tf.string)])
def predict_bytes(img_bytes):
input_images = tf.map_fn(
preprocess,
img_bytes,
fn_output_signature=tf.float32
)
batch_pred = model(input_images) # same as model.predict()
top_prob = tf.math.reduce_max(batch_pred, axis=[1])
pred_label_index = tf.math.argmax(batch_pred, axis=1)
pred_label = tf.gather(tf.convert_to_tensor(CLASS_NAMES), pred_label_index)
return {
'probability': top_prob,
'flower_type_int': pred_label_index,
'flower_type_str': pred_label
}
@tf.function(input_signature=[tf.TensorSpec([None,], dtype=tf.string)])
def predict_filename(imageurl):
img_bytes = tf.map_fn(
tf.io.read_file,
filenames
)
result = predict_bytes(img_bytes)
result['filename'] = filenames
return result
shutil.rmtree('export', ignore_errors=True)
os.mkdir('export')
model.save('export/flowers_model3',
signatures={
'serving_default': predict_filename,
'from_bytes': predict_bytes
})
Run Code Online (Sandbox Code Playgroud)
完整代码在这里:https : //nbviewer.jupyter.org/github/GoogleCloudPlatform/practical-ml-vision-book/blob/master/09_deploying/09d_bytes.ipynb
在 TensorFlow 1.0 中,代码将如下所示:
def serving_input_fn():
# Note: only handles one image at a time ...
inputs = {'imageurl': tf.placeholder(tf.string, shape=())}
filename = tf.squeeze(inputs['imageurl']) # make it a scalar
image = read_and_preprocess(filename)
# make the outer dimension unknown (and not 1)
image = tf.placeholder_with_default(image, shape=[None, HEIGHT, WIDTH, NUM_CHANNELS])
features = {'image' : image}
return tf.estimator.export.ServingInputReceiver(features, inputs)
Run Code Online (Sandbox Code Playgroud)
完整代码在这里:https : //github.com/GoogleCloudPlatform/training-data-analyst/blob/61ab2e175a629a968024a5d09e9f4666126f4666126f4894/courses/machine_learning/deepdive/08_image/flowersmodel/trainer/model.py
| 归档时间: |
|
| 查看次数: |
1932 次 |
| 最近记录: |