Amazon web services Tensorflow docker映像未使用GPU进行推断/预测

Amazon web services Tensorflow docker映像未使用GPU进行推断/预测,amazon-web-services,docker,tensorflow,nvidia-docker,Amazon Web Services,Docker,Tensorflow,Nvidia Docker,我的要求: 使用tensorflow在GPU上运行推理任务以进行目标检测 当前状态: 我使用AWS GPU实例(p2.xlarge)进行培训和推理。 培训部分在GPU上运行良好。没问题。(图形卡:特斯拉M60) 为了获得预测,我创建了一个flask服务器,它封装了tensorflow检测和一些附加逻辑。我将把这个服务(Flask+tensorflow)部署为docker容器。我使用的基本图像是tensorflow/tensorflow:1.12.0-gpu-py3。我的dockerfile如下所

我的要求:

使用tensorflow在GPU上运行推理任务以进行目标检测

当前状态

我使用AWS GPU实例(p2.xlarge)进行培训和推理。 培训部分在GPU上运行良好。没问题。(图形卡:特斯拉M60)

为了获得预测,我创建了一个flask服务器,它封装了tensorflow检测和一些附加逻辑。我将把这个服务(Flask+tensorflow)部署为docker容器。我使用的基本图像是
tensorflow/tensorflow:1.12.0-gpu-py3
。我的
dockerfile
如下所示:

FROM tensorflow/tensorflow:1.12.0-gpu-py3
COPY ./app /app
COPY ./requirements.txt /app
RUN pip3 install -r /app/requirements.txt
RUN mkdir /app/venv
WORKDIR /app
RUN export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
ENTRYPOINT ["python3", "/app/main.py"]
ENV LISTEN_PORT 8080
EXPOSE 8080
我可以通过以下方式进行部署:

docker run --runtime=nvidia --gpus all --name <my-long-img-name> 
-v <somepath>:<anotherpath> -p 8080:8080 -d <my-long-img-name>
当我调用这个端点时,我没有收到任何错误(如果没有检测到gpu,它将抛出错误)。这意味着检测到此代码段的gpu。耶

我还将这两行代码添加到我的主代码执行流中:

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
它输出:

Local devices : 
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 17661279486087266140
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 9205152708262911170
physical_device_desc: "device: XLA_GPU device"
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 3134142118233627849
physical_device_desc: "device: XLA_CPU device"
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 7447009690
locality {
  bus_id: 1
  links {
  }
}
incarnation: 6613138223738633761
physical_device_desc: "device: 0, name: Tesla M60, pci bus id: 0000:00:1e.0, compute capability: 5.2"
]
是的,GPU再次被检测到

甚至tensorflow的日志也使用GPU

2019-11-18 08:45:29.944580: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-11-18 08:45:29.944603: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988]      0 
2019-11-18 08:45:29.944611: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0:   N 
2019-11-18 08:45:29.944721: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7101 MB memory) -> physical GPU (device: 0, name: Tesla M60, pci bus id: 0000:00:1e.0, compute capability: 5.2)
这里的一切似乎都很顺利,但GPU应该运行的主要部分是不使用它。它正在使用CPU。还有另一个端点(比如说,
/getpredictions
)以及上面提到的运行检测并返回输出的
/testgpu

问题: 每当我从8080端口的postman调用
/getpredictions
,而不是使用GPU时,都需要CPU,并在大约30秒以上的时间内返回输出

这里少了什么东西吗?有解决办法吗


如果我需要为问题添加更多信息,请告诉我

从文档中,您应该在运行容器时添加gpu选项 像这样:

FROM tensorflow/tensorflow:1.12.0-gpu-py3
COPY ./app /app
COPY ./requirements.txt /app
RUN pip3 install -r /app/requirements.txt
RUN mkdir /app/venv
WORKDIR /app
RUN export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
ENTRYPOINT ["python3", "/app/main.py"]
ENV LISTEN_PORT 8080
EXPOSE 8080

docker run-it--gpus all-p 8888:8888 tensorflow/tensorflow:latest gpu jupyter

查看处理
getpredictions/
端点的flask代码将非常有用。@v25该端点接收一个文件并对该文件运行推断,然后返回输出。这个端点为单个图像运行
run\u expression\u
方法,该方法来自链接代码中的该方法,它没有使用tf.device('/gpu:0'):指定
,就像您的
testgpu()
方法一样,所以我要检查
getpredictions/
路由中的方法。也许这是一个不需要动脑筋的问题:-)必须在没有看到代码的情况下说。@v25我试着在那里包括
tf.device('/gpu:0'):
。实际上在多个地方,但无法让它在GPU上运行。另外,我相信TensorFlow默认使用GPU(如果Cuda驱动程序配置正确的话)。您如何确定GPU没有被使用?只是延迟不好,或者您正在分析gpu?我想知道在加载模型时是否会增加很多额外的延迟。您可以在同一图像上尝试多个预测并计时。一般来说,第一个预测会花费额外的时间,就像在这个链接中一样:它会根据您使用的模型而变化。