我正在尝试将TensorFlow模型部署到Google平台上,用于在线预测。我有延迟和吞吐量问题,。
该模型在我的机器上运行不到1秒(只有一个英特尔核心I7 4790KCPU)的单一图像。我把它部署到一个有8个核心和一个NVIDIA T4 GPU的机器上的人工智能平台上。
在上述配置的AI平台上运行模型时,只要发送一幅图像,所需的时间就不到一秒钟。如果我开始发送多个请求,每个请求都有一个图像,模型最终会阻塞并停止响应。因此,我将在每个请求上发送成批图像(从2到10,取决于外部因素)。
问题是,我预期批处理的请求在时间上几乎是恒定的。当发送1幅图像时,CPU利用率约为10%,GPU利用率为12%。因此,我预计一批9幅图像将使用~100%的硬件,并在同一时间~1秒内作出响应,但事实并非如此。一批7到10张图像需要从15秒到50秒的之间的任何地方进行处理。
我已经试过优化我的模型了。我使用map_fn,用手动循环代替它,从浮点数32切换到浮点数16,尽量将操作向量化,但情况仍然相同。
我在这里错过了什么?
我正在使用最新的人工智能平台运行时进行在线预测(Python3.7,TensorFlow 2.1,CUDA10.1)。
该模型是一个大版本的YOLOv4 (~250 is的SavedModel格式)。我在TensorFlow中构建了几个后处理算法,这些算法对模型的输出进行操作。
最后但并非最不重要的一点是,我还尝试了用TensorBoard进行调试,结果表明TensorFlow图的YOLOv4部分占用了90%的处理时间。我预计模型的这个特定部分是高度并行的。
谢谢您在这方面的帮助。请向我询问您可能需要的任何信息,以更好地理解问题。
更新2020-07-13:在下面的评论中建议,我也尝试在CPU上运行这个模型,但是它确实很慢,并且遇到了与GPU相同的问题。它似乎不会并行处理来自单个请求的图像。
此外,我认为由于请求的速度和数量,我在TensorFlow服务方面遇到了问题。我在本地使用了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
}
}发布于 2020-08-07 20:21:28
对于使用AI平台时与我有相同问题的其他人:
正如Google 这里的评论所指出的那样,AI平台不会同时执行批量的实例。不过,他们计划增加这个功能。
我们已经从人工智能平台转移到了NVIDIA公司的Triton推理服务器的定制部署,该服务器位于引擎上。我们的性能比我们预期的要好得多,而且我们仍然可以对Triton提供的模型应用更多的优化。
感谢每一个试图通过回答这个答案来提供帮助的人。
发布于 2020-07-11 03:54:09
发布于 2020-07-14 02:43:40
该模型是一个大版本的YOLOv4 (~250 is的SavedModel格式)。我在TensorFlow中构建了几个后处理算法,这些算法对模型的输出进行操作。
您对YOLOv4做了哪些后处理修改?是否有可能经济放缓的根源是这些行动?在本地验证这一假设的一个测试是,根据您已经为修改过的版本所做的基准测试,对未经修改的YOLOv4版本进行基准测试。
最后但并非最不重要的一点是,我还尝试了用TensorBoard进行调试,结果表明TensorFlow图的YOLOv4部分占用了90%的处理时间。我预计模型的这个特定部分是高度并行的。
看一看这里提到的“调试输出”会很有趣。如果您使用先决条件,最昂贵的操作的细分是什么?我有一些研究TF操作系统的经验--在某些情况下,我发现了CPU <-> GPU数据传输瓶颈造成的一些奇怪的瓶颈。如果你想给我打个DM的话,我很乐意随时打个电话和你一起看看。
https://stackoverflow.com/questions/62844769
复制相似问题