MACE(2)-----模型編譯

做者:十歲的小男孩html

QQ:929994365node

 無用python

  本文僅用於學習研究,非商業用途,歡迎你們指出錯誤一塊兒學習,文章內容翻譯自 MACE 官方手冊,記錄本人閱讀與開發過程,力求不失原意,但推薦閱讀原文。git

  本文是mace學習的第二步,如何撰寫Yaml文件,將pb模型部署到該文件中進行編譯。若環境還沒有搭建完畢的同窗請看第一篇環境搭建,編譯出的庫在安卓中如何使用請瀏覽第三步即mace工程化。github

MACE(1)-----環境搭建:http://www.javashuo.com/article/p-agfoihkl-ch.htmlshell

MACE(3)-----工程化:http://www.javashuo.com/article/p-qdlrywha-dx.htmlapi

小米官方文檔編寫部署文件:https://mace.readthedocs.io/en/latest/user_guide/basic_usage.htmlide

目錄

  準備模型文件

  建立部署文件

  高級用法

1.準備模型文件

  說明:本文只關注TensorFlow平臺。工具

  準備好預先訓練的TensorFlow model.pb文件。使用圖形轉換工具 優化模型以進行推理。此工具將經過進行多個優化來提升推理效率,例如操做員摺疊,冗餘節點刪除等。咱們強烈建議MACE用戶在構建以前使用它。性能

# CPU/GPU:
./transform_graph \
    --in_graph=/path/to/your/tf_model.pb \
    --out_graph=/path/to/your/output/tf_model_opt.pb \
    --inputs='input node name' \
    --outputs='output node name' \
    --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
        remove_control_dependencies
        strip_unused_nodes
        sort_by_execution_order'

注:(還沒有搞清楚,如下文件的如何用)

2. 建立部署文件(model.yaml)

  轉換模型或構建庫時,MACE須要讀取YAML文件,此文件稱爲模型部署文件。模型部署文件包含模型和構建選項的全部信息。構建過程包括解析模型部署文件,轉換模型,構建MACE核心庫以及打包生成的模型庫。

  一個部署文件將正常生成一個庫,但若是指定了多個ABI,則將爲每一個ABI生成一個庫。部署文件還能夠包含多個模型。例如,AI相機應用程序能夠包含面部識別,對象識別和語音識別模型,全部這些均可以在一個部署文件中定義。

  下例爲mace官方提供的例子:

# The name of library
library_name: mobilenet
target_abis: [arm64-v8a]
model_graph_format: file
model_data_format: file
models:
  mobilenet_v1: # model tag, which will be used in model loading and must be specific.
    platform: tensorflow
    # path to your tensorflow model's pb file. Support local path, http:// and https://
    model_file_path: https://cnbj1.fds.api.xiaomi.com/mace/miai-models/mobilenet-v1/mobilenet-v1-1.0.pb
    # sha256_checksum of your model's pb file.
    # use this command to get the sha256_checksum: sha256sum path/to/your/pb/file
    model_sha256_checksum: 71b10f540ece33c49a7b51f5d4095fc9bd78ce46ebf0300487b2ee23d71294e6
    # define your model's interface
    # if there multiple inputs or outputs, write like blow:
    # subgraphs:
    # - input_tensors:
    #     - input0
    #     - input1
    #   input_shapes:
    #     - 1,224,224,3
    #     - 1,224,224,3
    #    output_tensors:
    #      - output0
    #      - output1
    #    output_shapes:
    #      - 1,1001
    #      - 1,1001
    subgraphs:
      - input_tensors:
          - input
        input_shapes:
          - 1,224,224,3
        output_tensors:
          - MobilenetV1/Predictions/Reshape_1
        output_shapes:
          - 1,1001
  # cpu, gpu or cpu+gpu
      runtime: cpu+gpu   winograd: 0

Command:

# Get device's soc info.(還沒有搞清楚在哪用)
adb shell getprop | grep platform

# command for generating sha256_sum,獲取檢測碼,路徑指向pb文件目錄(直接在終端下使用)
sha256sum /path/to/your/file 

配置:

注:[option]爲可選的,在部署文件中可選。

3. 高級用法

3.1 將模型轉換成C++代碼

  1. 更改部署文件

    若是要保護模型,能夠將模型轉換爲C ++代碼。還有兩種狀況:

    1.1 將模型圖轉換爲代碼並使用如下模型配置將權重建模到文件。

