MindSpore开发NLP模型中遇到的问题和解决经验分享
本文分享我在参与MindSpore的NLP模型开发中遇到的一些问题以及最终是如何解决的。如果大家有遇到类似的问题欢迎讨论交流。
问题一:训练时性能差。
一开始mindspore实现的模型使用八卡跑22个小时都跑不完训练,每一步需要跑3000+ms。
后来得知由于Ascend芯片矩阵运算的设计,会存在需要和16对齐的要求。尝试后发现,MindSpore的mindspore.nn.Embedding()函数中的两个参数vocab_size和embedding_size需要设置为16的倍数,不然会对性能有很大的影响。修改后使用八卡跑完训练只需要半个小时,每步只需要300+ms,性能提高了10倍以上。
问题二:处理得到的mindrecord数据训练中使用报错。
将处理好的mindrecord数据读出来用于训练时发现维度多了一维,而直接处理数据并送入模型不会出错,因此将问题定位在了数据处里为mindrecord格式和读取mindrecord那里。尝试后发现,在数据处理为mindrecord的时候就将batch size设置为了8,而在读取mindrecord时又将参数batch_size设置为了8,导致数据读出来后直接多了一维。最终将数据在处理为mindrecord时的batch size设置为1就可以解决这个问题了。
问题三:静态图中有的算子会报错。
MindSpore中mindspore.nn、mindspore.ops、mindspore.numpy中有一些同名参数相同功能也相同的算子,但有的使用后在动态图中不会报错但静态图中会报错,替换为不同的包里的同名函数后静态图不会报错。推测可能是这些同名算子中有的能够支持静态图而有的不行。