nn-Meter是一个新颖高效的系统,可以准确预测各种边缘设备上DNN模型的推理延迟。其核心思想是将整个模型推理分解为内核,即设备上融合算子的执行单元,并进行内核级预测。我们目前在包含26000个模型的大型数据集上评估了四个流行平台。它在移动CPU、移动Adreno 640 GPU、移动Adreno 630 GPU和Intel VPU上分别实现了99.0%、99.1%、99.0%和83.4%的预测准确率。
当前支持的硬件和推理框架:
设备 | 框架 | 处理器 | ±10%准确率 | 硬件名称 |
---|---|---|---|---|
Pixel4 | TFLite v2.1 | CortexA76 CPU | 99.0% | cortexA76cpu_tflite21 |
Mi9 | TFLite v2.1 | Adreno 640 GPU | 99.1% | adreno640gpu_tflite21 |
Pixel3XL | TFLite v2.1 | Adreno 630 GPU | 99.0% | adreno630gpu_tflite21 |
Intel Movidius NCS2 | OpenVINO2019R2 | Myriad VPU | 83.4% | myriadvpu_openvino2019r2 |
*nn-Meter获得了**Mobisys 21最佳论文奖!*更多详情,请查看论文:
nn-Meter:准确预测多样化边缘设备上深度学习模型推理延迟
谁应该考虑使用nn-Meter
- 想要获取移动和边缘设备上DNN推理延迟,但无需在实际设备上部署的人。
- 想要使用NNI进行硬件感知NAS的人。
- 想要为自己的设备构建延迟预测器的人(nn-Meter构建器文档)。
- 想要使用26000个延迟基准数据集的人。
安装
目前nn-Meter已在Linux和Windows系统上进行测试。Windows 10、Ubuntu 16.04和20.04与Python 3.6.10已经过测试并受支持。请在安装nn-Meter之前先安装python3
。然后可以通过运行以下命令安装nn-Meter:
pip install nn-meter
nn-meter==2.0
现已发布。
如果您想尝试最新代码,请从源代码安装nn-Meter。首先将nn-Meter包克隆到本地:
git clone git@github.com:microsoft/nn-Meter.git
cd nn-Meter
然后在python >= 3.6
的环境中运行以下pip安装命令。该命令将自动完成所有必要依赖项和nn-Meter的安装。
pip install .
nn-Meter是Tensorflow、PyTorch、Onnx、nn-meter IR图和NNI IR图类型模型的延迟预测器。要使用nn-Meter预测特定类型的模型,您还需要安装相应的必需包。经过充分测试的版本如下所示:
测试模型类型 | 要求 |
---|---|
Tensorflow | tensorflow==2.6.0 |
Torch | torch==1.9.0 , torchvision==0.10.0 , (替代方案)[onnx>=1.9.0 , onnx-simplifier==0.3.6 ] 或 [nni>=2.4 ][1] |
Onnx | onnx==1.9.0 |
nn-Meter IR图 | --- |
NNI IR图 | nni>=2.4 |
[1] 请参阅nn-Meter用法以获取更多信息。
请同时检查numpy
和scikit_learn
的版本。不同版本可能会改变内核预测器的预测准确性。
稳定版本的wheel二进制包将很快发布。
用法
为了进行硬件延迟预测,nn-Meter提供了两种接口类型:
- 安装
nn-meter
后的命令行nn-meter
。 - 由模块
nn_meter
提供的Python绑定
以下是两种方法支持的输入类型概述。
测试模型类型 | 命令支持 | Python绑定 |
---|---|---|
Tensorflow | 由tf.saved_model() 导出并以.pb 结尾的检查点文件 | 由tf.saved_model 导出并以.pb 结尾的检查点文件 |
Torch | torchvision.models 中的模型 | torch.nn.Module 对象 |
Onnx | 由torch.onnx.export() 或onnx.save() 导出并以.onnx 结尾的检查点文件 | 由onnx.save() 导出或通过onnx.load() 加载的模型 |
nn-Meter IR图 | nn-Meter IR图格式的JSON文件 | 符合nn-Meter IR图格式的dict 对象 |
NNI IR图 | - | NNI IR图对象 |
在这两种方法中,用户可以指定预测器名称和版本以针对特定的硬件平台(设备)。目前,nn-Meter支持以下四种配置的预测:
预测器(设备_推理框架) | 处理器类别 | 版本 |
---|---|---|
cortexA76cpu_tflite21 | CPU | 1.0 |
adreno640gpu_tflite21 | GPU | 1.0 |
adreno630gpu_tflite21 | GPU | 1.0 |
myriadvpu_openvino2019r2 | VPU | 1.0 |
用户可以通过运行以下命令获取所有预定义的预测器和版本
# 列出所有预定义的预测器
nn-meter --list-predictors
预测保存的CNN模型的延迟
安装后,将启用名为nn-meter
的命令。要在命令行中使用预定义的预测器预测CNN模型的延迟,用户可以运行以下命令(样本模型可以在这里下载)
# 对于Tensorflow (*.pb) 文件
nn-meter predict --predictor <硬件> [--predictor-version <版本>] --tensorflow <pb文件或文件夹>
# 使用示例
nn-meter predict --predictor cortexA76cpu_tflite21 --predictor-version 1.0 --tensorflow mobilenetv3small_0.pb
# 对于ONNX (*.onnx) 文件
nn-meter predict --predictor <硬件> [--predictor-version <版本>] --onnx <onnx文件或文件夹>
# 使用示例
nn-meter predict --predictor cortexA76cpu_tflite21 --predictor-version 1.0 --onnx mobilenetv3small_0.onnx
# 对于来自torchvision模型库的torch模型(字符串)
nn-meter predict --predictor <硬件> [--predictor-version <版本>] --torchvision <模型名称> <模型名称>...
# 使用示例
nn-meter predict --predictor cortexA76cpu_tflite21 --predictor-version 1.0 --torchvision mobilenet_v2
# 对于nn-Meter IR (*.json) 文件
nn-meter predict --predictor <硬件> [--predictor-version <版本>] --nn-meter-ir <json文件或文件夹>
# 使用示例
nn-meter predict --predictor cortexA76cpu_tflite21 --predictor-version 1.0 --nn-meter-ir mobilenetv3small_0.json
--predictor-version <版本>
参数是可选的。当用户未指定预测器版本时,nn-meter将使用该预测器的最新版本。
nn-Meter可以支持批量预测。要一次性预测同一模型类型的多个模型的延迟,用户应将所有模型收集在一个文件夹中,并在--[模型类型]
类参数后声明该文件夹。
还需注意的是,对于PyTorch模型,nn-meter只能支持torchvision模型库中现有的模型。--torchvision
后面的字符串应该正好是一个或多个表示某些现有torchvision模型名称的字符串。要在命令行中对torchvision模型应用延迟预测,需要onnx
和onnx-simplifier
包。
转换为nn-Meter IR图
此外,用户可能对将tensorflow pb文件或onnx文件转换为nn-Meter IR图感兴趣。用户可以通过运行以下命令将nn-Meter IR图转换并保存为.json
文件
# 对于Tensorflow (*.pb) 文件
nn-meter get_ir --tensorflow <pb文件> [--output <输出名称>]
# 对于ONNX (*.onnx) 文件
nn-meter get_ir --onnx <onnx文件> [--output <输出名称>]
如果用户未指定,输出名称默认为/path/to/input/file/<输入文件名>_<模型类型>_ir.json
。
在Python代码中使用nn-Meter
安装后,用户可以在Python代码中导入nn-Meter
from nn_meter import load_latency_predictor
predictor = load_latency_predictor(hardware_name, hardware_predictor_version) # 后端对大小写不敏感
构建你的模型(例如,torch.nn.Module的模型实例)
model = ...
lat = predictor.predict(model, model_type) # 得到的延迟结果单位为毫秒
通过调用`load_latency_predictor`,用户选择目标硬件并加载相应的预测器。nn-Meter会尝试在`~/.nn_meter/data`中找到正确的预测器文件。如果预测器文件不存在,它将从Github发布中下载。
在`predictor.predict()`中,参数`model_type`允许的项包括`["pb", "torch", "onnx", "nnmeter-ir", "nni-ir"]`,分别代表tensorflow、torch、onnx、nn-meter IR图和NNI IR图的模型类型。
对于Torch模型,仅基于给定的网络结构无法知道特征图的形状,而这是延迟预测中的重要参数。因此,torch模型需要一个输入张量的形状作为`predictor.predict()`的输入进行推理。根据给定的输入形状,将生成并使用一个相应形状的随机张量。Torch模型预测的另一个方面是,用户可以安装`onnx`和`onnx-simplifier`包进行延迟预测(称为基于Onnx的torch模型延迟预测),或者安装`nni`包(称为基于NNI的torch模型延迟预测)。请注意,`nni`选项不支持命令行调用。此外,如果用户使用`nni`进行延迟预测,PyTorch模块应该使用NNI的`nn`接口定义`import nni.retiarii.nn.pytorch as nn`(更多信息参见[NNI文档](https://nni.readthedocs.io/en/stable/NAS/QuickStart.html#define-base-model)),并且在`predictor.predict()`函数中应将参数`apply_nni`设置为`True`。以下是基于NNI的Torch模型延迟预测示例:
```python
import nni.retiarii.nn.pytorch as nn
from nn_meter import load_latency_predictor
predictor = load_latency_predictor(...)
# 使用nni.retiarii.nn.pytorch作为nn构建你的模型
model = nn.Module ...
input_shape = (1, 3, 224, 224)
lat = predictor.predict(model, model_type='torch', input_shape=input_shape, apply_nni=True)
基于Onnx的torch模型延迟预测稳定但较慢,而基于NNI的torch模型延迟预测不稳定,可能在某些情况下失败,但速度比基于Onnx的模型快得多。在nn-Meter中,基于Onnx的模型被设置为Torch模型延迟预测的默认选项。用户可以根据自己的需求选择使用哪一个。
用户可以通过list_latency_predictors
查看所有内置预测器的信息,或查看nn_meter/configs/predictors.yaml
中的配置文件。
用户可以通过调用模型名称或模型对象并指定模型类型,使用model_file_to_graph
和model_to_graph
获取nn-Meter IR图。model_file_to_graph
支持的模型类型包括"onnx"、"pb"、"torch"、"nnmeter-ir"和"nni-ir",而model_to_graph
支持的模型类型包括"onnx"、"torch"和"nni-ir"。
nn-Meter构建器
nn-Meter构建器是一个开源工具,用于用户在自己的设备上构建延迟预测器。nn-Meter构建器主要包含三个部分:
backend:连接后端的模块;
backend_meta:与后端相关的元工具。这里我们提供了融合规则测试器,用于检测用户后端的融合规则;
kernel_predictor_builder:用于构建不同内核延迟预测器的工具。
用户可以通过调用nn_meter.builder
来访问nn-Meter构建器。有关使用nn-Meter构建器的更多详细信息,请查看nn-Meter构建器文档。
使用nn-Meter和NNI进行硬件感知NAS
为了在边缘和移动设备上实现可负担的DNN,硬件感知NAS同时搜索高精度和低延迟的模型。特别是,搜索算法在搜索过程中只考虑目标延迟约束内的模型。
目前我们提供了两个硬件感知NAS的示例,包括端到端的多试验NAS,这是一个在SPOS NAS搜索空间上的随机搜索算法,以及流行的ProxylessNAS,这是一个具有硬件高效损失函数的一次性NAS算法。更多其他广泛使用的硬件感知NAS和模型压缩算法的示例即将推出。
多试验SPOS演示
要运行多试验SPOS演示,需要按照NNI文档通过源代码安装NNI
python setup.py develop
然后运行多试验SPOS演示:
python ${NNI_ROOT}/examples/nas/oneshot/spos/multi_trial.py
演示如何工作
参考NNI文档了解如何使用NNI执行神经网络架构搜索(NAS)。
为了支持硬件感知的NAS,你首先需要一个支持根据延迟过滤模型的Strategy
。我们在NNI中提供了一个名为LatencyFilter
的过滤器,并用该过滤器初始化一个Random
策略:
simple_strategy = strategy.Random(model_filter=LatencyFilter(threshold=100, predictor=base_predictor))
LatencyFilter
将使用nn-Meter预测模型的延迟,并过滤掉使用给定预测器的延迟大于阈值的模型(在本例中为100
)。
你也可以构建自己的策略和过滤器,以支持更灵活的NAS,例如根据延迟对模型进行排序。
然后,将这个策略传递给RetiariiExperiment
:
exp = RetiariiExperiment(base_model, trainer, strategy=simple_strategy)
exp_config = RetiariiExeConfig('local')
...
exp_config.dummy_input = [1, 3, 32, 32]
exp.run(exp_config, port)
在exp_config
中,需要dummy_input
来追踪形状信息。
ProxylessNAS演示
要运行一次性ProxylessNAS演示,用户可以运行NNI ProxylessNAS训练演示:
python ${NNI_ROOT}/examples/nas/oneshot/proxylessnas/main.py --applied_hardware <hardware> --reference_latency <reference latency (ms)>
演示如何工作
参考NNI文档了解如何使用NNI执行NAS。
ProxylessNAS目前构建了一个查找表,存储搜索空间中每个候选构建块的测量延迟。候选模型中所有构建块的延迟总和将被视为模型推理延迟。通过在NNI中利用nn-Meter,用户可以将ProxylessNAS应用于更多类型的边缘设备上搜索高效的DNN模型。在NNI实现中,HardwareLatencyEstimator
基于ProxylessLayerChoice
的路径权重预测混合操作的预期延迟。要在NNI ProxylessNAS中调用nn-Meter,用户可以在示例中添加参数"--applied_hardware <hardware> --reference_latency <reference latency (ms)>
"。
基准数据集
为了评估预测模型在任意DNN模型上的有效性,我们需要一个具有代表性的数据集,涵盖大范围的预测范围。nn-Meter收集并生成了26k个CNN模型。(请参阅论文了解数据集生成方法。)
我们发布了该数据集,并提供nn_meter.dataset
接口供用户访问数据集。用户也可以从下载链接自行下载数据。
贡献
本项目欢迎贡献和建议。大多数贡献需要你同意贡献者许可协议(CLA),声明你有权并确实授予我们使用你的贡献的权利。详情请访问https://cla.opensource.microsoft.com。
当你提交拉取请求时,CLA机器人会自动确定你是否需要提供CLA,并适当地修饰PR(例如,状态检查、评论)。只需按照机器人提供的说明操作即可。你只需在所有使用我们CLA的仓库中执行一次此操作。
本项目已采用Microsoft开源行为准则。 有关更多信息,请参阅行为准则常见问题解答或联系opencode@microsoft.com提出任何其他问题或意见。
许可证
整个代码库使用MIT许可证
数据集使用开放数据使用协议
引用
如果你发现nn-Meter对你的研究有帮助,请考虑引用它:
@inproceedings{nnmeter,
author = {Zhang, Li Lyna and Han, Shihao and Wei, Jianyu and Zheng, Ningxin and Cao, Ting and Yang, Yuqing and Liu, Yunxin},
title = {nn-Meter: Towards Accurate Latency Prediction of Deep-Learning Model Inference on Diverse Edge Devices},
year = {2021},
publisher = {ACM},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3458864.3467882},
doi = {10.1145/3458864.3467882},
booktitle = {Proceedings of the 19th Annual International Conference on Mobile Systems, Applications, and Services},
pages = {81–93},
}
@misc{nnmetercode, 作者 = {微软研究院 nn-Meter 团队}, 标题 = {nn-Meter:面向各种边缘设备上深度学习模型推理的准确延迟预测}, 年份 = {2021}, 网址 = {https://github.com/microsoft/nn-Meter}, }