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