1 系统环境
- 硬件环境(Ascend/GPU/CPU): Ascend310
- MindSpore版本: mindspore=1.8.1
- 执行模式(PyNative/ Graph): Graph
- Python版本: Python=3.7
- 操作系统平台: Linux
2 报错信息
2.1 问题描述
模型训练阶段loss正常收敛。但在推理阶段,即使使用完全相同的输入数据,连续运行多次推理,模型的输出置信度会有明显差异,差值最高能达到15%左右。推理时间也会出现不规律的突增,从监控数据看,NPU利用率在性能下降时并没有明显变化。
2.2 报错信息
[ERROR] RUNTIME: aicpu kernel execute failed, fault kernel_name=GetNext
3 根因分析
在GPU上稳定但在昇腾310上不稳定的直接原因,通常是因为算子精度和内存复用。
昇腾310使用低精度(FP16/INT8)计算来提升性能。在推理时,如果模型的某些算子(如ReduceMean、Softmax、LayerNorm)在FP16下的数值稳定性不佳,或不同批次间由于计算顺序的微小差异(异步执行、并行计算)被放大,就会导致输出波动。
4 解决方案
1、强制FP32推理 :在模型转换(converter_lite 工具)或推理代码中,尝试强制使用FP32精度。
# 在代码中尝试设置context
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend")
context.set_context(ascend_config={"precision_mode": "force_fp32"}) # 尝试强制FP32
2、关闭内存复用,如果某块内存未被正确清空(初始化),残留数据可能被下一个计算使用,导致随机干扰导致报错。
context.set_context(ascend_config={"op_precision_mode": "must_keep_origin_dtype", "variable_memory_max_size": "0"})
# 或者尝试更直接的配置 (不同版本参数名可能略有不同,请查阅对应版本文档)
context.set_context(ascend_config={"memory_optimize_level": "O0"})