近几年,设备上的深度学习应用越来越普遍。在应用中部署深度学习模型给开发者带来挑战。开发者们需要选择一个合适的框架, 选择性地利用量化压缩技术与模型精度进行权衡,最终将模型部署到设备上。对比测试这些框架,并从中选择是一个繁琐耗时的工作。
MobileAIBench 是小米开源的一个端到端的测试工具,用于评测同一模型在不同框架上运行的性能表现, 希望测评结果可以提供给开发者一些指导。
请查看最新的 CI Pipeline 页面中的 _benchmark _步骤的运行结果。
MobileAIBench 现在支持多种框架 (MACE、SNPE、ncnn 以及 TensorFlow Lite),需要安装以下的依赖:
依赖 | 安装命令 | 验证可用的版本 |
---|---|---|
Python | 2.7 | |
ADB | apt-get install android-tools-adb | Required by Android run, >= 1.0.32 |
Android NDK | NDK installation guide | Required by Android build, r15c |
Bazel | bazel installation guide | 0.13.0 |
CMake | apt-get install cmake | >= 3.11.3 |
FileLock | pip install -I filelock==3.0.0 | Required by Android run |
PyYaml | pip install -I pyyaml==3.12 | 3.12.0 |
sh | pip install -I sh==1.12.14 | 1.12.14 |
SNPE (可选) | 下载并解压 | 1.15.0 |
备注: 鉴于 SNPE 的许可不允许第三方再分发, 目前 Bazel WORKSPACE 配置中的链接只能在 CI Server 中访问。 如果想测评 SNPE (通过--frameworks
指定all
或者显式指定了SNPE
) ,需从官方地址 下载并解压,然后修改 WORKSPACE
文件如下。
#new_http_archive( # name = "snpe", # build_file = "third_party/snpe/snpe.BUILD", # sha256 = "b11780e5e7f591e916c69bdface4a1ef75b0c19f7b43c868bd62c0f3747d3fbb", # strip_prefix = "snpe-1.15.0", # urls = [ # "https://cnbj1-fds.api.xiaomi.net/aibench/third_party/snpe-1.15.0.zip", # ], #) new_local_repository( name = "snpe", build_file = "third_party/snpe/snpe.BUILD", path = "/path/to/snpe-1.15.0", )
+-----------------+ +------------------+ +---------------+ | Benchmark | | BaseExecutor | <--- | MaceExecutor | +-----------------+ +------------------+ +---------------+ | - executor |-------> | - framework | | - model_name | | - runtime | +---------------+ | - model_file | | | <--- | SnpeExecutor | | - input_names | +------------------+ +---------------+ | - input_files | | + Init() | | - input_shapes | | + Prepare() | +---------------+ | - output_names | | + Run() | <--- | NcnnExecutor | | - output_shapes | | + Finish() | +---------------+ +-----------------+ +------------------+ | - Register() | +---------------+ | - Run() | <--- | TfLiteExecutor| +-----------------+ +---------------+
python tools/benchmark.py --output_dir=output --frameworks=all \ --runtimes=all --model_names=all \ --target_abis=armeabi-v7a,arm64-v8a
运行时间可能比较长,如果只想测试指定模型和框架,可以添加如下选项:
option | type | default | explanation |
---|---|---|---|
--output_dir | str | output | Benchmark output directory. |
--frameworks | str | all | Frameworks(MACE/SNPE/NCNN/TFLITE), comma separated list or all. |
--runtimes | str | all | Runtimes(CPU/GPU/DSP), comma separated list or all. |
--target_abis | str | armeabi-v7a | Target ABIs(armeabi-v7a,arm64-v8a), comma separated list. |
--model_names | str | all | Model names(InceptionV3,MobileNetV1…), comma separated list or all. |
--run_interval | int | 10 | Run interval between benchmarks, seconds. |
--num_threads | int | 4 | The number of threads. |
注册模型
在 aibench/benchmark/benchmark_main.cc
中添加:
#ifdef AIBENCH_ENABLE_YOUR_FRAMEWORK std::unique_ptr<aibench::YourFrameworkExecutor> your_framework_executor(new aibench::YourFrameworkExecutor()); AIBENCH_BENCHMARK(your_framework_executor.get(), MODEL_NAME, FRAMEWORK_NAME, RUNTIME, MODEL_FILE, (std::vector<std::string>{INPUT_NAME}), (std::vector<std::string>{INPUT_FILE}), (std::vector<std::vector<int64_t>>{INPUT_SHAPE}), (std::vector<std::string>{OUTPUT_NAME}), (std::vector<std::vector<int64_t>>{OUTPUT_SHAPE})); #endif
e.g.
AIBENCH_BENCHMARK(mobilenetv1_mace_cpu_executor.get(), MobileNetV1, MACE, CPU, mobilenet_v1, (std::vector<std::string>{"input"}), (std::vector<std::string>{"dog.npy"}), (std::vector<std::vector<int64_t>>{{1, 224, 224, 3}}), (std::vector<std::string>{ "MobilenetV1/Predictions/Reshape_1"}), (std::vector<std::vector<int64_t>>{{1, 1001}}));
在 tools/model_list.py
中注册模型名称
配置模型文件和输入文件
在 tools/model_and_input.yml
中配置 MODEL_FILE
和 INPUT_FILE
。
运行测试
python tools/benchmark.py --output_dir=output --frameworks=MACE \ --runtimes=CPU --model_names=MobileNetV1 \ --target_abis=armeabi-v7a,arm64-v8a
查看结果
cat output/report.csv
定义 executor
并实现其接口:
class YourFrameworkExecutor : public BaseExecutor { public: YourFrameworkExecutor() : BaseExecutor(FRAMEWORK_NAME, RUNTIME) {} // Init method should invoke the initializing process for your framework // (e.g. Mace needs to compile OpenCL kernel once per target). It will be // called only once when creating framework engine. virtual Status Init(const char *model_name, int num_threads); // Load model and prepare to run. It will be called only once before // benchmarking the model. virtual Status Prepare(const char *model_name); // Run the model. It will be called more than once. virtual Status Run(const std::map<std::string, BaseTensor> &inputs, std::map<std::string, BaseTensor> *outputs); // Unload model and free the memory after benchmarking. It will be called // only once. virtual void Finish(); };
在 aibench/benchmark/benchmark_main.cc
中包含头文件:
#ifdef AIBENCH_ENABLE_YOUR_FRAMEWORK #include "aibench/executors/your_framework/your_framework_executor.h" #endif
添加依赖 third_party/your_framework
, aibench/benchmark/BUILD
和 WORKSPACE
.
测试模型
神经网络的主要原理包括一系列基本元素,即人工神经元或感知器。它包括几个基本输入,如:x1,x2 …… .. xn,如果总和大于激活潜在量,则产生二进制输出。 样本神经元的示意图如下所述 - 产生的输出可以认为是具有激活潜在量或偏差加权和。 典型的神经网络架构如下所述 - 输入和输出之间的层称为隐藏层,层之间的连接密度和类型是配置。例如,完全连接的配置使层L的所有神经元连接到的神经元。对于更明显的定
神经网络 (Neural Network) 是机器学习的一个分支,全称人工神经网络(Artificial Neural Network,缩写 ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 Perceptron (感知器) 一个典型的神经网络由输入层、一个或多个隐藏层以及输出层组成,其中箭头代表着数据流动的方向,而圆圈代表激活函数(最常用的激活函数为
译者:bat67 最新版会在译者仓库首先同步。 可以使用torch.nn包来构建神经网络. 我们以及介绍了autograd,nn包依赖于autograd包来定义模型并对它们求导。一个nn.Module包含各个层和一个forward(input)方法,该方法返回output。 例如,下面这个神经网络可以对数字进行分类: 这是一个简单的前馈神经网络(feed-forward network)。它接受一
人工神经网络 人工神经网络是借鉴了生物神经网络的工作原理形成的一种数学模型,有关人工神经网络的原理、公式推导以及训练过程请见我的文章《机器学习教程 十二-神经网络模型的原理》 神奇用法之一 我们这样来设计我们的神经网络:由n个输入特征得出与输入特征几乎相同的n个结果,这样训练出的隐藏层可以得到意想不到的信息。 比如,在信息检索领域,我们需要通过模型训练来得出合理的排序模型,那么输入的特征可能有:文
我玩神经网络。我了解卷积层、完全连接层和许多其他东西是如何工作的。我还知道什么是梯度,以及如何训练这样的网络。 框架千层面包含一个称为InverseLayer的层。 InverseLayer类通过应用要反转的层相对于其输入的偏导数,对神经网络的单层执行反转操作。 我不知道这是什么意思,或者我应该在什么时候使用这个层。或者倒置偏导数背后的想法是什么? 非常感谢你
主要内容:MP神经元模型,感知机模型,反向传播算法,总结在本教程的开篇《 人工智能是什么》一节中详细的阐述了深度学习发展历程,以及人工智能、机器学习、深度学习三者间的关系。就目前而言,这三者中红到发紫的当属“深度学习”。 深度学习(Deep Learning)这一概念是由 Geoffrey Hinton(深度学习之父)于 2006 年提出,但它的起源时间要早得多,可追溯至 20 世纪四五十年代,也就是人类刚刚发明出电子计算机时就已经提出来了,但当时并非
鸟类启发我们飞翔,牛蒡植物启发了尼龙绳,大自然也激发了许多其他发明。从逻辑上看,大脑是如何构建智能机器的灵感。这是启发人工神经网络(ANN)的关键思想。然而,尽管飞机受到鸟类的启发,但它们不必拍动翅膀。同样的,ANN 逐渐变得与他们的生物表兄弟有很大的不同。一些研究者甚至争辩说,我们应该完全放弃生物类比(例如,通过说“单位”而不是“神经元”),以免我们把我们的创造力限制在生物学的系统上。 人工神经
人工神经网络,或简称神经网络,并不是一个新概念。 它已经存在了大约80年。 直到2011年,深度神经网络才开始流行使用新技术,庞大的数据集可用性和强大的计算机。 神经网络模仿神经元,其具有树突,核,轴突和末端轴突。 对于网络,我们需要两个神经元。 这些神经元通过一个的树突和另一个的末端轴突之间的突触传递信息。 一个可能的人造神经元模型看起来像这样 - 神经网络如下图所示 - 圆是神经元或节点,它们