如何为 tensorflow 服务准备预热请求文件?

Posted

技术标签:

【中文标题】如何为 tensorflow 服务准备预热请求文件?【英文标题】:How to prepare warmup request file for tensorflow serving? 【发布时间】:2019-01-29 12:21:24 【问题描述】:

当前版本的 tensorflow-serving 尝试从 assets.extra/tf_serving_warmup_requests 文件加载预热请求。

2018-08-16 16:05:28.513085: I tensorflow_serving/servables/tensorflow/saved_model_warmup.cc:83] 在 /tmp/faster_rcnn_inception_v2_coco_2018_01_28_string_input_version-export/1/assets.extra/tf_serving_warmup_requests 找不到预热数据文件

>

不知道 tensorflow 是否提供通用 api 来将请求导出到该位置?还是我们应该手动向该位置写入请求?

【问题讨论】:

【参考方案1】:

此时没有用于将预热数据导出到 assets.extra 的通用 API。写个脚本比较简单(类似下图):

import tensorflow as tf
from tensorflow_serving.apis import model_pb2
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_log_pb2

def main():
    with tf.python_io.TFRecordWriter("tf_serving_warmup_requests") as writer:
        request = predict_pb2.PredictRequest(
            model_spec=model_pb2.ModelSpec(name="<add here>"),
            inputs="examples": tf.make_tensor_proto([<add here>])
        )
    log = prediction_log_pb2.PredictionLog(
        predict_log=prediction_log_pb2.PredictLog(request=request))
    writer.write(log.SerializeToString())

if __name__ == "__main__":
    main()

【讨论】:

谢谢!我几乎也是这样做的。只是想知道是否有更标准的方式。 已在 /home/serving/models/1/assets.extra/tf_serving_warmup_requests 读取模型的预热数据。读取的预热记录数:150。 --------------------------------- 添加预热 tfrecords 后,我在哪里放脚本还是我必须经常调用脚本还是只传递 tfrecord,tfserving 会自己处理频繁调用以改善延迟。【参考方案2】:

我们参考了official doc

特别是,我们使用分类而不是预测,因此我们将代码更改为 log = prediction_log_pb2.PredictionLog( classify_log=prediction_log_pb2.ClassifyLog(request=<request>))

【讨论】:

官方文档现在tensorflow.org/tfx/serving/saved_model_warmup【参考方案3】:

这是一个使用 ResNet model 的对象检测系统的完整示例。预测由图像组成。

import tensorflow as tf
import requests
import base64

from tensorflow.python.framework import tensor_util
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_log_pb2


IMAGE_URL = 'https://tensorflow.org/images/blogs/serving/cat.jpg'
NUM_RECORDS = 100


def get_image_bytes():
    image_content = requests.get(IMAGE_URL, stream=True)
    image_content.raise_for_status()
    return image_content.content


def main():
    """Generate TFRecords for warming up."""

    with tf.io.TFRecordWriter("tf_serving_warmup_requests") as writer:
        image_bytes = get_image_bytes()
        predict_request = predict_pb2.PredictRequest()
        predict_request.model_spec.name = 'resnet'
        predict_request.model_spec.signature_name = 'serving_default'
        predict_request.inputs['image_bytes'].CopyFrom(
            tensor_util.make_tensor_proto([image_bytes], tf.string))        
        log = prediction_log_pb2.PredictionLog(
            predict_log=prediction_log_pb2.PredictLog(request=predict_request))
        for r in range(NUM_RECORDS):
            writer.write(log.SerializeToString())    

if __name__ == "__main__":
    main()

此脚本将创建一个名为“tf_serving_warmup_requests”的文件

我将此文件移至 /your_model_location/resnet/1538687457/assets.extra/,然后重新启动我的 docker 映像以获取新的更改。

【讨论】:

以上是关于如何为 tensorflow 服务准备预热请求文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何为多个模型使用 tensorflow 服务

如何为生产准备 nodejs?

如何为通用 HTTP 请求的响应文件指定唯一名称?

如何为 TensorFlow 变量赋值?

如何为 svmstruct 准备输入文件

TensorFlow 2.0 Keras:如何为 TensorBoard 编写图像摘要