From 930c6c31336c3a353fe22b3e6996573fbc86f1fb Mon Sep 17 00:00:00 2001 From: liuqi Date: Mon, 9 Jul 2018 18:48:00 +0800 Subject: [PATCH] Add introduction and advanced usage documents. --- docs/introduction.rst | 173 ++++++-- docs/mace-work-flow-zh.png | Bin 0 -> 38561 bytes docs/mace-work-flow.png | Bin 0 -> 35487 bytes docs/user_guide/advanced_usage.rst | 13 +- docs/user_guide/create_a_model_deployment.rst | 76 ---- docs/user_guide/how_to_build.rst | 406 ------------------ docs/user_guide/installation.rst | 3 - 7 files changed, 144 insertions(+), 527 deletions(-) create mode 100644 docs/mace-work-flow-zh.png create mode 100644 docs/mace-work-flow.png delete mode 100644 docs/user_guide/create_a_model_deployment.rst delete mode 100644 docs/user_guide/how_to_build.rst delete mode 100644 docs/user_guide/installation.rst diff --git a/docs/introduction.rst b/docs/introduction.rst index 874eabd5..cc4a4a7f 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -2,45 +2,150 @@ Introduction ============ Mobile AI Compute Engine (MACE) is a deep learning inference framework optimized for -mobile heterogeneous computing platforms. The following figure shows the -overall architecture. +mobile heterogeneous computing platforms. MACE cover common mobile computing devices(CPU, GPU and DSP), +and supplies tools and document to help users to deploy NN model to mobile devices. MACE has been +MACE has been widely used in Xiaomi and proved with industry leading performance and stability. + +Framework +--------- +The following figure shows the overall architecture. .. image:: mace-arch.png :scale: 40 % :align: center -Model format ------------- +========== +MACE Model +========== MACE defines a customized model format which is similar to Caffe2. The MACE model can be converted from exported models by TensorFlow -and Caffe. A YAML file is used to describe the model deployment details. In the -next chapter, there is a detailed guide showing how to create this YAML file. - -Model conversion ----------------- - -Currently, we provide model converters for TensorFlow and Caffe. And -more frameworks will be supported in the future. - -Model loading -------------- - -The MACE model format contains two parts: the model graph definition and -the model parameter tensors. The graph part utilizes Protocol Buffers -for serialization. All the model parameter tensors are concatenated -together into a continuous byte array, and we call this array tensor data in -the following paragraphs. In the model graph, the tensor data offsets -and lengths are recorded. - -The models can be loaded in 3 ways: - -1. Both model graph and tensor data are dynamically loaded externally - (by default, from file system, but the users are free to choose their own - implementations, for example, with compression or encryption). This - approach provides the most flexibility but the weakest model protection. -2. Both model graph and tensor data are converted into C++ code and loaded - by executing the compiled code. This approach provides the strongest - model protection and simplest deployment. -3. The model graph is converted into C++ code and constructed as the second - approach, and the tensor data is loaded externally as the first approach. +and Caffe. + +================ +MACE Interpreter +================ + +Mace Interpreter mainly parse the NN graph and manage the tensors in the graph. + +======= +Runtime +======= + +CPU/GPU/DSP runtime correspond to the Ops for different devices. + +Work Flow +--------- +The following figure shows the basic work flow of MACE. + +.. image:: mace-work-flow.png + :scale: 60 % + :align: center + +================================== +1. Configure model deployment file +================================== +Model deploy configuration file (.yml) describe the information of the model and library, +MACE will build the library based on the file. + +================== +2. Build libraries +================== +Build MACE dynamic or static libraries. + +================== +3. Convert model +================== +Convert Tensorflow or Caffe model to MACE model. + +=========== +4.1. Deploy +=========== +Integrate the MACE library to your application and run with MACE API. + +============== +4.2. Run (CLI) +============== +There are command line tools to run models, which could be used for testing time, memory usage and correctness. + +============== +4.3. Benchmark +============== +MACE supplies Benchmark tool to look up the run time of every Operation in the model. + + + +简介 +---- + +Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算设备优化的深度学习前向预测框架。 +MACE覆盖了常见的移动端计算设备(CPU,GPU和DSP),并且提供了完整的工具链和文档,用户借助MACE能够 +很方便地在移动端部署深度学习模型。MACE已经在小米内部广泛使用并且被充分验证具有业界领先的性能和稳定性。 + +框架 +---- +下图描述了MACE的基本框架. + +.. image:: mace-arch.png + :scale: 60 % + :align: center + + +============== +MACE Model +============== + +MACE定义了自有的模型格式(类似于Caffe2),通过MACE提供的工具可以将Caffe和TensorFlow的模型 +转为MACE模型。 + +================= +MACE Interpreter +================= + +MACE Interpreter主要负责解析运行神经网络图(DAG)并管理网络中的Tensors。 + +======= +Runtime +======= + +CPU/GPU/DSP Runtime对应于各个计算设备的算子实现。 + +使用流程 +------------ +下图描述了MACE使用的基本流程。 + +.. image:: mace-work-flow-zh.png + :scale: 60 % + :align: center + + +================================== +1. 配置模型部署文件(.yml) +================================== +模型部署文件详细描述了需要部署的模型以及生成库的信息,MACE根据该文件最终生成对应的库文件。 + +================================== +2. 编译MACE库 +================================== +编译MACE的静态库或者动态库。 + +================== +3. 转换模型 +================== +将Tensorflow 或者 Caffe的模型转为MACE的模型. + +================================== +4.1. 部署 +================================== +根据不同使用目的集成Build阶段生成的库文件,然后调用MACE相应的接口执行模型。 + +================================== +4.2. 命令行运行 +================================== +MACE提供了命令行工具,可以在命令行运行模型,可以用来测试模型运行时间,内存占用和正确性。 + +================================== +4.3. Benchmark +================================== +MACE提供了命令行benchmark工具,可以细粒度的查看模型中所涉及的所有算子的运行时间。 + diff --git a/docs/mace-work-flow-zh.png b/docs/mace-work-flow-zh.png new file mode 100644 index 0000000000000000000000000000000000000000..2a77e3e560bb469c2c0ccc51395da2a65dd73ea5 GIT binary patch literal 38561 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 g= 1.6.0. - * - Caffe - - >= 1.0. - -Usage --------- - -======================================= -1. Pull MACE source code -======================================= - -.. code:: sh - - git clone https://github.com/XiaoMi/mace.git - git fetch --all --tags --prune - - # Checkout the latest tag (i.e. release version) - tag_name=`git describe --abbrev=0 --tags` - git checkout tags/${tag_name} - -.. note:: - - It's highly recommended to use a release version instead of master branch. - -============================ -2. Model Preprocessing -============================ - -- TensorFlow - -TensorFlow provides -`Graph Transform Tool `__ -to improve inference efficiency by making various optimizations like Ops -folding, redundant node removal etc. It's strongly recommended to make these -optimizations before graph conversion step. - -The following commands show the suggested graph transformations and -optimizations for different runtimes, - -.. code:: sh - - # CPU/GPU: - ./transform_graph \ - --in_graph=tf_model.pb \ - --out_graph=tf_model_opt.pb \ - --inputs='input' \ - --outputs='output' \ - --transforms='strip_unused_nodes(type=float, shape="1,64,64,3") - strip_unused_nodes(type=float, shape="1,64,64,3") - remove_nodes(op=Identity, op=CheckNumerics) - fold_constants(ignore_errors=true) - flatten_atrous_conv - fold_batch_norms - fold_old_batch_norms - strip_unused_nodes - sort_by_execution_order' - -.. code:: sh - - # DSP: - ./transform_graph \ - --in_graph=tf_model.pb \ - --out_graph=tf_model_opt.pb \ - --inputs='input' \ - --outputs='output' \ - --transforms='strip_unused_nodes(type=float, shape="1,64,64,3") - strip_unused_nodes(type=float, shape="1,64,64,3") - remove_nodes(op=Identity, op=CheckNumerics) - fold_constants(ignore_errors=true) - fold_batch_norms - fold_old_batch_norms - backport_concatv2 - quantize_weights(minimum_size=2) - quantize_nodes - strip_unused_nodes - sort_by_execution_order' - -- Caffe - -MACE converter only supports Caffe 1.0+, you need to upgrade -your models with Caffe built-in tool when necessary, - -.. code:: bash - - # Upgrade prototxt - $CAFFE_ROOT/build/tools/upgrade_net_proto_text MODEL.prototxt MODEL.new.prototxt - - # Upgrade caffemodel - $CAFFE_ROOT/build/tools/upgrade_net_proto_binary MODEL.caffemodel MODEL.new.caffemodel - -============================== -3. Build static/shared library -============================== - ------------------ -3.1 Overview ------------------ -MACE can build either static or shared library (which is -specified by ``linkshared`` in YAML model deployment file). -The followings are two use cases. - -* **Build well tuned library for specific SoCs** - - When ``target_socs`` is specified in YAML model deployment file, the build - tool will enable automatic tuning for GPU kernels. This usually takes some - time to finish depending on the complexity of your model. - - .. note:: - - You should plug in device(s) with the correspoding SoC(s). - -* **Build generic library for all SoCs** - - When ``target_socs`` is not specified, the generated library is compatible - with general devices. - - .. note:: - - There will be around of 1 ~ 10% performance drop for GPU - runtime compared to the well tuned library. - -MACE provide command line tool (``tools/converter.py``) for -model conversion, compiling, test run, benchmark and correctness validation. - -.. note:: - - 1. ``tools/converter.py`` should be run at the root directory of this project. - 2. When ``linkshared`` is set to ``1``, ``build_type`` should be ``proto``. - And currently only android devices supported. - - ------------------------------------------- -3.2 \ ``tools/converter.py``\ usage ------------------------------------------- - -**Commands** - - * **build** - - build library and test tools. - - .. code:: sh - - # Build library - python tools/converter.py build --config=models/config.yaml - - - - * **run** - - run the model(s). - - .. code:: sh - - # Test model run time - python tools/converter.py run --config=models/config.yaml --round=100 - - # Validate the correctness by comparing the results against the - # original model and framework, measured with cosine distance for similarity. - python tools/converter.py run --config=models/config.yaml --validate - - # Check the memory usage of the model(**Just keep only one model in configuration file**) - python tools/converter.py run --config=models/config.yaml --round=10000 & - sleep 5 - adb shell dumpsys meminfo | grep mace_run - kill %1 - - - .. warning:: - - ``run`` rely on ``build`` command, you should ``run`` after ``build``. - - * **benchmark** - - benchmark and profiling model. - - .. code:: sh - - # Benchmark model, get detailed statistics of each Op. - python tools/converter.py benchmark --config=models/config.yaml - - - .. warning:: - - ``benchmark`` rely on ``build`` command, you should ``benchmark`` after ``build``. - -**Common arguments** - - .. list-table:: - :header-rows: 1 - - * - option - - type - - default - - commands - - explanation - * - --omp_num_threads - - int - - -1 - - ``run``/``benchmark`` - - number of threads - * - --cpu_affinity_policy - - int - - 1 - - ``run``/``benchmark`` - - 0:AFFINITY_NONE/1:AFFINITY_BIG_ONLY/2:AFFINITY_LITTLE_ONLY - * - --gpu_perf_hint - - int - - 3 - - ``run``/``benchmark`` - - 0:DEFAULT/1:LOW/2:NORMAL/3:HIGH - * - --gpu_perf_hint - - int - - 3 - - ``run``/``benchmark`` - - 0:DEFAULT/1:LOW/2:NORMAL/3:HIGH - * - --gpu_priority_hint - - int - - 3 - - ``run``/``benchmark`` - - 0:DEFAULT/1:LOW/2:NORMAL/3:HIGH - -Using ``-h`` to get detailed help. - -.. code:: sh - - python tools/converter.py -h - python tools/converter.py build -h - python tools/converter.py run -h - python tools/converter.py benchmark -h - - -============= -4. Deployment -============= - -``build`` command will generate the static/shared library, model files and -header files and package them as -``build/${library_name}/libmace_${library_name}.tar.gz``. - -- The generated ``static`` libraries are organized as follows, - -.. code:: - - build/ - └── mobilenet-v2-gpu - ├── include - │   └── mace - │   └── public - │   ├── mace.h - │   └── mace_runtime.h - ├── libmace_mobilenet-v2-gpu.tar.gz - ├── lib - │   ├── arm64-v8a - │   │   └── libmace_mobilenet-v2-gpu.MI6.msm8998.a - │   └── armeabi-v7a - │   └── libmace_mobilenet-v2-gpu.MI6.msm8998.a - ├── model - │   ├── mobilenet_v2.data - │   └── mobilenet_v2.pb - └── opencl - ├── arm64-v8a - │   └── mobilenet-v2-gpu_compiled_opencl_kernel.MI6.msm8998.bin - └── armeabi-v7a - └── mobilenet-v2-gpu_compiled_opencl_kernel.MI6.msm8998.bin - -- The generated ``shared`` libraries are organized as follows, - -.. code:: - - build - └── mobilenet-v2-gpu - ├── include - │   └── mace - │   └── public - │   ├── mace.h - │   └── mace_runtime.h - ├── lib - │   ├── arm64-v8a - │   │   ├── libgnustl_shared.so - │   │   └── libmace.so - │   └── armeabi-v7a - │   ├── libgnustl_shared.so - │   └── libmace.so - ├── model - │   ├── mobilenet_v2.data - │   └── mobilenet_v2.pb - └── opencl - ├── arm64-v8a - │   └── mobilenet-v2-gpu_compiled_opencl_kernel.MI6.msm8998.bin - └── armeabi-v7a - └── mobilenet-v2-gpu_compiled_opencl_kernel.MI6.msm8998.bin - -.. note:: - - 1. DSP runtime depends on ``libhexagon_controller.so``. - 2. ``${MODEL_TAG}.pb`` file will be generated only when ``build_type`` is ``proto``. - 3. ``${library_name}_compiled_opencl_kernel.${device_name}.${soc}.bin`` will - be generated only when ``target_socs`` and ``gpu`` runtime are specified. - 4. Generated shared library depends on ``libgnustl_shared.so``. - -.. warning:: - - ``${library_name}_compiled_opencl_kernel.${device_name}.${soc}.bin`` depends - on the OpenCL version of the device, you should maintan the compatibility or - configure compiling cache store with ``ConfigKVStorageFactory``. - -========================================= -5. How to use the library in your project -========================================= - -Please refer to \ ``mace/examples/example.cc``\ for full usage. The following list the key steps. - -.. code:: cpp - - // Include the headers - #include "mace/public/mace.h" - #include "mace/public/mace_runtime.h" - // If the build_type is code - #include "mace/public/mace_engine_factory.h" - - // 0. Set pre-compiled OpenCL binary program file paths when available - if (device_type == DeviceType::GPU) { - mace::SetOpenCLBinaryPaths(opencl_binary_paths); - } - - // 1. Set compiled OpenCL kernel cache, this is used to reduce the - // initialization time since the compiling is too slow. It's suggested - // to set this even when pre-compiled OpenCL program file is provided - // because the OpenCL version upgrade may also leads to kernel - // recompilations. - const std::string file_path ="path/to/opencl_cache_file"; - std::shared_ptr storage_factory( - new FileStorageFactory(file_path)); - ConfigKVStorageFactory(storage_factory); - - // 2. Declare the device type (must be same with ``runtime`` in configuration file) - DeviceType device_type = DeviceType::GPU; - - // 3. Define the input and output tensor names. - std::vector input_names = {...}; - std::vector output_names = {...}; - - // 4. Create MaceEngine instance - std::shared_ptr engine; - MaceStatus create_engine_status; - // Create Engine from compiled code - create_engine_status = - CreateMaceEngineFromCode(model_name.c_str(), - nullptr, - input_names, - output_names, - device_type, - &engine); - // Create Engine from model file - create_engine_status = - CreateMaceEngineFromProto(model_pb_data, - model_data_file.c_str(), - input_names, - output_names, - device_type, - &engine); - if (create_engine_status != MaceStatus::MACE_SUCCESS) { - // Report error - } - - // 5. Create Input and Output tensor buffers - std::map inputs; - std::map outputs; - for (size_t i = 0; i < input_count; ++i) { - // Allocate input and output - int64_t input_size = - std::accumulate(input_shapes[i].begin(), input_shapes[i].end(), 1, - std::multiplies()); - auto buffer_in = std::shared_ptr(new float[input_size], - std::default_delete()); - // Load input here - // ... - - inputs[input_names[i]] = mace::MaceTensor(input_shapes[i], buffer_in); - } - - for (size_t i = 0; i < output_count; ++i) { - int64_t output_size = - std::accumulate(output_shapes[i].begin(), output_shapes[i].end(), 1, - std::multiplies()); - auto buffer_out = std::shared_ptr(new float[output_size], - std::default_delete()); - outputs[output_names[i]] = mace::MaceTensor(output_shapes[i], buffer_out); - } - - // 6. Run the model - MaceStatus status = engine.Run(inputs, &outputs); - diff --git a/docs/user_guide/installation.rst b/docs/user_guide/installation.rst deleted file mode 100644 index cd7a81df..00000000 --- a/docs/user_guide/installation.rst +++ /dev/null @@ -1,3 +0,0 @@ -Installation -============ - -- GitLab