如何提升Tensorflow服务性能( 三 )

  • Tensorflow Graph上的操作彼此独立 , 因此可以在不同的线程上运行 。
  • 两个选项的默认值都设置为0 。这意味着 , 系统会选择一个合适的数字 , 这通常需要每个CPU核心有一个线程可用 。
    接下来 , 与之前类似地启动服务容器 , 这次使用从源码构建的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
    如何提升Tensorflow服务性能

    文章插图
     
    容器日志不应再显示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和tensorflow/serving存储库并将以下protobuf文件复制到客户端项目中:
    如何提升Tensorflow服务性能

    文章插图
     
    将上述protobuf文件复制到protos/目录中并保留原始路径:
    如何提升Tensorflow服务性能

    文章插图
     
    为简单起见 , 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服务性能

    文章插图
     
    现在tensorflow_serving可以删除整个模块:
    from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2
    如何提升Tensorflow服务性能

    文章插图
     
    并替换为生成的protobufs protos/tensorflow_serving/apis:
    from protos.tensorflow_serving.apis import predict_pb2 from protos.tensorflow_serving.apis import prediction_service_pb2
    如何提升Tensorflow服务性能

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

    文章插图
     
    使用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)
    如何提升Tensorflow服务性能

    文章插图
     
    完整的python脚本在这里可用(https://gist.github.com/masroorhasan/0e73a7fc7bb2558c65933338d8194130) 。运行更新的初始客户端 , 该客户端将预测请求发送到优化的Tensorflow服务:


    推荐阅读