【问题标题】:How to estimate Inference time from average forward pass time in caffe?如何从 caffe 中的平均前向传递时间估计推理时间?
【发布时间】:2016-04-27 04:16:26
【问题描述】:

我使用这个命令在 caffe 中对我的 ConvNet 进行基准测试:

./build/tools/caffe time -model models/own_xx/deploy.prototxt -weights examples/RSR_50k_all_1k_db/snapshot_iter_10000.caffemodel -gpu=0

它运行良好并生成以以下结尾的输出:

I0426 16:08:19.345427 15441 caffe.cpp:377] Average Forward pass: 13.5549 ms.
I0426 16:08:19.345484 15441 caffe.cpp:379] Average Backward pass: 10.7661 ms.
I0426 16:08:19.345527 15441 caffe.cpp:381] Average Forward-Backward: 25.2922 ms.
I0426 16:08:19.345579 15441 caffe.cpp:383] Total Time: 1264.61 ms.
I0426 16:08:19.345628 15441 caffe.cpp:384] *** Benchmark ends ***

在一些教程中,我看到这个家伙以某种方式简单地从平均前向传递中推断出分类时间。但是,我找不到任何解释如何做到这一点的公式或材料。这两个实体之间实际上存在某种联系吗?还有哪些其他因素涉及迭代次数和批量大小?我的目标是准确预测我的 ConvNet 在 GPU 上的分类时间。

更新:为了不显得完全无知,我将在这里补充一点,我有一个基本概念,即前向传递是输入生成相对输出所花费的时间,因此它也可以称为推理时间。但是,我感兴趣的是知道这是否是真的,而不管批量大小和迭代如何?我尝试过,但在基准测试期间,caffe 不提供任何“批处理”选项。

【问题讨论】:

  • 你的 deploy.prototxt 有输入层吗?查看 prototxt 中定义的输入大小,这将告诉您 caffe 用于计时的批量大小
  • @Shai 是的,当我自己编写网络时,我确信批量大小。我无法弄清楚它与图像的前向传递和分类时间有何关系。找到图像的分类时间是我的目标。

标签: benchmarking caffe conv-neural-network


【解决方案1】:

平均前向传递时间是将一批输入从输入(“数据”)层传播到输出层所需的时间。 models/own_xx/deploy.prototxt 文件中指定的批量大小将决定每批处理的图像数量。

例如,如果我运行 Caffe 自带的默认命令:

build/tools/caffe time --model=models/bvlc_alexnet/deploy.prototxt --gpu=0

我得到以下输出

...
I0426 13:07:32.701490 30417 layer_factory.hpp:77] Creating layer data
I0426 13:07:32.701513 30417 net.cpp:91] Creating Layer data
I0426 13:07:32.701529 30417 net.cpp:399] data -> data
I0426 13:07:32.709048 30417 net.cpp:141] Setting up data
I0426 13:07:32.709079 30417 net.cpp:148] Top shape: 10 3 227 227 (1545870)
I0426 13:07:32.709084 30417 net.cpp:156] Memory required for data: 6183480
...
I0426 13:07:34.390281 30417 caffe.cpp:377] Average Forward pass: 16.7818 ms.
I0426 13:07:34.390290 30417 caffe.cpp:379] Average Backward pass: 12.923 ms.
I0426 13:07:34.390296 30417 caffe.cpp:381] Average Forward-Backward: 29.7969 ms.

下面一行:

I0426 13:07:32.709079 30417 net.cpp:148] Top shape: 10 3 227 227 (1545870)

非常重要。它说你的输入层是 10x3x227x227 维的。在这种情况下,批量大小为 10 张图像,每张图像大小为 3x227x227(3 表示图像中的每个 rgb 通道)。

如此有效,每张图像执行前向传递或推理时间需要 1.67818 毫秒/图像。

更改批量大小

如果您想更改批量大小,请查看您的 .prototxt 文件。这 Caffe 自带的models/bvlc_alexnet/deploy.prototxt 文件如下:

name: "AlexNet"
layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }
}
layer { ...

只需将 dim: 10 更改为其他值(例如“100”以指定每次前向传递的批量大小为 100 个图像)。

【讨论】:

  • 感谢您清晰详细的解释。我现在明白了。但是,我有一个后续问题。使用这种方法,我测试了各种批量大小以获得分类时间。我的结果是:CT: 0.098ms with Batchsize of 6000 CT: 0.11ms with Batchsize of 1000 CT: 0.18ms with Batchsize of 100 CT: 1.07ms with Batchsize of 10 CT: 7.68ms with Batchsize of 1 我想知道为什么推理时间也会随着批量大小而变化。我正在使用 NVIDIA TX1 进行这些测试。
  • 我可以猜到:我在批量大小为 1 和 10 时未充分利用 GPU 的能力。对于较大的批量大小(100,1000,6000),时间约为 0.1 毫秒。 C。这也表明我可以充分利用我的 GPU 以获得高内存成本或节省内存并保持 GPU 未得到充分利用。我做出这些假设是否正确。请添加我错过的内容。
  • 我还想补充一点,如果我将批处理大小增加到 7000 以上。进程会自动终止,我猜是由于内存不足。
  • 您对批量大小和 GPU 利用率的直觉是正确的;我们需要在 GPU(大批量)上进行足够的工作,以充分利用其所有资源。一个简单的类比是面包师在烤箱中烘烤饼干。虽然我们一次可以烤 100 个饼干,但考虑到我们的烤箱可以一次烤 100 个饼干,这是愚蠢的。烤箱有足够的功率烘烤所有 100 次,而不是烘烤 100 次饼干。是的,对于足够大的批量大小,GPU 可能会耗尽内存。在我们的烘焙类比中,这就像在烤箱里塞了一百万块饼干......它就是不适合。
  • 感谢您的详细解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
相关资源
最近更新 更多