Python TensorFlow GPU内存使用和推断时间:奇怪的行为

Python TensorFlow GPU内存使用和推断时间:奇怪的行为,python,performance,tensorflow,object-detection,Python,Performance,Tensorflow,Object Detection,我正在使用TensorFlow(1.2,GPU)实现更快的R-CNN()。当我使用demo.py代码在一些示例图像上运行VGG16网络(在PASCAL VOC07上训练)时,运行时间很奇怪:即使我提供相同的图像,它也会发生很大变化 侧注:所有输入图像都已调整大小,以便较短侧为600像素,较长侧最大为1000像素;因此,所有输入图像的大小大致相同 GPU:GTX 1060 6GB 使用tfconfig.gpu\u选项。允许增长=True 图像分辨率,000456.jpg:500x375;00018

我正在使用TensorFlow(1.2,GPU)实现更快的R-CNN()。当我使用demo.py代码在一些示例图像上运行VGG16网络(在PASCAL VOC07上训练)时,运行时间很奇怪:即使我提供相同的图像,它也会发生很大变化

侧注:所有输入图像都已调整大小,以便较短侧为600像素,较长侧最大为1000像素;因此,所有输入图像的大小大致相同

GPU:GTX 1060 6GB

使用tfconfig.gpu\u选项。允许增长=True

图像分辨率,000456.jpg:500x375;000188.png:1224x370

数据演示/Demo/000456.jpg 300个目标提案的检测耗时2.187s
数据演示/Demo/000456.jpg 300个对象建议的检测耗时0.141s
数据演示/Demo/000188.png 300个对象提案的检测耗时1.321秒
数据演示/Demo/000188.png 对300个对象提案的检测耗时0.112秒

更改图像顺序:

数据演示/Demo/000188.png 300个目标提案的检测耗时1.760秒
数据演示/Demo/000188.png 300个对象建议的检测时间为0.109s
数据演示/Demo/000456.jpg 300个目标提案的检测耗时1.775秒
数据演示/Demo/000456.jpg 对300个目标提案的检测耗时0.142s

使用tfconfig.gpu\u选项。每\u进程\u gpu\u内存\u分数=0.8

数据演示/Demo/000188.png 300个目标提案的检测耗时1.699秒
数据演示/Demo/000188.png 300个对象建议的检测耗时0.114秒
数据演示/Demo/000456.jpg 300个目标提案的检测耗时1.782秒
数据演示/Demo/000456.jpg 对300个目标提案的检测耗时0.142s

看起来,当图像大小从小到大或从大到小发生变化时,第一个图像的处理时间很长,而后续类似大小的图像则要短得多(约0.1秒)。当我提供所有不同的图像时,会出现类似的行为

我想不出对这种奇怪行为的解释。 它似乎在某种程度上与内存分配/释放有关,但如何呢? 您是否知道会发生什么情况以及如何避免这种行为,即第一个映像可能需要很长时间来处理(内存分配、缓存等),但所有后续映像都需要正常/更短的时间(我认为)

编辑:以下显示PASCAL VOC 2007对象检测测试集的运行时间(使用tfconfig.gpu\u选项。允许\u增长=True)。在这种情况下,推断时间从2.3秒逐渐减少到0.25秒,尽管图像大小大致相同

im_检测:1/4952 2.326s 0.001s
im_检测:2/4952 2.153s 0.001s
im_检测:3/4952 2.047s 0.001s
im_检测:4/4952 1.971s 0.001s
im_检测:5/4952 1.606s 0.001s
im_检测:6/4952 1.363s 0.001s
im_检测:7/4952 1.433s 0.001s
im_检测:8/4952 1.507s 0.001s
im_检测:9/4952 1.356s 0.001s
im_检测:10/4952 1.424s 0.001s
im_检测:11/4952 1.307s 0.001s
im_检测:12/4952 1.210s 0.001s
im_检测:13/4952 1.198s 0.001s
im_检测:14/4952 1.123s 0.001s

im_检测:60/4952 0.733s 0.001s
im_检测:61/4952 0.723s 0.001s
im_检测:62/4952 0.713s 0.001s
im_检测:63/4952 0.704s 0.001s
im_检测:64/4952 0.696s 0.001s
im_检测:65/4952 0.687s 0.001s

im_检测:250/4952 0.463s 0.001s
im_检测:251/4952 0.462s 0.001s
im_检测:252/4952 0.468s 0.001s
im_检测:253/4952 0.466s 0.001s
im_检测:254/4952 0.470s 0.001s
im_检测:255/4952 0.469s 0.001s

im_检测:4948/4952 0.245s 0.001s
im_检测:4949/4952 0.245s 0.001s
im_检测:4950/4952 0.245s 0.001s
im_检测:4951/4952 0.245s 0.001s

im_detect:4952/4952 0.245s 0.001s

您是否尝试过交替图像而不是一个接一个的精确图像?有可能它被缓存在GPU内存中,从而节省了CPU的写入周期。正如我在第二段到最后一段末尾所说的:“当我提供所有不同的图像时,类似的行为。”事实上,这是第一个实验。当我看到运行时间的巨大差异时,我想看看当我提供相同的图像时会发生什么,结果是一样的。很抱歉,我错过了。所有不同的图像,比如1.jpg 2.jpg 3.jpg?是的,所有不同的图像,比如1.jpg,2.jpg,3.jpg,。。。趋势是一样的。当图像序列中的分辨率增加/减少时,推断时间会出现峰值,然后对于具有相同分辨率的下一幅图像恢复正常。