接下来 , 与之前类似地启动服务容器 , 这次使用从源码构建的docker映像 , 并使用Tensorflow特定的CPU优化标志:
docker run -d -p 9000:8500-v $(pwd)/models:/models/resnet -e MODEL_NAME=resnet-t $USER/tensorflow-serving:$TAG--tensorflow_intra_op_parallelism=4--tensorflow_inter_op_parallelism=4

文章插图
容器日志不应再显示CPU警告警告 。在不更改任何代码的情况下 , 运行相同的预测请求会使预测延迟降低约35.8%:
python tf_serving_client.py --image=images/pupper.jpg total time: 1.64234706879s
提高预测客户端的速度服务器端已针对其CPU平台进行了优化 , 但超过1秒的预测延迟似乎仍然过高 。
加载tensorflow_serving和tensorflow库的延迟成本很高 。每次调用tf.contrib.util.make_tensor_proto也会增加不必要的延迟开销 。
我们实际上并不需要的tensorflow或tensorflow_serving包进行预测的请求 。
如前所述 , Tensorflow预测API被定义为protobufs 。因此 , 可以通过生成必要的tensorflow和tensorflow_servingprotobuf python存根来替换这两个外部依赖项 。这避免了在客户端本身上Pull整个Tensorflow库 。
首先 , 摆脱tensorflow和tensorflow_serving依赖关系 , 并添加grpcio-tools包 。
pip uninstall tensorflow tensorflow-serving-api &&pip install grpcio-tools==1.0.0

文章插图
【如何提升Tensorflow服务性能】
克隆tensorflow/tensorflow和tensorflow/serving存储库并将以下protobuf文件复制到客户端项目中:

文章插图
将上述protobuf文件复制到protos/目录中并保留原始路径:

文章插图
为简单起见 , predict_service.proto可以简化为仅实现Predict RPC 。这样可以避免引入服务中定义的其他RPC的嵌套依赖项 。这是简化的一个例子prediction_service.proto(https://gist.github.com/masroorhasan/8e728917ca23328895499179f4575bb8) 。
使用grpcio.tools.protoc以下命令生成gRPC python实现:
PROTOC_OUT=protos/ PROTOS=$(find . | grep ".proto$") for p in $PROTOS; dopython -m grpc.tools.protoc -I . --python_out=$PROTOC_OUT --grpc_python_out=$PROTOC_OUT $pdone

文章插图
现在tensorflow_serving可以删除整个模块:
from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2

文章插图
并替换为生成的protobufs protos/tensorflow_serving/apis:
from protos.tensorflow_serving.apis import predict_pb2 from protos.tensorflow_serving.apis import prediction_service_pb2

文章插图
导入Tensorflow库是为了使用辅助函数make_tensor_proto , 该函数用于将 python / numpy对象封装为TensorProto对象 。
因此 , 我们可以替换以下依赖项和代码段:
import tensorflow as tf ...tensor = tf.contrib.util.make_tensor_proto(features) request.inputs['inputs'].CopyFrom(tensor)

文章插图
使用protobuf导入并构建TensorProto对象:
from protos.tensorflow.core.framework import tensor_pb2 from protos.tensorflow.core.framework import tensor_shape_pb2 from protos.tensorflow.core.framework import types_pb2 ...# ensure NHWC shape and build tensor prototensor_shape = [1]+list(img.shape) dims = [tensor_shape_pb2.TensorShapeProto.Dim(size=dim) for dim in tensor_shape] tensor_shape = tensor_shape_pb2.TensorShapeProto(dim=dims) tensor = tensor_pb2.TensorProto(dtype=types_pb2.DT_FLOAT, tensor_shape=tensor_shape, float_val=list(img.reshape(-1)))request.inputs['inputs'].CopyFrom(tensor)

文章插图
完整的python脚本在这里可用(https://gist.github.com/masroorhasan/0e73a7fc7bb2558c65933338d8194130) 。运行更新的初始客户端 , 该客户端将预测请求发送到优化的Tensorflow服务:
推荐阅读
- 帝国cms二维码收款功能如何实现?帝国cms实现二维码收款功能演示
- 如何使用 Linux Cockpit 来管理系统性能
- 红茶专家教您如何将正山小种红茶存放至8年
- 祁门工夫价格多少钱斤如何辨别祁门红茶好坏
- 如何冲泡红茶 正确的红茶冲泡方法新手必看
- 如何选购正宗的正山小种红茶 购买正山小种需要注意这6大点
- 如何选购台式电脑硬盘?小白装机选购固态硬盘和机械硬盘知识指南
- 勃起不坚如何调理 勃起不坚怎么办
- 化妆品|美容行业九大痛苦现状,如何解决生存之道?
- 说说金骏眉的起源历史 如何识别正宗的金骏眉
