关于在昇腾众智项目中提交了5个模型这件事
关于在昇腾众智项目中提交了5个模型这件事
我负责了学校华为模型迁移的对接工作,自己也参与其中。项目周期中总共完成了5个模型的迁移。其中MindSpore
模型一个,Tensorflow
模型四个。想通过这篇博客分享一下模型开发过程,一起其中遇到的一些问题,希望可以和开发者们共同进步。
1.所用到的工具
昇腾全栈AI软硬件平台产品非常完善,这次我参与的众筹项目是把给定的几个模型在昇腾环境上跑通训练脚本,精度达标后跑通离线推理。我主要涉及ModelArts
平台、ModelZoo
仓库、MindSpore
和Tensorflow
软件框架三个产品的使用。
2.迁移的步骤
-
首先是本地跑通模型的代码,跑通本之后,由于目前昇腾环境只对
Tensorflow1.15
做了适配,所以我们要在本地先把训练脚本迁移到1.15的版本。 -
本地跑通之后,需要使用
ModelArts
来跑代码,ModelArts
可以提供装有CANN
和Ascend NPU
硬件的训练环境。我当时使用的是Pycharm ToolKit
工具,可以很方便的调试Python
代码,一键就能上传代码、数据集,然后拉起训练任务。
-
当你在
ModelArts
跑通了之后,说明你本地的1.15版本移植是正确的,这时候需要按照模型迁移手册,指定模型创建的Session
下沉到NPU
去运行。 -
调参、调参、调参。
-
精度达标后,又要读离线推理的文档。主要工作是将模型的
ckpt
转换成pb
,然后使用CANN
提供的ATC
命令将pb
转换成om
,最后使用离线推理工具msame
运行om
文件。
3. 一些经验
3.1keras的迁移和转pb并不比session麻烦
迁移首先需要解决Tensorflow
的版本问题,之后就是把Session
下沉到NPU
。按照迁移手册也就是几行代码的事情,根据Tensorflow
写法,迁移最长见的是以下两类:
session.run(config=config)
keras.backend
第一类是最简单的情况,只需要构造NPU Session Config,然后传进去即可。keras也只需要通过backend设置 NPU Session Config。框架的本质就是session,所以基于keras的模型,NPU Session Config也是使用backend.set_session()
方法迁移的。只要通过keras.backend.get_session()
方法获取到session,那么后续转ckpt、转pb、转om的步骤都是一样的。没有像文档中所说的,对keras的支持那么不友好。
3.2 对数据和模型有充分理解再开始工作
在做模型的过程中,最经典的就是动态shape问题。由于TF支持程度一开始对NPU支持不太友好,我们需要规避动态shape问题,很多小伙伴看到报错就大失所望,其实只要静下来读一读代码,知道了输入数据的形状,网络的结构大致是怎么样的,就很好解决动态shape问题。只需要把shape的第一维度None设置成给定的batch size,就可以解决大部分问题了。
3.3 离线推理中的模型转换
模型转换的一般步骤就是先把ckpt
转换为pb
再转换为om
。这个过程中,需要你对模型的输入数据、输出数据的形状有特别清晰的认识。不然你在使用ATC
命令,阅读msame
工具文档的时候,会有很多名词对不上。输入数据的形状固定了,那么网络中各个阶段的输入也就固定了。在完成模型迁移的时候,一定要慢慢来,把模型和数据研究透彻,再开始做。
3.4 离线推理中的数据格式
由于msame
工具仅支持使用bin
文件的形式进行推理,数据处理一般都是python
中用一个迭代器取数据。我认为最好用的方式是使用numpy
的tofile()
方法,指定文件名为bin
即可。但是我在实践中发现,有很多om精度不达标的问题,都出在tofile()
导出的时候,没有给定数据格式。如果数据精度和tofile()
默认保存的精度不一样,那么喂给om
之后得到的结果肯定也是错的。在tofile()
的方法中就要指定好数据精度,在pb
转om
的过程中,要保证输入数据的精度和tofile()
时的精度一致。
4. 总结和收获
- 要增强对问题的描述能力,Issue写的好,才能和研发工程师们高效交流。回顾很多Issue,如果某个问题换个说法,可以更快解决
- 工欲善其事必先利其器,写代码不要着急动手,要读完相关文档再行动
5. 比较重要的文档:
Wiki上比较重要的教程
- [简历个人分支&提交代码]([https://gitee.com/ascend/modelzoo/wikis/002 建立个人分支&提交PR?sort_id=3282131](https://gitee.com/ascend/modelzoo/wikis/002 建立个人分支&提交PR?sort_id=3282131))
- 如何规避动态shape
- 离线推理案例分享
官方文档:
- 点赞
- 收藏
- 关注作者
评论(0)