已关闭
[Requirement|需求建议]: 支持确定性计算与一致性开关动态生效 #259
ren-botao创建于  7月10日关闭于  7月13日
ren-botao成员
7月10日 创建

Background(背景信息)

本需求涉及算子确定性强一致性开关的运行时获取。

当前 aclnn 框架已支持运行时获取这两类开关:

  1. 算子级:在 InitL2Phase1Context 中通过 aclrtGetSysParamOpt(ACL_OPT_DETERMINISTIC, &determinConfig) 获取确定性计算开关,取值为 0 / 1
  2. 进程级:在 TilingParseCtxHolder::BuildTilingParseCtx 中以进程级方式获取一次 ACL_OPT_STRONG_CONSISTENCY(强一致性开关,取值 0 / 1;具体逻辑与注释可参见该函数实现)。

随着 ACL runtime 侧语义演进,ACL_OPT_DETERMINISTIC 的取值需要扩展为 4 档,且前向包含(即高值包含低值的所有语义):

取值 含义
0 关闭
1 开启确定性计算
2 开启强一致性计算(确定性也开)
3 开启 batch 一致性计算(强一致性、确定性也开)

语义变化:相当于把 ACL_OPT_STRONG_CONSISTENCY 的取值合并到 ACL_OPT_DETERMINISTIC 中,并新增 batch 一致性开关。在此背景下,aclnn 框架需要支持确定性计算与一致性开关的动态生效

Origin(信息来源)

*项目客户对batch一致性提出需求:
在算法调测调试期间,需要支持算子级控制,用于精度调测时逐算子关闭、打开batch一致性,对比精度;且开关要支持动态配置。

Benefit / Necessity(价值/作用)

  1. 简化为单一开关:把原 ACL_OPT_STRONG_CONSISTENCY 合并进 ACL_OPT_DETERMINISTIC,下游只感知一个 level,不再需要在 aclnn 框架内单独维护一致性开关的进程级缓存。
  2. 新增能力:为 batch 一致性(level=3)铺路,扩展算子精度档位。
  3. 动态生效:进程内可运行时切换 level,无需重启,便于精度对比、回归验证与动态调优。

Design(设计方案)

按需求侧的 4 个动作组织,每条动作下方列出实现侧的对应改动:

1. 在 InitL2Phase1Context 中动态获取 ACL_OPT_DETERMINISTIC

  • 保持调用 aclrtGetSysParamOpt(ACL_OPT_DETERMINISTIC, &determinConfig),每个 aclnn 接口入口处都取一次,保证动态生效。
  • 变量命名:需求方提出 determinConfig 是否改名为 deterministicLevel。实现侧确认采用 deterministicLevel,更贴合"4 档 level"的语义。
  • 实现侧:在 src/nnopbase/composite_op/aclnn_engine/op_executor.cpp 中新增静态函数 GetDeterministicLevelFromRt() 封装读取逻辑,由 InitL2Phase1Context 调用。

2. 兼容性升级逻辑(兼容老 runtime)

  • 获取到 deterministicLevel 后判断:若 == 1,则再调用 aclrtGetSysParamOpt(ACL_OPT_STRONG_CONSISTENCY, &consistency);若 consistency == 1,则把 deterministicLevel 修改为 2,否则保持原值。
  • 该判断是为了兼容 ACL_OPT_DETERMINISTIC 不支持返回强一致性语义的老版本 runtime。
  • 实现侧:升级动作通过 OP_LOGI 记录日志 "Upgrade deterministic level from 1 to 2, because strong consistency is on."

3. 将新 level 值写入 cache key

  • src/nnopbase/common/utils/op_cache.cppAddOpConfigInfoToBuf 中,把原 1 byte bool deterministic 改为 4 byte int32_t deterministicLevel 参与哈希,避免不同 level 命中同一份 tiling 缓存。
  • include/nnopbase/opdev/op_config.h 中的 OpConfigInfo 同步新增 int32_t deterministicLevel_{0}(删除原 reserved[6] 占位,结构体大小保持兼容),拷贝构造与赋值运算带上新字段。

4. 给 tilingCtx 的数据(两路输出)

  • Deterministic_ = deterministic >= 1
  • DeterministicLevel_ = deterministic
  • 实现侧 src/nnopbase/composite_op/aclnn_engine/tiling_parse_ctx_holder.{h,cpp}GetDeterministicLevel() 改为每次从 TLS opConfigInfo_.deterministicLevel_ 现场读取,DeterministicLevel_ 改为 mutable
  • 同时删除 BuildTilingParseCtxstatic std::call_once 一次性获取 ACL_OPT_STRONG_CONSISTENCY 与原计算 level 的整段逻辑——上游 InitL2Phase1Context 已动态取值,此处不再需要重复缓存。

测试

  • tests/nnopbase/ut/composite_op/test_op_cache.cpptest_op_executor.cpptest_tilingctx_builder.cpp 配合上述 4 个动作更新用例。
  • tests/nnopbase/common/depends/acl/aclrt_stub.cpp 补齐 ACL_OPT_STRONG_CONSISTENCY 桩。

关联 PR:https://gitcode.com/cann/opbase/pull/631

likedislike
Rren-botao成员
7月10日 添加了label:requirement
Rren-botao成员
7月10日 修改了issue 的描述
Rren-botao成员
7月10日 将 ren-botao 设为负责人
CANN-robotCANN-robot成员
7月13日 关闭了 issue
CANN-robotCANN-robot成员
7月13日 添加了label:resolved