You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 9.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. # Lite
  2. It is a lite warper of MegEngine, to enable MegEngine easy to be integrated in
  3. user's SDK
  4. ## bazel build
  5. 目前支持内部 bazel 和 CMake 编译,支持 C++/C, Python 接口,
  6. 下面是 bazel 中 lite_shared 目标的编译,可以作为其他目标的编译的参考,
  7. 该编译依赖内部 bazel 编译以及 megvii3。
  8. ### 配置编译环境
  9. 需要使用 megvii3 workspace 来完成 bazel 的编译
  10. #### Clone megvii3 安装 bazel
  11. ```bash
  12. git clone git@git-core.megvii-inc.com:brain-sdk/megvii3.git
  13. ./utils/bazel/get_bazel.sh
  14. ```
  15. #### Clone megbrain
  16. ```
  17. git submodule update brain/megbrain brain/midout
  18. ```
  19. ### 编译 x86 CUDA 版本
  20. ```bash
  21. ./bazel build //brain/megbrain/lite:lite_shared --cpu="k8" \
  22. --compiler="gcc7_cuda10" -c opt
  23. ```
  24. ### 编译 x86 CPU 版本
  25. ```bash
  26. ./bazel build //brain/megbrain/lite:lite_shared --cpu="k8" \
  27. --compiler="gcc9" -c opt
  28. ```
  29. ### 编译 arm OpenCL 版本
  30. ```bash
  31. ./bazel build //brain/megbrain/lite:lite_shared_shared --cpu=android_aarch64 \
  32. -c opt --define enable_opencl=1 --define enable_opencl_search=1
  33. ```
  34. ### 编译 arm opencl lite_examples
  35. bazel-3.0.0-megvii2 build //brain/megbrain/lite:lite_shared_examples \
  36. --cpu=android_aarch64 --define enable_opencl=1 --define enable_opencl_search=1
  37. ####如何运行snpe_loder 的lite_exampes 请查看下面的wiki
  38. https://wiki.megvii-inc.com/pages/viewpage.action?pageId=268786906
  39. ### 编译 armv7 CPU 版本
  40. ```bash
  41. ./bazel build //brain/megbrain/lite:lite_shared --cpu=android_armv7 \
  42. -c opt
  43. ```
  44. ### 编译 arm64 CPU 版本
  45. ```bash
  46. ./bazel build //brain/megbrain/lite:lite_shared --cpu=android_aarch64 \
  47. -c opt
  48. ```
  49. ### 编译 arm64 CPU v8.2 版本
  50. ```bash
  51. ./bazel build //brain/megbrain/lite:lite_shared --cpu=android_aarch64 \
  52. --copt -march=armv8.2-a+fp16+dotprod -c opt
  53. ```
  54. ## 同时支持cmake构建
  55. cmake构建参考scripts/cmake-build/BUILD_README.md,下面example表示同时支持编译megengine
  56. 和RKNPU后端且打开OpenCL的release模式
  57. ```bash
  58. EXTRA_CMAKE_ARGS="-DANDROID_NATIVE_API_LEVEL=24 -DLITE_BUILD_WITH_RKNPU=ON -DMGE_WITH_OPENCL=ON \
  59. -DMGE_OPENCL_SEARCH_ALGO=ON -DCUSTOM_C_OPR_INIT_FUNC=custom_loader_func" ./scripts/cmake-build/cross_build_android_arm_inference.sh"
  60. ```
  61. * 如果需要支持性能分析的 profile 功能,则需要在编译时候加上
  62. --copt -DMGB_ENABLE_JSON=1 该参数
  63. * 如果需要支持 fast-run 功能则需要加上
  64. --copt -DMGB_ENABLE_FASTRUN=1,开启 fast-run 功能
  65. * 如果编译 arm64,可以加上 --copt -mcpu=cortex-a53 选项进行优化。
  66. ### midout 裁减编译
  67. 具体 midout 的裁减原理见 megbrain 中 midout 裁减,裁减方法见 MegBrain
  68. 和 MegEngine 的裁减方法
  69. ## 模型
  70. ### 支持的模型
  71. lite 目前支持只支持 MegEngine dump 的模型格式,可以加载的模型文件包括原始
  72. 的模型文件,原始的加密模型,pack 之后的加密或者非加密模型。加密算法以及
  73. 加密的秘钥可以用户自定义,然后注册到 lite 中,详见 example 中加解密部分。
  74. * 原始模型未加密:直接将完成训练的模型在 MegEngine 环境中进行 dump 生成的模型
  75. * 原始加密模型:将上述 dump 的模型通过加密算法进行加密,lite 提供两种默认
  76. 的加密算法,在 tools 中,分别为 aes 和 rc4. 对应为:aes_encypt.sh 和
  77. rc4_encrypt.cpp,rc4_encrypt.cpp 需要编译生成可执行文件。这种方式加密的模型在
  78. 加载时候需要在 Config 中配置模型的加密方式。
  79. * pack 之后的模型:模型结构将在下面介绍,可以将上面加密或者未加密的模型,和下面
  80. 定义的 json config 文件一同打包为一个 pack 之后的模型,可以使用 tools 下面
  81. 的 pack_model_and_info.py 工具中完成,pack_model_and_info.py 的使用详见其中
  82. 的 help 输出。
  83. ### 模型结构
  84. 不同的模型文件主要是通过 pack 之后的模型文件中的 model_tag 来区分.
  85. * 打包处理之后的文件:
  86. 模型打包过程可以通过脚本 pack_model_and_json.py 来完成,其将模型info文件(
  87. 可以是任意格式,推荐使用JSON,可以加密也可以不加密)和加密或者未加密的模型文件
  88. 一同打包在一起,并在文件开头加上 Header 来帮助解析。
  89. * 原始文件和原始的加密文件没有 Header 和模型 info部分,模型加载需要的信息
  90. 可以通过 Config 和 NetworkIO 进行传递。
  91. ### Header
  92. Header 部分最开始为一个明文固定model_tag,目前定义为"packed_model"字符串,
  93. 后面主要包含模型文件各个部分的信息,每个部分的加密方式,load 模型时候可以
  94. 调用相应的解密方法对各个部分进行解密,以及model infomation 部分的解析方法。
  95. 具体细节参考lite/src/parse_model/pack_model.fbs
  96. ### Info部分
  97. Info 部分主要用来解释模型,如用户关心的:模型的输入数据的格式,模型运行的平台
  98. 等信息,这部分信息也可以用于用户进行 check 运行的模型是否在指定的条件下运行。
  99. 由于这个 Info 部分不同的用户需求不一致,想传递的信息也无法统一,所以目前
  100. Lite 中提供自定义的方式,用户可以自定义自己 Info 部分的类容,并在 Header 中
  101. 指定 **Info 解析方式名字** ,并注册以该名字为 key 的解析函数到 Lite 中,
  102. 以这样方式来可以实现用户自定义 Info 格式。同时,Lite 中也提供了一套定义好的
  103. 格式,其名字为 "LITE_default",并已经实现了对应的解析函数,该 info
  104. 为 JSON 格式,具体内容定义如下:
  105. ```json
  106. {
  107. "name": "shufflenet_test",
  108. "valid": true,
  109. "version": "8.9999.0",
  110. "has_compression": false,
  111. "device": {
  112. "type": "CPU",
  113. "device_id": 0,
  114. "number_threads": 1,
  115. "use_tensor_rt": false,
  116. "enable_inplace_model": false
  117. },
  118. "options":{
  119. "weight_preprocess": false,
  120. "var_sanity_check_first_run": true,
  121. "const_shape": false,
  122. "jit_level": 0,
  123. "record_level": 0
  124. },
  125. "IO":{
  126. "inputs":[
  127. {
  128. "name": "data",
  129. "io_type": "value",
  130. "is_host": true,
  131. "dtype": "float32",
  132. "shape": {
  133. "dim0": 1,
  134. "dim1": 3,
  135. "dim2": 224,
  136. "dim3": 224
  137. }
  138. }
  139. ],
  140. "outputs":[
  141. {
  142. "name": "TRUE_DIV(EXP[12065],reduce0[12067])[12077]",
  143. "io_type": "value",
  144. "is_host": true,
  145. "dtype": "float32",
  146. "shape": {
  147. "dim0": 1,
  148. "dim1": 1000,
  149. "dim2": 0,
  150. "dim3": 0
  151. }
  152. }
  153. ]
  154. }
  155. }
  156. ```
  157. * model_name: 指这个模型的名字,用户可以用来验证是否运行了正确的模型,
  158. 和 Header 部分中的进行对比 check
  159. * valid: 指在这个 info 文件中的设置是否影响模型的 Config
  160. * version: 指模型对应的 megbrain 的版本号,load 模型时候会进行 check
  161. * has_compression: 标识这个模型文件中 tensor 的数据是否压缩过
  162. * device: 目前支持字段包括:"CPU","CUDA","OPENCL","ATLAS"
  163. * number_threads 和 is_inplace_model : 只有在 device 为 CPU 的情况下才生效
  164. * IO::inputs::type: 包括 value,shape,详见 include"network.h"
  165. * IO::inputs::is_host: 值输入数据来自 device 或者来自 host 端
  166. * IO::outputs::is_host: 值输出数据将保存在 device 或者 host 端
  167. * IO::outputs::shape::dimx: 如果为0,则便是该 dim 无效
  168. ### Model部分
  169. 可以是加密的模型文件或者未加密的模型文件
  170. ## 使用
  171. 丰富的使用方法详见文件 example 中文档和对应的 example。
  172. ## 工具
  173. 目前 lite 中有三个工具保存在 tools 目录中,其他 megbrain 工具
  174. 没有包含在内,分别为:
  175. * pack_model_and_info.py 为上面提到的模型打包工具,其为一个
  176. python 脚本,可以直接用其对已有的模型和模型 information 的文件,按照上面
  177. 的格式进行打包模型,用户可以指定模型名字,模型加密方式,模型信息
  178. 文件加密方式,解析方式等,如下:
  179. ```bash
  180. python3 pack_model_and_info.py --input-model xxx.mge \
  181. --model-name="shufflenet_test" \
  182. --model-cryption="RC4_default" \
  183. --input-info xxx.json \
  184. --info-cryption="RC4_default" \
  185. --info-parser="LITE_default" \
  186. -o xxx.lite
  187. ```
  188. * aes_encrypt.sh 为一个 aes 加密方式的加密脚本,可以将一个文件,
  189. 通过指定的的 key 加密成一个 aes 加密的文件,其中 key 为 32 个字节
  190. 16进制数。
  191. ```bash
  192. aes_encrypt.sh xxx.mdl xxx_encrypted.mdl \
  193. 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
  194. ```
  195. * rc4_encypt.cpp 可以被编译成为一个 rc4 加密的工具,这个工具可以通过
  196. 制定的 key 或者默认的 key 加密制定的文件,支持 rc4 方法和
  197. simple_fast_rc4 两种方法,支持自定义 key。
  198. * bazel 编译 x86 命令为:
  199. ```bash
  200. bazel build //brain/megbrain/lite:rc4_encryptor \
  201. --cpu='k8' --compiler='gcc9'
  202. ```
  203. * 加密文件,具体用法见 help
  204. ```bash
  205. rc4_encryptor encrypt_predefined_rc4 \
  206. to_be_encrypt.file encrypted.file
  207. ```

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台