From 30a4827b8560de5609f76cebba027c145672c866 Mon Sep 17 00:00:00 2001 From: meng_chunyang Date: Sat, 29 Aug 2020 16:36:05 +0800 Subject: [PATCH] update the English version of architecture.md --- lite/docs/source_en/architecture.md | 20 ++++++++++++++++-- .../images/MindSpore-Lite-architecture.png | Bin 0 -> 55828 bytes .../tutorials/source_en/use/benchmark_tool.md | 14 ++++++------ .../source_en/use/timeprofiler_tool.md | 6 +++--- .../source_zh_cn/use/benchmark_tool.md | 10 ++++----- .../source_zh_cn/use/timeprofiler_tool.md | 4 ++-- 6 files changed, 35 insertions(+), 19 deletions(-) create mode 100644 lite/docs/source_en/images/MindSpore-Lite-architecture.png diff --git a/lite/docs/source_en/architecture.md b/lite/docs/source_en/architecture.md index 5eb7c58f..5b6defd7 100644 --- a/lite/docs/source_en/architecture.md +++ b/lite/docs/source_en/architecture.md @@ -1,3 +1,19 @@ -# Overall Architecture +# Overall Architecture - + + +The overall architecture of MindSpore Lite is as follows: + +![architecture](./images/MindSpore-Lite-architecture.png) + +- **Frontend:** generates models. You can use the model building API to build models and convert third-party models and models trained by MindSpore to MindSpore Lite models. Third-party models include TensorFlow Lite, Caffe 1.0, and ONNX models. + +- **IR:** defines the tensors, operators, and graphs of MindSpore. + +- **Backend:** optimizes graphs based on IR, including graph high level optimization (GHLO), graph low level optimization (GLLO), and quantization. GHLO is responsible for hardware-independent optimization, such as operator fusion and constant folding. GLLO is responsible for hardware-related optimization. Quantizer supports quantization methods after training, such as weight quantization and activation value quantization. + +- **Runtime:** inference runtime of intelligent devices. Sessions are responsible for session management and provide external APIs. The thread pool and parallel primitives are responsible for managing the thread pool used for graph execution. Memory allocation is responsible for memory overcommitment of each operator during graph execution. The operator library provides the CPU and GPU operators. + +- **Micro:** runtime of IoT devices, including the model generation .c file, thread pool, memory overcommitment, and operator library. + +Runtime and Micro share the underlying infrastructure layers, such as the operator library, memory allocation, thread pool, and parallel primitives. diff --git a/lite/docs/source_en/images/MindSpore-Lite-architecture.png b/lite/docs/source_en/images/MindSpore-Lite-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..abf28796690f5649f8bc92382dfd4c2c83187620 GIT binary patch literal 55828 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 literal 0 HcmV?d00001 diff --git a/lite/tutorials/source_en/use/benchmark_tool.md b/lite/tutorials/source_en/use/benchmark_tool.md index 63adee31..713ddc4a 100644 --- a/lite/tutorials/source_en/use/benchmark_tool.md +++ b/lite/tutorials/source_en/use/benchmark_tool.md @@ -22,9 +22,9 @@ The Benchmark tool is used to perform benchmark testing on a MindSpore Lite mode To use the Benchmark tool, you need to prepare the environment as follows: -- Compilation: Install compilation dependencies and perform compilation. The code of the Benchmark tool is stored in the `mindspore/lite/tools/benchmark` directory of the MindSpore source code. For details about the compilation operations, see the [Environment Requirements] (https://www.mindspore.cn/lite/docs/en/r0.7/deploy.html#id2) and [Compilation Example] (https://www.mindspore.cn/lite/docs/en/r0.7/deploy.html#id5) in the deployment document. +- Compilation: Install compilation dependencies and perform compilation. The code of the Benchmark tool is stored in the `mindspore/lite/tools/benchmark` directory of the MindSpore source code. For details about the compilation operations, see the [Environment Requirements](https://www.mindspore.cn/lite/docs/en/r0.7/deploy.html#id2) and [Compilation Example](https://www.mindspore.cn/lite/docs/en/r0.7/deploy.html#id5) in the deployment document. -- Run: Obtain the `Benchmark` tool and configure environment variables. For details, see [Output Description] (https://www.mindspore.cn/lite/docs/zh-CN/r0.7/deploy.html#id4) in the deployment document. +- Run: Obtain the `Benchmark` tool and configure environment variables. For details, see [Output Description](https://www.mindspore.cn/lite/docs/zh-CN/r0.7/deploy.html#id4) in the deployment document. ## Parameter Description @@ -48,7 +48,7 @@ The following describes the parameters in detail. | `--accuracyThreshold=` | Optional | Specifies the accuracy threshold. | Float | 0.5 | - | | `--calibDataPath=` | Optional | Specifies the file path of the benchmark data. The benchmark data, as the comparison output of the tested model, is output from the forward inference of the tested model under other deep learning frameworks using the same input. | String | Null | - | | `--cpuBindMode=` | Optional | Specifies the type of the CPU core bound to the model inference program. | Integer | 1 | −1: medium core
1: large core
0: not bound | -| `--device=` | Optional | Specifies the type of the device on which the model inference program runs. | String | CPU | CPU, NPU, or GPU | +| `--device=` | Optional | Specifies the type of the device on which the model inference program runs. | String | CPU | CPU or GPU | | `--help` | Optional | Displays the help information about the `benchmark` command. | - | - | - | | `--inDataPath=` | Optional | Specifies the file path of the input data of the tested model. If this parameter is not set, a random value will be used. | String | Null | - | | `--inDataType=` | Optional | Specifies the file type of the input data of the tested model. | String | Bin | Img: The input data is an image. Bin: The input data is a binary file.| @@ -68,13 +68,13 @@ When using the Benchmark tool to perform benchmark testing on different MindSpor The main test indicator of the performance test performed by the Benchmark tool is the duration of a single forward inference. In a performance test, you do not need to set benchmark data parameters such as `calibDataPath`. For example: ```bash -./benchmark --modelPath=./models/face_age.ms +./benchmark --modelPath=./models/test_benchmark.ms ``` This command uses a random input, and other parameters use default values. After this command is executed, the following statistics are displayed. The statistics include the minimum duration, maximum duration, and average duration of a single inference after the tested model runs for the specified number of inference rounds. ``` -Model = face_age.ms, numThreads = 2, MinRunTime = 72.228996 ms, MaxRuntime = 73.094002 ms, AvgRunTime = 72.556000 ms +Model = test_benchmark.ms, numThreads = 2, MinRunTime = 72.228996 ms, MaxRuntime = 73.094002 ms, AvgRunTime = 72.556000 ms ``` ### Accuracy Test @@ -82,10 +82,10 @@ Model = face_age.ms, numThreads = 2, MinRunTime = 72.228996 ms, MaxRuntime = 73. The accuracy test performed by the Benchmark tool is to verify the accuracy of the MinSpore model output by setting benchmark data. In an accuracy test, in addition to the `modelPath` parameter, the `calibDataPath` parameter must be set. For example: ```bash -./benchmark --modelPath=./models/face_age.ms --inDataPath=./input/face_age.bin --device=NPU --accuracyThreshold=3 --calibDataPath=./output/face_age.out +./benchmark --modelPath=./models/test_benchmark.ms --inDataPath=./input/test_benchmark.bin --device=CPU --accuracyThreshold=3 --calibDataPath=./output/test_benchmark.out ``` -This command specifies the input data and benchmark data of the tested model, specifies that the model inference program runs on the NPU, and sets the accuracy threshold to 3%. After this command is executed, the following statistics are displayed, including the single input data of the tested model, output result and average deviation rate of the output node, and average deviation rate of all nodes. +This command specifies the input data and benchmark data of the tested model, specifies that the model inference program runs on the CPU, and sets the accuracy threshold to 3%. After this command is executed, the following statistics are displayed, including the single input data of the tested model, output result and average deviation rate of the output node, and average deviation rate of all nodes. ``` InData0: 139.947 182.373 153.705 138.945 108.032 164.703 111.585 227.402 245.734 97.7776 201.89 134.868 144.851 236.027 18.1142 22.218 5.15569 212.318 198.43 221.853 diff --git a/lite/tutorials/source_en/use/timeprofiler_tool.md b/lite/tutorials/source_en/use/timeprofiler_tool.md index 8d7f1bf9..40d95484 100644 --- a/lite/tutorials/source_en/use/timeprofiler_tool.md +++ b/lite/tutorials/source_en/use/timeprofiler_tool.md @@ -20,7 +20,7 @@ The TimeProfiler tool can be used to analyze the time consumption of forward inf To use the TimeProfiler tool, you need to prepare the environment as follows: -- Compilation: Install compilation dependencies and perform compilation. The code of the TimeProfiler tool is stored in the `mindspore/lite/tools/time_profiler` directory of the MindSpore source code. For details about the compilation operations, see the [Environment Requirements] (https://www.mindspore.cn/lite/docs/en/r0.7/deploy.html#id2) and [Compilation Example] (https://www.mindspore.cn/lite/docs/en/r0.7/deploy.html#id5) in the deployment document. +- Compilation: Install compilation dependencies and perform compilation. The code of the TimeProfiler tool is stored in the `mindspore/lite/tools/time_profiler` directory of the MindSpore source code. For details about the compilation operations, see the [Environment Requirements](https://www.mindspore.cn/lite/docs/en/r0.7/deploy.html#id2) and [Compilation Example](https://www.mindspore.cn/lite/docs/en/r0.7/deploy.html#id5) in the deployment document. - Run: Obtain the `time_profiler` tool and configure environment variables by referring to [Output Description](https://www.mindspore.cn/lite/docs/zh-CN/r0.7/deploy.html#id4) in the deployment document. @@ -46,10 +46,10 @@ The following describes the parameters in detail. ## Example -Take the `tcpclassify.ms` model as an example and set the number of model inference cycles to 10. The command for using TimeProfiler to analyze the time consumption at the network layer is as follows: +Take the `test_timeprofiler.ms` model as an example and set the number of model inference cycles to 10. The command for using TimeProfiler to analyze the time consumption at the network layer is as follows: ```bash -./timeprofiler --modelPath=./models/tcpclassify.ms --loopCount=10 +./timeprofiler --modelPath=./models/test_timeprofiler.ms --loopCount=10 ``` After this command is executed, the TimeProfiler tool outputs the statistics on the running time of the model at the network layer. In this example, the command output is as follows: The statistics are displayed by`opName` and `optype`. `opName` indicates the operator name, `optype` indicates the operator type, and `avg` indicates the average running time of the operator per single run, `percent` indicates the ratio of the operator running time to the total operator running time, `calledTimess` indicates the number of times that the operator is run, and `opTotalTime` indicates the total time that the operator is run for a specified number of times. Finally, `total time` and `kernel cost` show the average time consumed by a single inference operation of the model and the sum of the average time consumed by all operators in the model inference, respectively. diff --git a/lite/tutorials/source_zh_cn/use/benchmark_tool.md b/lite/tutorials/source_zh_cn/use/benchmark_tool.md index 1f78f94a..0f8fc427 100644 --- a/lite/tutorials/source_zh_cn/use/benchmark_tool.md +++ b/lite/tutorials/source_zh_cn/use/benchmark_tool.md @@ -48,7 +48,7 @@ Benchmark工具是一款可以对MindSpore Lite模型进行基准测试的工具 | `--accuracyThreshold=` | 可选 | 指定准确度阈值。 | Float | 0.5 | - | | `--calibDataPath=` | 可选 | 指定标杆数据的文件路径。标杆数据作为该测试模型的对比输出,是该测试模型使用相同输入并由其它深度学习框架前向推理而来。 | String | null | - | | `--cpuBindMode=` | 可选 | 指定模型推理程序运行时绑定的CPU核类型。 | Integer | 1 | -1:表示中核
1:表示大核
0:表示不绑定 | -| `--device=` | 可选 | 指定模型推理程序运行的设备类型。 | String | CPU | CPU、NPU、GPU | +| `--device=` | 可选 | 指定模型推理程序运行的设备类型。 | String | CPU | CPU、GPU | | `--help` | 可选 | 显示`benchmark`命令的帮助信息。 | - | - | - | | `--inDataPath=` | 可选 | 指定测试模型输入数据的文件路径。如果未设置,则使用随机输入。 | String | null | - | | `--inDataType=` | 可选 | 指定测试模型输入数据的文件类型。 | String | bin | img:表示输入数据的文件类型为图片
bin:表示输入数据的类型为二进制文件 | @@ -68,13 +68,13 @@ Benchmark工具是一款可以对MindSpore Lite模型进行基准测试的工具 Benchmark工具进行的性能测试主要的测试指标为模型单次前向推理的耗时。在性能测试任务中,不需要设置`calibDataPath`等标杆数据参数。例如: ```bash -./benchmark --modelPath=./models/face_age.ms +./benchmark --modelPath=./models/test_benchmark.ms ``` 这条命令使用随机输入,其他参数使用默认值。该命令执行后会输出如下统计信息,该信息显示了测试模型在运行指定推理轮数后所统计出的单次推理最短耗时、单次推理最长耗时和平均推理耗时。 ``` -Model = face_age.ms, numThreads = 2, MinRunTime = 72.228996 ms, MaxRuntime = 73.094002 ms, AvgRunTime = 72.556000 ms +Model = test_benchmark.ms, numThreads = 2, MinRunTime = 72.228996 ms, MaxRuntime = 73.094002 ms, AvgRunTime = 72.556000 ms ``` ### 精度测试 @@ -82,10 +82,10 @@ Model = face_age.ms, numThreads = 2, MinRunTime = 72.228996 ms, MaxRuntime = 73. Benchmark工具进行的精度测试主要是通过设置标杆数据来对比验证MindSpore Lite模型输出的精确性。在精确度测试任务中,除了需要设置`modelPath`参数以外,还必须设置`calibDataPath`参数。例如: ```bash -./benchmark --modelPath=./models/face_age.ms --inDataPath=./input/face_age.bin --device=NPU --accuracyThreshold=3 --calibDataPath=./output/face_age.out +./benchmark --modelPath=./models/test_benchmark.ms --inDataPath=./input/test_benchmark.bin --device=CPU --accuracyThreshold=3 --calibDataPath=./output/test_benchmark.out ``` -这条命令指定了测试模型的输入数据、标杆数据,同时指定了模型推理程序在NPU上运行,并指定了准确度阈值为3%。该命令执行后会输出如下统计信息,该信息显示了测试模型的单条输入数据、输出节点的输出结果和平均偏差率以及所有节点的平均偏差率。 +这条命令指定了测试模型的输入数据、标杆数据,同时指定了模型推理程序在CPU上运行,并指定了准确度阈值为3%。该命令执行后会输出如下统计信息,该信息显示了测试模型的单条输入数据、输出节点的输出结果和平均偏差率以及所有节点的平均偏差率。 ``` InData0: 139.947 182.373 153.705 138.945 108.032 164.703 111.585 227.402 245.734 97.7776 201.89 134.868 144.851 236.027 18.1142 22.218 5.15569 212.318 198.43 221.853 diff --git a/lite/tutorials/source_zh_cn/use/timeprofiler_tool.md b/lite/tutorials/source_zh_cn/use/timeprofiler_tool.md index 8453bbba..021101ad 100644 --- a/lite/tutorials/source_zh_cn/use/timeprofiler_tool.md +++ b/lite/tutorials/source_zh_cn/use/timeprofiler_tool.md @@ -46,10 +46,10 @@ TimeProfiler工具可以对MindSpore Lite模型网络层的前向推理进行耗 ## 使用示例 -使用TimeProfiler对`tcpclassify.ms`模型的网络层进行耗时分析,并且设置模型推理循环运行次数为10,则其命令代码如下: +使用TimeProfiler对`test_timeprofiler.ms`模型的网络层进行耗时分析,并且设置模型推理循环运行次数为10,则其命令代码如下: ```bash -./timeprofiler --modelPath=./models/tcpclassify.ms --loopCount=10 +./timeprofiler --modelPath=./models/test_timeprofiler.ms --loopCount=10 ``` 该条命令执行后,TimeProfiler工具会输出模型网络层运行耗时的相关统计信息。对于本例命令,输出的统计信息如下。其中统计信息按照`opName`和`optype`两种划分方式分别显示,`opName`表示算子名,`optype`表示算子类别,`avg`表示该算子的平均单次运行时间,`percent`表示该算子运行耗时占所有算子运行总耗时的比例,`calledTimess`表示该算子的运行次数,`opTotalTime`表示该算子运行指定次数的总耗时。最后,`total time`和`kernel cost`分别显示了该模型单次推理的平均耗时和模型推理中所有算子的平均耗时之和。 -- GitLab