[干货分享] 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 ``` 得到这样三个文件夹。 ![2-1-converter.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202102/21/205431jkolmnva7w1bzyv7.png) 用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 ``` ![2-1-convert_result.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202102/21/205518nnngzmc7bepcbo2y.png) 生成了我们想要得到的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