From bf306e85049dd01d78ecc286a04ad9f6de3a04ab Mon Sep 17 00:00:00 2001 From: xujiao Date: Wed, 9 Apr 2025 16:36:11 +0800 Subject: [PATCH] Update docs --- README.md | 6 +- examples/pytorch/README.md | 175 ++++++++++++++++++ examples/pytorch/resnet50/dataset.txt | 1 + examples/pytorch/resnet50/dog.jpg | Bin 0 -> 9999 bytes .../resnet50/export_resnet50_2_onnx.py | 6 + introduction.md | 6 +- 6 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 examples/pytorch/README.md create mode 100644 examples/pytorch/resnet50/dataset.txt create mode 100644 examples/pytorch/resnet50/dog.jpg create mode 100644 examples/pytorch/resnet50/export_resnet50_2_onnx.py diff --git a/README.md b/README.md index b121ca1..2187f38 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ -# netrans +# netrans +Netrans 是一套运行在unbuntu 20.04上的模型处理工具,提供命令行工具 netrans_cli 和 python api netrans_py, 其核心功能是将模型权重转换成在pnna芯片上运行的 nbg(network binary graph)格式(.nb 为后缀)。 +快速使用请参考[quick_start_guide.md](./quick_start_guide.md) +详细说明请参考[introduction.md](./introduction.md) +具体示例请参考examples。 diff --git a/examples/pytorch/README.md b/examples/pytorch/README.md new file mode 100644 index 0000000..d73e1bd --- /dev/null +++ b/examples/pytorch/README.md @@ -0,0 +1,175 @@ +# Onnx模型转换示例 +本文档以 resnet50 为例介绍如何使用 Netrans 对 pytorch 模型进行转换。 +由于pytorch 的动态图特征,需要将 pytorch 模型转换成 onnx 格式后,再以 onnx 格式的模型进行转换。 + +## 安装Netrans +创建 conda 环境 . +```bash +conda create -n netrans python=3.8 -y +conda activate netrans +``` + +下载 Netrans . +```bash +mkdir -p ~/app +cd ~/app +git clone https://gitlink.org.cn/nudt_dsp/netrans.git +``` + +安装 Netrans。 +```bash +cd ~/app/netrans +./setup.sh +``` + +## 数据准备 + +将 pytorch 模型导出成 onnx 模型 +```bash +cd examples/pytorch/resnet50 +python3 export_resnet50_2_onnx.py +cd .. +``` + +转换 onnx 模型需准备: + +- .onnx 文件:网络模型 +- dataset.txt:数据路径配置文件 + +我们的示例 已经完成数据准备,可以使用下面命令进入目录执行。 + +```bash +cd netrans/ +cd examples/onnx +``` + +此时目录如下: + +``` +resnet50/ +├── dataset.txt +├── dog.jpg +└── export_resnet50_2_onnx.py +└── resnet_50.onnx # 网络模型 +``` + +### 3.1 使用 netrans_cli 转换 示例模型 resnet50 + +示例目录如下: + +``` +onnx/ +└── resnet50 + ├── 0.jpg + ├── dataset.txt + └── resnet50.onnx +``` + +#### 3.1.1 导入模型 + +```bash +import.sh resnet50 +``` + +该命令会在工程目录下生成包含模型信息的 .json 和 .data 数据文件。 +此时 resnet50 的目录结构如下 +``` +resnet50/ +├── 0.jpg +├── dataset.txt +├── resnet50.data +├── resnet50.json +└── resnet50.onnx +``` + +#### 3.1.2 生成配置文件 +数据在推理前一般会经过预处理,为了确保模型可以正确的输入数据,需要生产对应的配置文件。 + +```bash +config.sh resnet50 +``` + +此时 resnet50 的目录结构如下: +``` +resnet50/ +├── 0.jpg +├── dataset.txt +├── resnet50.data +├── resnet50_inputmeta.yml +├── resnet50.json +└── resnet50.onnx + +``` +根据 resnet50 的实际情况 ,我们需要修改yml中的 mean 为 0,scale为 0.003921568627。 +打开 ` resnet50_inputmeta.yml ` 文件, +修改第30-33行为: +``` + scale: + - 0.003921568627 + - 0.003921568627 + - 0.003921568627 + +``` + +#### 3.1.3 量化模型 + +```bash +quantize.sh resnet50 uint8 + +``` + +此时 resnet50 的目录结构如下: + +``` +resnet50/ +├── 0.jpg +├── dataset.txt +├── resnet50_asymmetric_affine.quantize +├── resnet50.data +├── resnet50_inputmeta.yml +├── resnet50.json +└── resnet50.onnx +``` + +#### 3.1.4 导出模型 + +```bash +./export.sh resnet50 uint8 +``` +此时 resnet50 的目录结构如下: + +``` +resnet50/ +├── 0.jpg +├── dataset.txt +├── wksp +│ └── asymmetric_affine +│ ├── BUILD +│ ├── dump_core_graph.json +│ ├── graph.json +│ ├── main.c +│ ├── makefile.linux +│ ├── network_binary.nb +│ ├── vnn_global.h +│ ├── vnn_post_process.c +│ ├── vnn_post_process.h +│ ├── vnn_pre_process.c +│ ├── vnn_pre_process.h +│ ├── vnn_resnet50asymmetricaffine.c +│ ├── vnn_resnet50asymmetricaffine.h +│ ├── resnet50asymmetricaffine.2012.vcxproj +│ ├── resnet50_asymmetric_affine.export.data +│ └── resnet50asymmetricaffine.vcxproj +├── resnet50_asymmetric_affine.quantize +├── resnet50.data +├── resnet50_inputmeta.yml +├── resnet50.json +└── resnet50.onnx +``` + + +### 3.2 使用 netrans_py 转换 onnx 示例模型 resnet50 + +```bash +example.py resnet50 -q uint8 -m 0 -s 0.003921568627 +``` diff --git a/examples/pytorch/resnet50/dataset.txt b/examples/pytorch/resnet50/dataset.txt new file mode 100644 index 0000000..382743d --- /dev/null +++ b/examples/pytorch/resnet50/dataset.txt @@ -0,0 +1 @@ +dog.jpg diff --git a/examples/pytorch/resnet50/dog.jpg b/examples/pytorch/resnet50/dog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..311fd3cd867eb573ccb82b988246a83d0eaedacd GIT binary patch literal 9999 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 literal 0 HcmV?d00001 diff --git a/examples/pytorch/resnet50/export_resnet50_2_onnx.py b/examples/pytorch/resnet50/export_resnet50_2_onnx.py new file mode 100644 index 0000000..965c9b5 --- /dev/null +++ b/examples/pytorch/resnet50/export_resnet50_2_onnx.py @@ -0,0 +1,6 @@ +import torch +import torchvision.models as models +model = models.resnet50() +input_tensor = torch.rand(1,3,224,224) +model_onnx = torch.jit.trace(model, input_tensor) +model_onnx.save('resnet50.onnx') diff --git a/introduction.md b/introduction.md index 5e2e644..38deab9 100644 --- a/introduction.md +++ b/introduction.md @@ -81,7 +81,7 @@ Netrans 支持目前大多数的主流框架。具体如下表 | Pytorch | 支持 Pytorch 至 1.5.1 | | Darknet |支持[官网](https://pjreddie.com/darknet/)列出 darknet 模型| -注意: Pytorch 动态图的特性,我们建议将 Pytorch 模型导出成 onnx ,再使用 Netrans 进行转换。 +注意: Pytorch 动态图的特性,建议将 Pytorch 模型导出成 onnx ,再使用 Netrans 进行转换。 ## 算子支持 @@ -325,7 +325,7 @@ input_meta: | layout | 输入张量的格式,使用 nchw 用于 Caffe、Darknet、ONNX 和 PyTorch 模型。使用 nhwc 用于 TensorFlow、TensorFlow Lite 和 Keras 模型。 | | shape | 此张量的形状。第一维,shape[0],表示每批的输入数量,允许在一次推理操作之前将多个输入发送到网络。如果batch维度设置为0,则需要从命令行指定--batch-size。如果 batch维度设置为大于1的值,则直接使用inputmeta.yml中的batch size并忽略命令行中的--batch-size。 | | fitting | 保留字段 | -| preprocess | 预处理步骤和顺序。预处理支持下面的四个键,键的顺序代表预处理的顺序。您可以相应地调整顺序。 | +| preprocess | 预处理步骤和顺序。预处理支持下面的四个参数,参数的顺序代表预处理的顺序。 | | reverse_channel | 指定是否保留通道顺序。将此参数设置为以下值之一:true(保留通道顺序)或 false(不保留通道顺序)。对于 TensorFlow 和 TensorFlow Lite 框架的模型使用 true。 | | mean | 用于每个通道的均值。 | | scale | 张量的缩放值。均值和缩放值用于根据公式 (inputTensor - mean) × scale 归一化输入张量。| @@ -333,6 +333,6 @@ input_meta: | add_preproc_node | 用于处理 OVxlib C 项目案例中预处理节点的插入。[true, false] 中的布尔值,表示通过配置以下参数将预处理层添加到导出的应用程序中。此参数仅在 add_preproc_node 参数设置为 true 时有效。| | preproc_type | 预处理节点输入类型。 [IMAGE_RGB, IMAGE_RGB888_PLANAR,IMAGE_YUV420, IMAGE_GRAY, IMAGE_BGRA, TENSOR] 中的字符串值 | | preproc_perm | 预处理节点输入的置换参数。 | -| redirect_to_output | 将database张量重定向到图形输出的特殊属性。如果为该属性设置了一个port,网络构建器将自动为该port生成一个输出层,以便后处理文件可以直接处理来自database的张量。 如果使用网络进行分类,则上例中的lid“input_0”表示输入数据集的标签lid。 您可以设置其他名称来表示标签的lid。 请注意,redirect_to_output 必须设置为 true,以便后处理文件可以直接处理来自database的张量。 标签的lid必须与后处理文件中定义的 labels_tensor 的lid相同。 [true, false] 中的布尔值。 指定是否将由张量表示的输入端口的数据直接发送到网络输出。true(直接发送到网络输出)或 false(不直接发送到网络输出)| +| redirect_to_output | 将database张量重定向到图形输出的特殊属性。如果为该属性设置了一个port,网络构建器将自动为该port生成一个输出层,以便后处理文件可以直接处理来自database的张量。 如果使用网络进行分类,则上例中的lid“input_0”表示输入数据集的标签lid。 请注意,redirect_to_output 必须设置为 true,以便后处理文件可以直接处理来自database的张量。 标签的lid必须与后处理文件中定义的 labels_tensor 的lid相同。 [true, false] 中的布尔值。 指定是否将由张量表示的输入端口的数据直接发送到网络输出。true(直接发送到网络输出)或 false(不直接发送到网络输出)| 可以根据实际情况对生成的inputmeta文件进行修改。 \ No newline at end of file