问题描述
- 使用盘古智子38B V18版本在昇腾910上推理,结果有随机性,无法实现固定输出(greedy模式)。
- 想要得到greedy模式下每次输出一致。
问题分析
- greedy模式主要是将后处理的下面3个参数修改成如下值:
TOP_K_NUM=1
TOP_P=0.0 # greedy: 0.0; sampling: 1.0
TEMPERATURE=0.3
- 当前端到端输出不一致,因为包含前后处理,所以先在model.predict接口前后打点,确认predict接口的输入和输出在多次调用下值是否一致。
- 根据保存的输入输出数据,发现输入数据一致,但是输出数据(logits)不一致。
- 考虑到端到端的回答内容虽然存在不一致,但是内容上都属于合理的回答,所以应该不属于精度问题,而是推理过程中某些随机性导致的计算结果的随机性,进而导致最终答案的随机性。
- 推理过程中可能涉及到随机性的有:
- 原理上有随机性的算子(如Dropout)
- 多卡通信涉及到的算子(如AllReduce)
- 计算上存在随机性的算子(atomic类算子,如ReduceSum, Matmul等)
- 由于是推理过程,而不是训练,所以模型中应该不存在Dropout等原理上有随机性的算子。排查后排除了上面第一条的影响。
- 通过在启动脚本中加入如下环境变量,可以排除上面第二条的影响:
export HCCL_DETERMINISTIC=true
- 通过在config.ini中增加
ge.deterministic,用来开启算子的计算确定性。 - 增加上述配置以后,发现算子的计算确定性没有开启成功。
问题解决
是当前CANN版本MatMul算子确定性有问题,建议升级CANN版本。升级到MindSpore 2.2 + CANN7.0 + 对应的智子版本后,gready模式下,输出一致。