跳转到主要内容

nn-Meter是一个新颖且高效的系统,可以准确预测DNN模型在各种边缘设备上的推理延迟。

项目描述

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

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

设备 框架 处理器 +-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构建者的文档)。
  • 那些想要使用26k延迟基准数据集的人。

安装

目前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。首先将nn-Meter包克隆到本地:

git clone git@github.com:microsoft/nn-Meter.git
cd nn-Meter

然后,在具有python >= 3.6的环境中简单地运行以下pip install命令。该命令将完成所有必要依赖项和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.0torchvision==0.10.0,(替代方案)[onnx==1.9.0onnx-simplifier==0.3.6]或[nni>=2.4][1]
Onnx onnx==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绑定
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支持以下四个配置的预测:

预测器(device_inferenceframework) 处理器类别 版本
cortexA76cpu_tflite21 CPU 1.0
adreno640gpu_tflite21 GPU 1.0
adreno630gpu_tflite21 GPU 1.0
myriadvpu_openvino2019r2 VPU 1.0

用户可以通过运行以下命令获取所有预定义的预测器和版本:

# to list all predefined predictors
nn-meter --list-predictors 

预测保存的CNN模型的延迟

安装后,将启用名为nn-meter的命令。要使用命令行中的预定义预测器预测CNN模型的延迟,用户可以运行以下命令(示例模型可以从此处下载):

# for Tensorflow (*.pb) file
nn-meter predict --predictor <hardware> [--predictor-version <version>] --tensorflow <pb-file_or_folder> 
# Example Usage
nn-meter predict --predictor cortexA76cpu_tflite21 --predictor-version 1.0 --tensorflow mobilenetv3small_0.pb 

# for ONNX (*.onnx) file
nn-meter predict --predictor <hardware> [--predictor-version <version>] --onnx <onnx-file_or_folder>
#Example Usage
nn-meter predict --predictor cortexA76cpu_tflite21 --predictor-version 1.0 --onnx mobilenetv3small_0.onnx 

# for torch model from torchvision model zoo (str)
nn-meter predict --predictor <hardware> [--predictor-version <version>] --torchvision <model-name> <model-name>... 
#Example Usage
nn-meter predict --predictor cortexA76cpu_tflite21 --predictor-version 1.0 --torchvision mobilenet_v2

# for nn-Meter IR (*.json) file
nn-meter predict --predictor <hardware> [--predictor-version <version>] --nn-meter-ir <json-file_or_folder> 
#Example Usage
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-file 或 onnx 文件转换为 nn-Meter IR 图。用户可以通过运行来转换 nn-Meter IR 图并将其保存到 .json 文件。

# for Tensorflow (*.pb) file
nn-meter get_ir --tensorflow <pb-file> [--output <output-name>]

# for ONNX (*.onnx) file
nn-meter get_ir --onnx <onnx-file> [--output <output-name>]

如果用户未指定,输出名称默认为 /path/to/input/file/<input_file_name>_<model-type>_ir.json

在您的 Python 代码中使用 nn-Meter

安装后,用户可以在 Python 代码中导入 nn-Meter。

from nn_meter import load_latency_predictor

predictor = load_latency_predictor(hardware_name, hardware_predictor_version) # case insensitive in backend

# build your model (e.g., model instance of torch.nn.Module)
model = ... 

lat = predictor.predict(model, model_type) # the resulting latency is in unit of ms

通过调用 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 图的模型类型。

<span id="torch-model-converters"> 对于 Torch 模型,特征图的形状仅根据给定的网络结构确定,然而,这些参数在延迟预测中却是重要的。因此,torch 模型需要一个推理时输入张量的形状作为 predictor.predict() 的输入。根据给定的输入形状,将生成一个随机张量并使用。对于 Torch 模型预测的另一件事是,用户可以为延迟预测安装 onnxonnx-simplifier 包(称为基于 Onnx 的 torch 模型延迟预测),或者可选择安装 nni 包(称为基于 NNI 的 torch 模型延迟预测)。请注意,nni 选项不支持命令行调用。此外,如果用户使用 nni 进行延迟预测,应使用 NNI 的 nn 接口定义 PyTorch 模块(NNI 文档 了解更多信息),并在 predictor.predict() 函数中将 apply_nni 设置为 True。以下是基于 NNI 的 Torch 模型延迟预测的示例

import nni.retiarii.nn.pytorch as nn
from nn_meter import load_latency_predictor

predictor = load_latency_predictor(...)

# build your model using nni.retiarii.nn.pytorch as 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_meta:与后端相关的元工具。在这里,我们提供了融合规则测试器,用于检测用户的后端融合规则;

kernel_predictor_builder:构建不同内核延迟预测器的工具。

用户可以通过调用 nn_meter.builder 来获取 nn-Meter builder。有关使用 nn-Meter builder 的更多详细信息,请参阅 nn-Meter builder 文档

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 进行 NAS 的信息,请参阅 NNI 文档

为了支持硬件感知 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 进行 NAS 的信息,请参阅 NNI 文档

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 的所有存储库中做一次即可。

本项目已采用 微软开源行为准则。有关更多信息,请参阅 行为准则常见问题解答 或联系 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,
    author = {Microsoft Research nn-Meter Team},
    title = {nn-Meter: Towards Accurate Latency Prediction of Deep-Learning Model Inference on Diverse Edge Devices},
    year = {2021},
    url = {https://github.com/microsoft/nn-Meter},
}

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

nn-meter-2.0.tar.gz (89.6 kB 查看散列)

上传时间

构建分布

nn_meter-2.0-py3-none-any.whl (132.5 kB 查看散列)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面