服务于 Google AI Platform 在线预测的 TensorFlow 模型对于实例批处理太慢

标签 tensorflow google-cloud-platform tensorflow-serving google-cloud-ml tensorflow2.x

我正在尝试将 TensorFlow 模型部署到 Google AI Platform 以进行在线预测。我遇到了延迟和吞吐量问题

对于单个图像,该模型在我的机器上运行不到 1 秒(仅使用 Intel Core I7 4790K CPU)。我将它部署到一台配备 8 核和 NVIDIA T4 GPU 的机器上的 AI Platform。

在 AI Platform 上以上述配置运行模型时,如果只发送一张图像,只需不到一秒的时间。如果我开始发送许多请求,每个请求带有一张图片,模型最终会阻塞并停止响应。因此,我改为针对每个请求发送一批图像(从 2 到 10,取决于外部因素)。

问题是我预计批处理的请求在时间上几乎是恒定的。发送 1 张图像时,CPU 使用率约为 10%,GPU 为 12%。所以我预计一批 9 张图像将使用 ~100% 的硬件并同时响应 ~1 秒,但事实并非如此。处理一批 7 到 10 张图像需要 15 到 50 秒

我已经尝试优化我的模型。我用的是 map_fn ,将其替换为手动循环,从 Float 32 切换到 Float 16,尝试尽可能向量化操作,但仍然处于相同的情况。

我在这里错过了什么?

我正在使用最新的 AI Platform 运行时进行在线预测(Python 3.7、TensorFlow 2.1、CUDA 10.1)。

该模型是 YOLOv4 的大型版本(SavedModel 格式约为 250MB)。我在 TensorFlow 中构建了一些对模型输出进行操作的后处理算法。

最后但同样重要的是,我还尝试使用 TensorBoard 进行调试,结果发现 TensorFlow Graph 的 YOLOv4 部分占用了大约 90% 的处理时间。我希望模型的这个特定部分是高度并行的。

提前感谢您对此提供的任何帮助。请向我询问您可能需要的任何信息,以便更好地理解该问题。

2020-07-13 更新:正如下面评论中所建议的,我也尝试在 CPU 上运行模型,但它真的很慢并且遇到同样的问题与 GPU 相比。它似乎无法并行处理来自单个请求的图像。

此外,我认为由于请求的速率和数量,我在使用 TensorFlow Serving 时遇到了问题。我用了 tensorflow/serving:latest-gpu本地 Docker 镜像以进一步测试。该模型在我的机器(GeForce GTX 1650)上的回答速度比在 AI 平台上快 3 倍,但它确实与响应时间不一致。我得到以下响应时间 ( <amount of images> <response time in milliseconds> ):

3 9004
3 8051
11 4332
1 222
3 4386
3 3547
11 5101
9 3016
10 3122
11 3341
9 4039
11 3783
11 3294

然后,运行一分钟后,我开始出现延迟和错误:

3 27578
3 28563
3 31867
3 18855
{
  message: 'Request failed with status code 504',
  response: {
    data: { error: 'Timed out waiting for notification' },
    status: 504
  }
}

最佳答案

在使用AI Platform时遇到和我一样问题的 friend :

如 Google Cloud 团队的评论所述 here , AI Platform 不会一次执行批量实例。不过,他们计划添加该功能。

从那以后,我们已经从 AI 平台转移到托管在 Google Cloud Compute Engine 上的 NVIDIA Triton 推理服务器的自定义部署。我们获得的性能比我们预期的要好得多,而且我们仍然可以对 Triton 提供的模型应用更多优化。

感谢所有试图通过回复此答案来提供帮助的人。

关于服务于 Google AI Platform 在线预测的 TensorFlow 模型对于实例批处理太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62844769/

相关文章:

python - 为什么 "tf.Variable([.3], tf.float32)"在 tensorflow 中工作?

tensorflow - 如何在 Graphcore IPU 上实现模型并行?

ssh - 连接到GCP数据实验室导致错误255

google-cloud-platform - 服务于内部和外部用户 GCP 的负载均衡服务

java - 用 java 编写的 Tensorflow-serving 客户端没有给出正确的结果

python - 如何使用编译器标志重建 tensorflow?

python - keras中的加权mse自定义损失函数

java - 如何使用 Java 将查询数据从 Google Cloud Datastore 导出到 csv?

tensorflow - 带有 "--ssl_confog_file"的 tensorflow_model_server 问题

python - 如何编写包含持久 C++ 对象的 TensorFlow 自定义操作?