你可能会疑惑:配置中怎么没有 NNPACK?这确实有点复杂,由 ajtulloch 制作的 Caffe 分支提供了使用 NNPACK 的最直接的方法。然而自从它被集成进去以后,NNPACK API 就已经改变了,并且目前我们不能编译它)。Caffe2 对 NNPACK 有原生支持,但我不会考虑 Caffe2,因为它处于实验性阶段并且几乎对 Caffe 进行了重构,相关的文档也不多。另外一个选项就是使用 Maratyszcza/caffe-nnpack,虽然它比较老旧且没有什么维护。 另外一个问题就是 NNPACK 自身。它并不提供在 Linux/ARM 上的交叉编译(cross-compilation)配置,只有在 Android/ARM 上的交叉编译(cross-compilation)配置。我的实验性构建在与 MXNet 结合的目标平台上无法工作。我只能在台式电脑上运行它,但是我并没有看到使用 OpenBLAS 会有更优秀的表现。由于我的目标是评估已经可用的解决方法,所以我只能以后再做 NNPACK 的实验了。 相关链接: ajtulloch 制作的 Caffe 分支: NNPACK API 编译问题:https://github.com/Maratyszcza/NNPACK/issues/1#issuecomment-266416638 Maratyszcza/caffe-nnpack: NNPACK Linux/ARM 问题:https://github.com/Maratyszcza/NNPACK/issues/35 硬件 所有的这些评估都是在四核 1.3 GHz CPU 和 1 GB RAM 的树莓派 3 上执行。操作系统是 32 位的 Raspbian,所以 CPU 不是 ARMv8 架构,而是 ARMv7 架构。 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 测试草案 为了评估上述每个配置的性能,我们会使用相同的神经网络。也就是一个有 3 个卷积层和两个全连接层且在顶部有 softmax 的微型卷积神经网络: conv1: 16@7x7 relu1pool1: MAX POOL 2x2conv2: 48@6x6 relu2pool2: MAX POOL 3x3conv3: 96@5x5 relu3fc1: 128 unitsfc2: 848 units softmax 该卷积神经网络有 1039744 个参数。虽然非常小,但它足够处理许多计算机视觉任务。 该网络使用 Caffe 进行训练人脸识别任务,并将其转换为 TensorFlow 和 MXNet 格式从而使用这些框架进行评估。为了评估前向通过时间(forward pass time),从 1 到 256 的批大小都进行了测试,因为批大小对性能有很大的影响。而对于每个批大小,网络执行了 100 次前向通过,并为每一张图像计算了平均时间。 评估结果和讨论 在下面的表格中,列出了平均前向通过的时间。其中,A 是 caffe-openblas, B 是 caffe-openblas-dl, C 代表 tf-vanilla, D 是 tf-neon-vfpv4, E 是 mxnet-openblas, F 是 mxnet-openblas-dl。
在对数尺度(logarithmic scale)尺度上我们来看一下: 这些结果让我大吃一惊。首先,我没有预料到在 CPU 上运行 MXNet 有如此差的表现。但这看起来已经是一个众所周知的问题。此外,因为存储限制,它无法运行 256 张图片的 batch。第二个惊奇是优化过的 TensorFlow 竟有如此好的表现。它甚至比 Caffe 的表现还好(在超过 2 的批大小上);光是从原始框架上看是很难预料这个结果的。但小心:不保证你能在任意 ARM 设备上使用这些 flags。 (责任编辑:本港台直播) |