1. 系统环境
硬件环境(Ascend/GPU/CPU): Ascend
软件环境:– MindSpore 版本: 1.8.0
执行模式: 静态图(GRAPH) – Python 版本: 3.7.5
操作系统平台: linux
2. 问题
网络边训练边推理,每进行一个epoch进行一次推理,推理的精度总是不变;
3. 定位思路及过程
1. 每个epoch都保存了ckpt,load ckpt查看参数,每个参数都变了,说明参数是正常更新的;
2. 怀疑是不是eval有问题,使用pth转的ckpt做推理,精度差不多,说明前向和推理有问题可能性不大;
3. 怀疑是不是函数式的写法还未支持完善,改为model.train形式实验,发现loss变化趋势差不多,排除;
4. 打印eval的时候前向结果,这是个三分类网络,发现前向结果均为2,怀疑很大可能是训练不好导致的;
5. 要到torch脚本,先排查loss函数,优化器和学习率,是对应的;对比参数初始化方法,代码上思路相同;打印参数初始化方法中的param name,发现原意为筛调预训练模型bert的param不初始化,但实际代码中虽然做了筛选,但后面直接使用了self.parameter获取了所有的param,应改为cell.parameter
最后发现出现问题的代码是:
for cell in self.cells():
if type(cell) != BertModel:
for param in self.get_parameter:
xxxxx
self.get_parameter获取了整个网络的parameter,而不是cell的parameter