确定性计算
简介
在应用开发过程中,由于CANN版本或NPU型号等差异,同一算子多次运行的结果可能不完全一致;即使在相同条件下使用相同随机种子,多次NPU执行结果也可能不同。该差异通常源于算子实现中存在异步多线程执行,导致浮点数累加顺序变化。
确定性计算要求平台、设备、软件版本、输入及随机性参数等运行条件相同,不保证跨CANN版本或跨NPU型号的结果一致。
在某些特殊场景下(如实验、调试和回归测试),需要算子多次运行产生相同输出,以便定位问题或进行算法分析,这一方案通常称为“确定性计算”。
注意事项
-
通常建议不开启确定性计算,因为同一算子采用确定性计算一般比非确定性计算执行更慢,可能导致模型单次运行性能下降。但在实验、调试和回归测试等需要保证多次运行结果一致以定位问题或分析算法的场景中,确定性计算可以提升效率。
-
线程说明:暂不推荐在一个线程中多次设置确定性。配置作用域与生效规则以配套版本的Runtime接口文档为准。
使用方法
目前CANN算子的主流调用方式为aclnn API或PyTorch API(由外部TorchNPU框架提供)。部分算子API默认确定性实现,部分算子API默认非确定性实现。对于非确定性实现的算子,部分可通过手动配置确定性计算。
-
调用aclnn API
该场景下,通过《Runtime运行时API》中“运行时配置>aclrtSetSysParamOpt”接口(进程级)开启确定性计算。具体通过设置
ACL_OPT_DETERMINISTIC=1开启确定性计算。 -
调用PyTorch API
该场景下,通过PyTorch原生开关(
torch.use_deterministic_algorithms)开启确定性计算。
对于不同框架的算子API,其默认的确定性计算实现策略请以具体的aclnn API文档或PyTorch API文档描述为准。