[干货分享]
MindSpore Lite体验笔记 之 端侧部署用模型的转换
本文记录一下模型部署相关的MindSporeLite模型转换过程:mindir模型转ms模型
这里的ms模型是适用于端侧部署的,所以这个转换可以看成是部署的第一步。
## 环境
64位X86 ubuntu 16.04
MindSpore 1.1.0
## clone代码
因为需要在本地编译并生成模型转换与推理相关的一系列文件,先下载MindSpore代码。
这里是从r1.1这个分支下载的。
```bash
unseenme@v100:~/study/github$ git clone -b r1.1 --depth=1 https://github.com/mindspore-ai/mindspore.git
```
访问Github困难的小伙伴们可以从Gitee下载。
## 编译
下载完成后,进入目录,通过下面的脚本与参数,进行一键编译。
这个脚本真的是非常方便,这里手动点赞!
```bash
unseenme@v100:~/study/github/mindspore$ bash build.sh -I x86_64
```
编译需要一定的时间,最后完成的时候有如下提示。
```bash
---------------- mindspore lite: build success ----------------
```
编译成功,在output目录下生成四个文件。
- mindspore-lite-1.1.0-converter-linux-x64.tar.gz
- mindspore-lite-1.1.0-converter-linux-x64.tar.gz.sha256
- mindspore-lite-1.1.0-inference-linux-x64.tar.gz
- mindspore-lite-1.1.0-inference-linux-x64.tar.gz.sha256
如下图所示。
其中,带有converter的包里是模型转换相关文件,
带有inference的包里是模型推理相关文件。
解压converter包,看看里面都有什么。
```bash
unseenme@v100:~/study/github/msmaster/output$ tar -xf mindspore-lite-1.1.0-converter-linux-x64.tar.gz
```
得到这样三个文件夹。

用tree命令看一下具体内容。
```bash
unseenme@v100:~/study/github/msmaster/output$ tree ./mindspore-lite-1.1.0-converter-linux-x64
./mindspore-lite-1.1.0-converter-linux-x64
├── converter
│ ├── converter_lite
├── lib
│ └── libmindspore_gvar.so
└── third_party
└── glog
└── lib
└── libglog.so.0
```
其中包括一个可执行文件converter_lite,和依赖库。
## 环境配置
想要在运行可执行文件的时候可以找到依赖库,我们需要配置一下环境
```bash
unseenme@v100:~/study/github/msmaster/output$ export LD_LIBRARY_PATH=/home/unseenme/study/github/msmaster/output/mindspore-lite-1.1.0-converter-linux-x64/lib:/home/unseenme/study/github/msmaster/output/mindspore-lite-1.1.0-converter-linux-x64/third_party/glog/lib
```
这里我使用了绝对路径。各位需要在自己机器上根据实际情况修改成自己的路径。
## 模型转换
先从这个网址下载一个已经训练好的模型:
```bash
https://download.mindspore.cn/model_zoo/official/lite/mobilenetv2_openimage_lite/mobilenetv2.mindir
```
下载的模型保存在相应目录,并进入目录,开始转换:
```bash
unseenme@v100:~/study/github/mindspore/output/mobilenetV2$ ../mindspore-lite-1.1.0-converter-linux-x64/converter/converter_lite --fmk=MINDIR --modelFile=./mobilenetv2.mindir --outputFile=./mobilenetv2
WARNING: Logging before InitGoogleLogging() is written to STDERR
[ERROR] CORE(14192,converter_lite):2021-02-08-11:28:39.518.723 [mindspore/core/load_mindir/anf_model_parser.cc:837] MSANFParseModelConfigureInfo] Parse model producer version from pb file failed!
[ERROR] CORE(14192,converter_lite):2021-02-08-11:28:39.518.742 [mindspore/core/load_mindir/anf_model_parser.cc:856] Parse] Parse configuration info for pb file failed!
[ERROR] CORE(14192,converter_lite):2021-02-08-11:28:39.518.749 [mindspore/core/load_mindir/anf_model_parser.cc:282] BuildInputForFuncGraph] mind_ir ValueInfoProto has no name!
[ERROR] CORE(14192,converter_lite):2021-02-08-11:28:39.518.753 [mindspore/core/load_mindir/anf_model_parser.cc:317] ImportParametersForGraph] Build input for funcgraph fail at index: 0
[ERROR] CORE(14192,converter_lite):2021-02-08-11:28:39.518.756 [mindspore/core/load_mindir/anf_model_parser.cc:822] BuildFuncGraph] import parameters for graph fail!
[ERROR] CORE(14192,converter_lite):2021-02-08-11:28:39.518.760 [mindspore/core/load_mindir/anf_model_parser.cc:860] Parse] Build funcgraph failed!
[ERROR] LITE(14192,converter_lite):2021-02-08-11:28:39.520.162 [mindspore/lite/tools/converter/converter.h:60] BuildFuncGraph] get funcgraph failed.
[ERROR] LITE(14192,converter_lite):2021-02-08-11:28:39.520.310 [mindspore/lite/tools/converter/converter.cc:58] Convert] Parser/Import model return nullptr
[ERROR] LITE(14192,converter_lite):2021-02-08-11:28:39.520.337 [mindspore/lite/tools/converter/converter.cc:125] RunConverter] CONVERT RESULT FAILED:0 No error occurs.
CONVERT RESULT FAILED:0 No error occurs.
unseenme@v100:~/study/github/mindspore/output/mobilenetV2$
```
出现了ERROR。这里经过多方求证,初步认为是r1.1分支的问题。
所以,我们换成master分支,重新试一次。
## 换成master分支的代码再试一次
从master进行clone:
```bash
unseenme@v100:~/study/github$ git clone -b master --depth=1 https://github.com/mindspore-ai/mindspore.git msmaster
```
之后,编译、解压、export都和第一次一样,不再重复。
这次为了方便,直接复制 mobilenetv2.mindir 到converter目录,然后再次转换:
```bash
unseenme@v100:~/study/github/msmaster/output/mindspore-lite-1.1.0-converter-linux-x64/converter$ ./converter_lite --fmk=MINDIR --modelFile=./mobilenetv2.mindir --outputFile=./mobilenetv2
CONVERT RESULT SUCCESS:0
unseenme@v100:~/study/github/msmaster/output/mindspore-lite-1.1.0-converter-linux-x64/converter$
```
这次成功了。
```bash
unseenme@v100:~/study/github/msmaster/output/mindspore-lite-1.1.0-converter-linux-x64/converter$ ls
converter_lite mobilenetv2.mindir mobilenetv2.ms
```

生成了我们想要得到的ms文件,以后可以用这个ms模型进行推理部署。
体验结束。
## 参考文献
- 编译
https://www.mindspore.cn/tutorial/lite/zh-CN/r1.1/use/build.html
- 下载模型
https://download.mindspore.cn/model_zoo/official/lite/mobilenetv2_openimage_lite/mobilenetv2.mindir
- 推理模型转换
https://www.mindspore.cn/tutorial/lite/zh-CN/r1.1/use/converter_tool.html