Python 理解为什么tensor.numpy()很慢

Python 理解为什么tensor.numpy()很慢,python,numpy,tensorflow,tf.keras,Python,Numpy,Tensorflow,Tf.keras,我试图用预先训练好的自定义图像分割模型对一些图像数据进行预测,但我遇到了预测速度太慢的问题。 在使用进行一些分析之后,我发现调用numpy()占用了大部分运行时间。 这让我很惊讶,因为据我所知,该函数所要做的就是将预测数据从GPU复制回主机,也许还需要做一些其他事情来将数据转换为numpy数组 我制作了一个最小的工作示例,显示了以下效果: 将numpy导入为np 导入tensorflow作为tf 从pyinstrument导入分析器 model=tf.keras.applications.res

我试图用预先训练好的自定义图像分割模型对一些图像数据进行预测,但我遇到了预测速度太慢的问题。 在使用进行一些分析之后,我发现调用
numpy()
占用了大部分运行时间。
这让我很惊讶,因为据我所知,该函数所要做的就是将预测数据从GPU复制回主机,也许还需要做一些其他事情来将数据转换为numpy数组

我制作了一个最小的工作示例,显示了以下效果:

将numpy导入为np
导入tensorflow作为tf
从pyinstrument导入分析器
model=tf.keras.applications.resnet50.resnet50(include_top=False,input_shape=(6722048,3))
数据=np.零((16722048,3))
探查器=探查器()
profiler.start()
对于范围(1000)内的:
预测=模型。批量预测(数据)
输出=预测。numpy()
profiler.stop()
打印(profiler.output_text())
该代码产生以下Pyinstrument输出:

  _     ._   __/__   _ _  _  _ _/_   Recorded: 15:50:54  Samples:  6759
 /_//_/// /_\ / //_// / //_'/ //     Duration: 56.536    CPU time: 56.406
/   _/                      v3.1.0

Program: test.py

56.536 <module>  test.py:1
|- 42.315 numpy  tensorflow_core\python\framework\ops.py:918
|     [4 frames hidden]  tensorflow_core
|        39.179 _numpy  tensorflow_core\python\framework\ops.py:905
|- 12.667 predict_on_batch  tensorflow_core\python\keras\engine\training.py:1220
|     [7705 frames hidden]  tensorflow_core, ast, _weakrefset, we...
`- 1.553 [self]

正如您所看到的,
predict\u on_batch()
的时间仍然大致相同,但是通过等待一点,在
numpy()
中花费的时间大大减少了。对我来说,这似乎指向了我的理论,即当到达
numpy()
时,输出尚未完全就绪,因此它必须等待一段时间才能生成数组。不过我还是不太满意,有人能解释一下情况吗?是否可以采取任何措施来提高性能?

“该功能所要做的就是将预测数据从GPU复制回主机”,这是一个(相对)缓慢的操作。根据您的问题和模型,您必须评估GPU计算(相对于CPU)的收益是否值得将东西移入和移出GPU的额外开销,特别是在您一次只预测一个输入的情况下进行推断。@jdehesa是的,复制是一项昂贵的操作。但是将数据复制到设备的时间应该与从设备复制回数据的时间大致相同,对吗?在这种情况下,我希望
predict\u on\u batch()
numpy()
所需的时间大致相同,或者
predict\u on\u batch()
所需的时间稍长,因为它也在进行计算。在这种情况下,在CPU上进行推理是完全不可行的,模型太大了。我也有这个问题。现在,我正在尝试将模型转换为TensorRT,以及非TensorRT SavedModel。如果其中任何一项有效,我将发布一个带有详细步骤的答案。你在理解这个问题上有什么进展吗?不幸的是,我没有学到更多。我很想知道你是否成功。
  _     ._   __/__   _ _  _  _ _/_   Recorded: 12:03:52  Samples:  7821
 /_//_/// /_\ / //_// / //_'/ //     Duration: 135.388   CPU time: 25.641
/   _/                      v3.1.0

Program: test.py

135.388 <module>  test.py:1
|- 105.639 [self]
|- 16.191 numpy  tensorflow_core\python\framework\ops.py:918
|     [4 frames hidden]  tensorflow_core
`- 13.558 predict_on_batch  tensorflow_core\python\keras\engine\training.py:1220
      [7839 frames hidden]  tensorflow_core, ast, _weakrefset, we...