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 7.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. # Lite
  2. It is a lite warper of MegEngine, to enable MegEngine easy to be integrated in
  3. user's SDK
  4. ## 支持cmake构建
  5. cmake构建参考scripts/cmake-build/BUILD_README.md,下面example表示同时支持编译megengine
  6. 和RKNPU后端且打开OpenCL的release模式
  7. ```bash
  8. EXTRA_CMAKE_ARGS="-DANDROID_NATIVE_API_LEVEL=24 -DLITE_BUILD_WITH_RKNPU=ON -DMGE_WITH_OPENCL=ON \
  9. -DMGE_OPENCL_SEARCH_ALGO=ON -DCUSTOM_C_OPR_INIT_FUNC=custom_loader_func" ./scripts/cmake-build/cross_build_android_arm_inference.sh"
  10. ```
  11. * 如果需要支持性能分析的 profile 功能,则需要在编译时候加上
  12. --copt -DMGB_ENABLE_JSON=1 该参数
  13. * 如果需要支持 fast-run 功能则需要加上
  14. --copt -DMGB_ENABLE_FASTRUN=1,开启 fast-run 功能
  15. * 如果编译 arm64,可以加上 --copt -mcpu=cortex-a53 选项进行优化。
  16. ### midout 裁减编译
  17. 具体 midout 的裁减原理见 megbrain 中 midout 裁减,裁减方法见 MegBrain
  18. 和 MegEngine 的裁减方法
  19. ## 模型
  20. ### 支持的模型
  21. lite 目前支持只支持 MegEngine dump 的模型格式,可以加载的模型文件包括原始
  22. 的模型文件,原始的加密模型,pack 之后的加密或者非加密模型。加密算法以及
  23. 加密的秘钥可以用户自定义,然后注册到 lite 中,详见 example 中加解密部分。
  24. * 原始模型未加密:直接将完成训练的模型在 MegEngine 环境中进行 dump 生成的模型
  25. * 原始加密模型:将上述 dump 的模型通过加密算法进行加密,lite 提供两种默认
  26. 的加密算法,在 tools 中,分别为 aes 和 rc4. 对应为:aes_encypt.sh 和
  27. rc4_encrypt.cpp,rc4_encrypt.cpp 需要编译生成可执行文件。这种方式加密的模型在
  28. 加载时候需要在 Config 中配置模型的加密方式。
  29. * pack 之后的模型:模型结构将在下面介绍,可以将上面加密或者未加密的模型,和下面
  30. 定义的 json config 文件一同打包为一个 pack 之后的模型,可以使用 tools 下面
  31. 的 pack_model_and_info.py 工具中完成,pack_model_and_info.py 的使用详见其中
  32. 的 help 输出。
  33. ### 模型结构
  34. 不同的模型文件主要是通过 pack 之后的模型文件中的 model_tag 来区分.
  35. * 打包处理之后的文件:
  36. 模型打包过程可以通过脚本 pack_model_and_json.py 来完成,其将模型info文件(
  37. 可以是任意格式,推荐使用JSON,可以加密也可以不加密)和加密或者未加密的模型文件
  38. 一同打包在一起,并在文件开头加上 Header 来帮助解析。
  39. * 原始文件和原始的加密文件没有 Header 和模型 info部分,模型加载需要的信息
  40. 可以通过 Config 和 NetworkIO 进行传递。
  41. ### Header
  42. Header 部分最开始为一个明文固定model_tag,目前定义为"packed_model"字符串,
  43. 后面主要包含模型文件各个部分的信息,每个部分的加密方式,load 模型时候可以
  44. 调用相应的解密方法对各个部分进行解密,以及model infomation 部分的解析方法。
  45. 具体细节参考lite/src/parse_model/pack_model.fbs
  46. ### Info部分
  47. Info 部分主要用来解释模型,如用户关心的:模型的输入数据的格式,模型运行的平台
  48. 等信息,这部分信息也可以用于用户进行 check 运行的模型是否在指定的条件下运行。
  49. 由于这个 Info 部分不同的用户需求不一致,想传递的信息也无法统一,所以目前
  50. Lite 中提供自定义的方式,用户可以自定义自己 Info 部分的类容,并在 Header 中
  51. 指定 **Info 解析方式名字** ,并注册以该名字为 key 的解析函数到 Lite 中,
  52. 以这样方式来可以实现用户自定义 Info 格式。同时,Lite 中也提供了一套定义好的
  53. 格式,其名字为 "LITE_default",并已经实现了对应的解析函数,该 info
  54. 为 JSON 格式,具体内容定义如下:
  55. ```json
  56. {
  57. "name": "shufflenet_test",
  58. "valid": true,
  59. "version": "8.9999.0",
  60. "has_compression": false,
  61. "device": {
  62. "type": "CPU",
  63. "device_id": 0,
  64. "number_threads": 1,
  65. "use_tensor_rt": false,
  66. "enable_inplace_model": false
  67. },
  68. "options":{
  69. "weight_preprocess": false,
  70. "var_sanity_check_first_run": true,
  71. "const_shape": false,
  72. "jit_level": 0,
  73. "record_level": 0
  74. },
  75. "IO":{
  76. "inputs":[
  77. {
  78. "name": "data",
  79. "io_type": "value",
  80. "is_host": true,
  81. "dtype": "float32",
  82. "shape": {
  83. "dim0": 1,
  84. "dim1": 3,
  85. "dim2": 224,
  86. "dim3": 224
  87. }
  88. }
  89. ],
  90. "outputs":[
  91. {
  92. "name": "TRUE_DIV(EXP[12065],reduce0[12067])[12077]",
  93. "io_type": "value",
  94. "is_host": true,
  95. "dtype": "float32",
  96. "shape": {
  97. "dim0": 1,
  98. "dim1": 1000,
  99. "dim2": 0,
  100. "dim3": 0
  101. }
  102. }
  103. ]
  104. }
  105. }
  106. ```
  107. * model_name: 指这个模型的名字,用户可以用来验证是否运行了正确的模型,
  108. 和 Header 部分中的进行对比 check
  109. * valid: 指在这个 info 文件中的设置是否影响模型的 Config
  110. * version: 指模型对应的 megbrain 的版本号,load 模型时候会进行 check
  111. * has_compression: 标识这个模型文件中 tensor 的数据是否压缩过
  112. * device: 目前支持字段包括:"CPU","CUDA","OPENCL","ATLAS"
  113. * number_threads 和 is_inplace_model : 只有在 device 为 CPU 的情况下才生效
  114. * IO::inputs::type: 包括 value,shape,详见 include"network.h"
  115. * IO::inputs::is_host: 值输入数据来自 device 或者来自 host 端
  116. * IO::outputs::is_host: 值输出数据将保存在 device 或者 host 端
  117. * IO::outputs::shape::dimx: 如果为0,则便是该 dim 无效
  118. ### Model部分
  119. 可以是加密的模型文件或者未加密的模型文件
  120. ## 使用
  121. 丰富的使用方法详见文件 example 中文档和对应的 example。
  122. ## 工具
  123. 目前 lite 中有三个工具保存在 tools 目录中,其他 megbrain 工具
  124. 没有包含在内,分别为:
  125. * pack_model_and_info.py 为上面提到的模型打包工具,其为一个
  126. python 脚本,可以直接用其对已有的模型和模型 information 的文件,按照上面
  127. 的格式进行打包模型,用户可以指定模型名字,模型加密方式,模型信息
  128. 文件加密方式,解析方式等,如下:
  129. ```bash
  130. python3 pack_model_and_info.py --input-model xxx.mge \
  131. --model-name="shufflenet_test" \
  132. --model-cryption="RC4_default" \
  133. --input-info xxx.json \
  134. --info-cryption="RC4_default" \
  135. --info-parser="LITE_default" \
  136. -o xxx.lite
  137. ```
  138. * aes_encrypt.sh 为一个 aes 加密方式的加密脚本,可以将一个文件,
  139. 通过指定的的 key 加密成一个 aes 加密的文件,其中 key 为 32 个字节
  140. 16进制数。
  141. ```bash
  142. aes_encrypt.sh xxx.mdl xxx_encrypted.mdl \
  143. 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
  144. ```

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