做者:十歲的小男孩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
說明:本文只關注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'
注:(還沒有搞清楚,如下文件的如何用)
轉換模型或構建庫時,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
# Get device's soc info.(還沒有搞清楚在哪用) adb shell getprop | grep platform # command for generating sha256_sum,獲取檢測碼,路徑指向pb文件目錄(直接在終端下使用) sha256sum /path/to/your/file
注:[option]爲可選的,在部署文件中可選。
若是要保護模型,能夠將模型轉換爲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} .a,在builds / $ {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
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
若是您想使用特定設備的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.