盘古-智子38B在昇腾910上,greedy模式下无法固定输出

问题描述

  • 使用盘古智子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)不一致。
  • 考虑到端到端的回答内容虽然存在不一致,但是内容上都属于合理的回答,所以应该不属于精度问题,而是推理过程中某些随机性导致的计算结果的随机性,进而导致最终答案的随机性。
  • 推理过程中可能涉及到随机性的有:
    1. 原理上有随机性的算子(如Dropout)
    2. 多卡通信涉及到的算子(如AllReduce)
    3. 计算上存在随机性的算子(atomic类算子,如ReduceSum, Matmul等)
  • 由于是推理过程,而不是训练,所以模型中应该不存在Dropout等原理上有随机性的算子。排查后排除了上面第一条的影响。
  • 通过在启动脚本中加入如下环境变量,可以排除上面第二条的影响:
export HCCL_DETERMINISTIC=true
  • 通过在config.ini中增加ge.deterministic,用来开启算子的计算确定性。
  • 增加上述配置以后,发现算子的计算确定性没有开启成功。

问题解决

是当前CANN版本MatMul算子确定性有问题,建议升级CANN版本。升级到MindSpore 2.2 + CANN7.0 + 对应的智子版本后,gready模式下,输出一致。