model_graph_format: code
model_data_format: file

    將模型圖和模型權重轉換爲具備如下模型配置的代碼。

model_graph_format: code
model_data_format: code

    以上兩步當model_graph_format: code時候後期會生成mace_engine_factory.h文件,後期遇到再解釋(未完成,還沒有知其用途)

    1.2 另外一種模型保護方法obfuscate用於混淆模型運算符的名稱。(未知)

  2. 將模型轉換爲代碼

python tools/converter.py convert --config=/path/to/model_deployment_file.yml

  該命令將builds / $ {library_name} / model目錄中生成$ {library_name} .abuilds / $ {library_name} / include生成 ** .h *以下面的dir-tree。   

# model_graph_format: code
# model_data_format: file

builds
  ├── include
  │   └── mace
  │       └── public
  │           ├── mace_engine_factory.h
  │           └── mobilenet_v1.h
  └── model
      ├── mobilenet-v1.a
      └── mobilenet_v1.data

# model_graph_format: code
# model_data_format: code

builds
  ├── include
  │   └── mace
  │       └── public
  │           ├── mace_engine_factory.h
  │           └── mobilenet_v1.h
  └── model
      └── mobilenet-v1.a

  3. 部署

    libmace.a$ {library_name} .a連接到您的目標。

    參閱mace/examples/example.cc完整用法。如下列出了關鍵步驟。

// Include the headers
#include "mace/public/mace.h"
#include "mace/public/mace_runtime.h"
// If the model_graph_format is code
#include "mace/public/${model_name}.h"
#include "mace/public/mace_engine_factory.h"

// ... Same with the code in basic usage

// 4. Create MaceEngine instance
std::shared_ptr<mace::MaceEngine> engine;
MaceStatus create_engine_status;
// Create Engine from compiled code
create_engine_status =
    CreateMaceEngineFromCode(model_name.c_str(),
                             model_data_file, // empty string if model_data_format is code
                             input_names,
                             output_names,
                             device_type,
                             &engine);
if (create_engine_status != MaceStatus::MACE_SUCCESS) {
  // Report error
}

// ... Same with the code in basic usage

3.2 調整特色的SoC的GPU內核(還沒有搞清楚幹啥)

  若是您想使用特定設備的GPU,您只需target_socs在YAML文件中指定,而後爲其調整MACE lib(OpenCL內核),這可能會提升1~10%的性能。

  1.更改模型部署文件(.yml)

  指定target_socs模型中的部署文件(.yml):

target_socs: [sdm845]
注意:獲取設備的soc信息:adb shell getprop | grep平臺

  2.轉換模型

python tools/converter.py convert --config=/path/to/model_deployment_file.yml

  3.調整

  tools / converter.py將啓用GPU內核的自動調整。這一般須要一些時間才能完成,具體取決於模型的複雜程度。

python tools/converter.py run --config=/path/to/model_deployment_file.yml --validate

  該命令將在builds / $ {library_name} / opencl中生成兩個文件,以下面的dir-tree。

builds
└── mobilenet-v2
    ├── model
    │   ├── mobilenet_v2.data
    │   └── mobilenet_v2.pb
    └── opencl
        └── arm64-v8a
           ├── moblinet-v2_compiled_opencl_kernel.MiNote3.sdm660.bin
           └── moblinet-v2_tuned_opencl_parameter.MiNote3.sdm660.bin

  mobilenet-v2-gpu_compiled_opencl_kernel.MI6.msm8998.bin表明用於模型的OpenCL二進制文件,能夠加速初始化階段。詳情請參閱OpenCL規範

  mobilenet-v2-tuned_opencl_parameter.MI6.msm8998.bin表明SoC的調整OpenCL參數。

4.部署

  更改上面生成的文件名稱以防止發生衝突,並將它們推送到您本身設備的目錄中

  使用與前面的過程相似,下面列出了不一樣的關鍵步驟。

// Include the headers
#include "mace/public/mace.h"
#include "mace/public/mace_runtime.h"

// 0. Set pre-compiled OpenCL binary program file paths and OpenCL parameters file path when available
if (device_type == DeviceType::GPU) {
  mace::SetOpenCLBinaryPaths(path/to/opencl_binary_paths);
  mace::SetOpenCLParameterPath(path/to/opencl_parameter_file);
}

// ... Same with the code in basic usage.
相關文章
相關標籤/搜索