当前 OpKernelLib 在加载算子信息库 JSON(aic-*-ops-info.json)时,仅支持从 $ASCEND_OPP_PATH/vendors/<vendor>/ 与 built-in 路径中读取,未支持用户通过 ASCEND_CUSTOM_OPP_PATH 环境变量指定自定义算子包(custom opp)路径。这导致用户使用自定义算子包部署算子时,自定义算子信息库无法被 OpKernelLib::Initialize() 正确加载,自定义算子无法参与算子信息库的解析与调度。
OpKernelLib
$ASCEND_OPP_PATH/vendors/<vendor>/
ASCEND_CUSTOM_OPP_PATH
OpKernelLib::Initialize()
此外,原有路径获取函数(GetConfigFilePaths / GetCustomFilePaths)命名与职责混淆,GetCustomFilePaths 实际只处理 ASCEND_OPP_PATH/vendors 路径,无法表达「自定义算子包」这一独立来源;空路径检查使用 OP_CHECK(realCustomFilePath == "", emplace_back(...)) 反向逻辑,存在把空 real path 错误加入列表的风险。
GetConfigFilePaths
GetCustomFilePaths
ASCEND_OPP_PATH/vendors
OP_CHECK(realCustomFilePath == "", emplace_back(...))
开发过程中发现的问题
应用场景:用户基于昇腾平台二次开发或部署自定义算子包时,需要通过 ASCEND_CUSTOM_OPP_PATH 让运行时识别自有算子信息库,并优先于 vendors / built-in 生效。
在 src/nnopbase/composite_op/aclnn_engine/op_kernel_lib.{h,cpp} 中:
src/nnopbase/composite_op/aclnn_engine/op_kernel_lib.{h,cpp}
GetBuiltInFilePaths()
GetOppVendorsFilePaths()
$ASCEND_OPP_PATH/vendors/<vendor>/...
GetCustomOppFilePaths()
CUSTOM_IMPL_PATH
<custom_impl>/aic<TARGET_SOC>/*-ops-info.json
/
mmRealPath
Initialize()
built-in → insert(opp-vendors) at begin → insert(custom-opp) at begin → reverse
merge_patch
OP_CHECK(realCustomFilePath == "", emplace_back)
if (empty) warn; else emplace_back
OP_LOGD
OP_LOGI
GetSocPath()
initFlag_
socPath_.empty()
testGetSocPathConsistentAcrossCalls
测试覆盖(tests/nnopbase/ut/composite_op/test_op_kernel.cpp):
testGetCustomOppFilePaths
Initialize_MergePriority_CustomOppWinsOverVendorsAndBuiltin
关联 PR:https://gitcode.com/cann/opbase/pull/620
Backgroud(背景信息)
当前
OpKernelLib在加载算子信息库 JSON(aic-*-ops-info.json)时,仅支持从$ASCEND_OPP_PATH/vendors/<vendor>/与 built-in 路径中读取,未支持用户通过ASCEND_CUSTOM_OPP_PATH环境变量指定自定义算子包(custom opp)路径。这导致用户使用自定义算子包部署算子时,自定义算子信息库无法被OpKernelLib::Initialize()正确加载,自定义算子无法参与算子信息库的解析与调度。此外,原有路径获取函数(
GetConfigFilePaths/GetCustomFilePaths)命名与职责混淆,GetCustomFilePaths实际只处理ASCEND_OPP_PATH/vendors路径,无法表达「自定义算子包」这一独立来源;空路径检查使用OP_CHECK(realCustomFilePath == "", emplace_back(...))反向逻辑,存在把空 real path 错误加入列表的风险。Origin(信息来源)
开发过程中发现的问题
Benefit / Necessity(价值/作用)
ASCEND_CUSTOM_OPP_PATH环境变量的支持,使自定义算子包用户能够通过环境变量指定算子信息库路径,自定义算子可被正常加载调度。应用场景:用户基于昇腾平台二次开发或部署自定义算子包时,需要通过
ASCEND_CUSTOM_OPP_PATH让运行时识别自有算子信息库,并优先于 vendors / built-in 生效。Design(设计方案)
在
src/nnopbase/composite_op/aclnn_engine/op_kernel_lib.{h,cpp}中:GetBuiltInFilePaths()(原GetConfigFilePaths):读取 built-in 路径下的算子信息库 JSON。GetOppVendorsFilePaths()(原GetCustomFilePaths):读取$ASCEND_OPP_PATH/vendors/<vendor>/...路径,并补全对单个 vendor 目录读取失败时跳过、空 real path 跳过的处理。GetCustomOppFilePaths()(新增):基于CUSTOM_IMPL_PATH(来自ASCEND_CUSTOM_OPP_PATH多路径解析),读取<custom_impl>/aic<TARGET_SOC>/*-ops-info.json;显式在路径中补/,兼容mmRealPath是否保留尾部斜杠的两种实现。Initialize()中按优先级合并路径列表:built-in → insert(opp-vendors) at begin → insert(custom-opp) at begin → reverse,最终保证 custom-opp 在前、built-in 在后;merge_patch顺序遍历使高优先级(靠前)覆盖低优先级。OP_CHECK(realCustomFilePath == "", emplace_back)改为正向if (empty) warn; else emplace_back,避免把空路径加入候选。OP_LOGD(调试级)升级为OP_LOGI(信息级),便于在运行时定位算子信息库加载问题。GetSocPath()去掉initFlag_短路条件(仅保留socPath_.empty()判断),保证多次调用返回一致的 SoC 路径,配合新增的testGetSocPathConsistentAcrossCallsUT 验证。测试覆盖(tests/nnopbase/ut/composite_op/test_op_kernel.cpp):
testGetCustomOppFilePaths:覆盖 env 未设置 / 单路径 / 多路径(冒号分隔)/ dir 不存在 四个分支。Initialize_MergePriority_CustomOppWinsOverVendorsAndBuiltin:验证 custom-opp 优先级覆盖 vendors 与 built-in。testGetSocPathConsistentAcrossCalls:验证多次调用GetSocPath()返回值一致。关联 PR:https://gitcode.com/cann/opbase/pull/620