Project Icon

nn-Meter

准确预测深度神经网络边缘设备推理延迟的系统

nn-Meter是一个用于预测深度神经网络模型在边缘设备上推理延迟的系统。其核心是将模型推理分解为内核级别进行预测。系统在26000个模型的数据集上评估了4个主流平台,在移动CPU、GPU和VPU上达到较高预测精度。无需部署即可预测延迟,可用于硬件感知的神经架构搜索,并支持构建自定义设备的延迟预测器。

nn-Meter是一个新颖高效的系统,可以准确预测各种边缘设备上DNN模型的推理延迟。其核心思想是将整个模型推理分解为内核,即设备上融合算子的执行单元,并进行内核级预测。我们目前在包含26000个模型的大型数据集上评估了四个流行平台。它在移动CPU、移动Adreno 640 GPU、移动Adreno 630 GPU和Intel VPU上分别实现了99.0%、99.1%、99.0%和83.4%的预测准确率。

当前支持的硬件和推理框架:

设备框架处理器±10%准确率硬件名称
Pixel4TFLite v2.1CortexA76 CPU99.0%cortexA76cpu_tflite21
Mi9TFLite v2.1Adreno 640 GPU99.1%adreno640gpu_tflite21
Pixel3XLTFLite v2.1Adreno 630 GPU99.0%adreno630gpu_tflite21
Intel Movidius NCS2OpenVINO2019R2Myriad VPU83.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预测特定类型的模型,您还需要安装相应的必需包。经过充分测试的版本如下所示:

测试模型类型要求
Tensorflowtensorflow==2.6.0
Torchtorch==1.9.0, torchvision==0.10.0, (替代方案)[onnx>=1.9.0, onnx-simplifier==0.3.6] 或 [nni>=2.4][1]
Onnxonnx==1.9.0
nn-Meter IR图---
NNI IR图nni>=2.4

[1] 请参阅nn-Meter用法以获取更多信息。

请同时检查numpyscikit_learn的版本。不同版本可能会改变内核预测器的预测准确性。

稳定版本的wheel二进制包将很快发布。

用法

为了进行硬件延迟预测,nn-Meter提供了两种接口类型:

  • 安装nn-meter后的命令行nn-meter
  • 由模块nn_meter提供的Python绑定

以下是两种方法支持的输入类型概述。

测试模型类型命令支持Python绑定
Tensorflowtf.saved_model()导出并以.pb结尾的检查点文件tf.saved_model导出并以.pb结尾的检查点文件
Torchtorchvision.models中的模型torch.nn.Module对象
Onnxtorch.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_tflite21CPU1.0
adreno640gpu_tflite21GPU1.0
adreno630gpu_tflite21GPU1.0
myriadvpu_openvino2019r2VPU1.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模型应用延迟预测,需要onnxonnx-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_graphmodel_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}, }

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号