Python docker托管应用程序中Tensorflow服务的性能惩罚

Python docker托管应用程序中Tensorflow服务的性能惩罚,python,tensorflow,flask,gunicorn,tensorflow-serving,Python,Tensorflow,Flask,Gunicorn,Tensorflow Serving,当调用应用程序托管在docker容器中时,对Tensorflow服务的调用会造成很大的性能损失。我希望有人能提出一些建议。下面是有关设置和我尝试的内容的详细信息 情景1: Docker(版本18.09.0,构建4d60db4)按照说明托管Tensorflow模型 在主机上运行的Flask应用程序(不在容器中) 使用gRPC向模型发送请求 性能:0.0061秒/每次预测 情景2: 相同的docker容器托管Tensorflow模型 容器托管的烧瓶应用程序在主机上运行(与模型位于同一容器内)

当调用应用程序托管在docker容器中时,对Tensorflow服务的调用会造成很大的性能损失。我希望有人能提出一些建议。下面是有关设置和我尝试的内容的详细信息

情景1:

  • Docker(版本18.09.0,构建4d60db4)按照说明托管Tensorflow模型
  • 在主机上运行的Flask应用程序(不在容器中)
  • 使用gRPC向模型发送请求
  • 性能:0.0061秒/每次预测
情景2:

  • 相同的docker容器托管Tensorflow模型
  • 容器托管的烧瓶应用程序在主机上运行(与模型位于同一容器内)
  • 使用gRPC向模型发送请求
  • 性能:0.0107/每预测
换句话说,当应用程序与模型托管在同一容器中时,性能会降低约40%

我已经记录了应用程序中几乎每一步的计时,并一直追踪到这一行:

result = self.stub.Predict(self.request, 60.0)
在容器托管的应用程序中,此操作的平均往返时间为0.006秒。对于容器外部托管的同一应用程序,此行的往返时间为0.002秒

这是我用来建立模型连接的函数

def TFServerConnection():
    channel = implementations.insecure_channel('127.0.0.1', 8500)
    stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
    request = predict_pb2.PredictRequest()
    return (channel, stub, request)
我曾尝试在单独的容器中托管应用程序和模型,构建自定义Tensorflow服务容器(针对我的VM进行了优化),并使用RESTAPI(这两种情况下的性能都略有下降)

编辑1

为了添加更多信息,我使用以下命令运行docker容器:

docker run \
    --detach \
    --publish 8000:8000 \
    --publish 8500:8500 \
    --publish 8501:8501 \
    --name tfserver \
    --mount type=bind,source=/home/jason/models,target=/models \
    --mount type=bind,source=/home/jason/myapp/serve/tfserve.conf,target=/config/tfserve.conf \
    --network host \
    jason/myapp:latest
编辑2

我现在发现这是stub.Predict(request,60.0)仅在Flask应用程序中存在的问题。看来Docker不是问题所在。下面是我目前正在运行的Flask和Tensorflow的版本

$ sudo pip3 freeze | grep Flask
Flask==1.0.2

$ sudo pip3 freeze | grep tensor
tensorboard==1.12.0
tensorflow==1.12.0
tensorflow-serving-api==1.12.0
我使用gunicorn作为我的WSGI服务器:

gunicorn --preload --config config/gunicorn.conf app:app
以及config/gunicorn.conf的内容:

bind = "0.0.0.0:8000"
workers = 3
timeout = 60
worker_class = 'gevent'
worker_connections = 1000
编辑3


我现在已经把问题缩小到了一个小范围。我直接使用
app.run()
运行Flask应用程序,获得了与使用gunicorn时相同的性能。Flask会做什么来延缓对Tensorflow的调用?

接下来的运气如何?:\@不幸的是,jtlz2没有。我们已经转移到了一个更容易横向扩展的平台,从而通过蛮力缓解了瓶颈,我正在pytorch中开发大多数新模型。