Python 如何序列化Tensorflow服务请求以减少推断/预测延迟?
我使用TensorService InputReceiver从估计器导出了TF SavedModel,如下所示:Python 如何序列化Tensorflow服务请求以减少推断/预测延迟?,python,tensorflow,tensorflow-serving,Python,Tensorflow,Tensorflow Serving,我使用TensorService InputReceiver从估计器导出了TF SavedModel,如下所示: def serving_input_fn(): input_ph = tf.placeholder(tf.float32, shape=[None, 3, 224, 224], name = 'image_batches') input_tensors = input_ph return tf.estimator.export.TensorServingInp
def serving_input_fn():
input_ph = tf.placeholder(tf.float32, shape=[None, 3, 224, 224], name = 'image_batches')
input_tensors = input_ph
return tf.estimator.export.TensorServingInputReceiver(input_tensors, input_ph)
warm_start = tf.estimator.WarmStartSettings(CKPT_DIR)
classifier = tf.estimator.Estimator(model_fn = model_fn, warm_start_from = warm_start)
classifier.export_savedmodel(export_dir_base = SAVED_MODEL_DIR, serving_input_receiver_fn = serving_input_fn)
并按如下方式导出保存的模型:
def serving_input_fn():
input_ph = tf.placeholder(tf.float32, shape=[None, 3, 224, 224], name = 'image_batches')
input_tensors = input_ph
return tf.estimator.export.TensorServingInputReceiver(input_tensors, input_ph)
warm_start = tf.estimator.WarmStartSettings(CKPT_DIR)
classifier = tf.estimator.Estimator(model_fn = model_fn, warm_start_from = warm_start)
classifier.export_savedmodel(export_dir_base = SAVED_MODEL_DIR, serving_input_receiver_fn = serving_input_fn)
但是,当我使用此SavedModel在Tensorflow服务中执行预测时:
json_dict = {'signature_name': 'serving_default', 'instances': data}
当数据是一个numpy数组时,我使用SavedModel获得的速度仅为本地直接推断的1/5到1/6
目前我认为问题可能是JSON中请求的序列化部分。那么,是否有人知道如何在发送请求之前执行请求序列化,或者对为什么使用TF服务的推理速度比直接推理慢得多有什么建议?我也遇到过同样的情况,jason.dumps会导致90%的延迟,如果图像大小减小到(1100100,3)推理速度提高了3倍,因此基本上json.dumps文件太大,因此从内存中写入和读取会花费更多的时间。我尝试了ultrajson,即ujson,但没有任何明显的改进
trs = img1.tolist()
data = json.dumps({"signature_name": "serving_default", "instances": trs})
trs = img1.tolist()
data = json.dumps({"signature_name": "serving_default", "instances": trs})
由于我的模型架构需要INT,所以我看不到任何其他序列化数据的选项
有什么建议吗???我一直面临着同样的情况,jason.dumps会导致90%的延迟,如果图像大小减小到(1100100,3),推理速度会增加3倍,因此基本上json.dumps文件太大,因此从内存中写入和读取会花费更多的时间。我尝试了ultrajson,即ujson,但没有任何明显的改进
trs = img1.tolist()
data = json.dumps({"signature_name": "serving_default", "instances": trs})
trs = img1.tolist()
data = json.dumps({"signature_name": "serving_default", "instances": trs})
由于我的模型架构需要INT,所以我看不到任何其他序列化数据的选项
修改输入架构可以将UINT的输入需求转换为字符串,这可以通过
dl_request = requests.get(IMAGE, stream=True)
jpeg_bytes = base64.b64encode(dl_request.content).decode('utf-8')
predict_request = '{"instances" : [{"b64": "%s"}]}' % jpeg_bytes
response = requests.post(SERVER_URL, data=predict_request)
这会得到很好的结果,但是如何将模型输入类型从INT转换为STRING呢
有什么建议吗???我还观察到一些使用字符串的加速;然而,在我的例子中,由[batch_size,224,224,3]图像文件的json.dumps引起的延迟仍然很大。关于将模型输入类型从Int转换为String,也许您可以设计输入函数来接受String输入,并使用类似估计器输入函数的东西将String转换为Int?