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

**1. 报错信息**

-   使用盘古智子38B V18版本在昇腾910上推理，结果有随机性，无法实现固定输出（greedy模式）。
-   想要得到greedy模式下每次输出一致。

**3. 根因分析**

-   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，用来开启算子的计算确定性。
-   增加上述配置以后，发现算子的计算确定性没有开启成功。

**3. 解决方案**

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

