已关闭
[Bug-Report|缺陷反馈]: 多个算子执行example失败 #6854
丛吉钰创建于  3 天前关闭于  3 天前
丛吉钰
丛吉钰成员
3 天前 创建

Describe the current behavior / 问题描述 (Mandatory / 必填)

ops-nn 流水线在同一节点串行执行多个算子的 eager cust 冒烟 job,各 job 以
--vendor_name=<算子名> 将自定义算子包装到独立 vendor 目录。当相邻 job 的安装包
存在同名算子注册(本 MR 各 matmul 算子因依赖展开,包内容天然重叠)时,后执行 job
的示例进程在运行期崩溃:

double free or corruption (!prev)
Run eager example failed, op_name: gemm_v3, failed_example: gemmv3

Environment Information / 环境信息 (Mandatory / 必填)

不涉及

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

  1. 安装两个内容重叠的 vendor 包:
    bash cann-ops-nn-batch_mat_mul_v3_linux-aarch64.run --quiet # → batch_mat_mul_v3_nn
    bash cann-ops-nn-gemm_v3_linux-aarch64.run --quiet # → gemm_v3_nn
  2. 运行示例:
    bash build.sh --run_example gemm_v3 eager cust --vendor_name=gemm_v3
    → ❌ double free or corruption (!prev)
  3. 移除任一 vendor 目录,仅保留一个,重跑:
    → ✅ 成功

Describe the expected behavior / 预期结果 (Mandatory / 必填)

编译成功

CI 日志时序(job 12095):
15:03:31 安装 batch_mat_mul_v3 包 → vendors/batch_mat_mul_v3_nn
15:03:39 bmmv3 的 5 个示例全部通过(此时节点仅一个 vendor,单份注册)
15:04:07 安装 gemm_v3 包 → vendors/gemm_v3_nn
15:04:14 gemm_v3 示例 double free 崩溃(此时两个 vendor 目录共存)

Special notes for this issue/备注 (Optional / 选填)

  1. 复现矩阵(本地,同一 CI 构建包):

    vendors 目录状态 结果
    仅 gemm_v3_nn ✅ 成功
    仅 custom_nn ✅ 成功
    两者共存(重叠算子) ❌ double free
  2. 包内容重叠证据(解包对比两个 CI 包的注册库):

    • batch_mat_mul_v3_nn/liboptiling.so 注册:BatchMatMulV3、GemmV3、
      MatMulV3、TransposeBatchMatMul
    • gemm_v3_nn/liboptiling.so 注册:与上面完全相同的 4 个算子
    • 依赖传递展开(bmmv3→mmv3、gemm_v3→mmv3/fused/transpose/gemm)使不同
      job 的包收敛到同一算子集合,各自生成一份独立的注册库
  3. 触发原理:

    • 每个算子包的 proto/tiling 按"本次配置的算子集合"整库生成,注册代码以
      REG_OP/OP_ADD/IMPL_OP_INFERSHAPE 宏展开的全局对象构造函数(静态初始化
      器)形式存在于 liboptiling.so / libcust_opsproto_rt2.0.so 中
    • 运行时 aclInit/GE 初始化会 dlopen $ASCEND_OPP_PATH/vendors/ 下【每个】
      vendor 目录的注册库;每个 .so 是独立 ELF,其静态初始化器在加载时各自
      执行一遍 → 同名算子在进程全局注册表中出现两条
    • 注册靠"加载时执行构造代码"而非符号链接,两个库互不可见,无法去重;
      注册表对同名重复注册既不报错也不跳过
    • RunGraph 编译查询/注册表遍历时,同一算子的两份注册对象被先后处理,
      内部资源被释放两次 → glibc "double free or corruption (!prev)"
  4. 已排除项:

    • 算子示例/实现代码问题:ASAN 全流程检测干净
    • 包内容问题:CI 同款包本地单 vendor 环境运行正确
    • CANN 版本问题:9.2.0 与 9.3.0 均可复现

ops-nn CMake 工程能否适配"不重复注册"

结论:无法根治,不建议为绕过框架缺陷做架构级改造。原因:

  1. 重复的根源是"两个独立安装的包各自携带同一算子的注册代码",cmake 构建期
    无法感知运行环境上会共存哪些 vendor 包
  2. 依赖算子的源码必须参与编译(如 gemm 的 aclnn_gemm.cpp 链接 mat_mul_v3 的
    ExecAddmmGraph 等),其 def/infershape 的注册宏与功能代码同库,无法
    "只编功能代码不编注册代码";按算子拆分注册库属于打包架构级改造
    (需动 package.cmake/symbol.cmake/gen_ops_info 及全部流水线)
  3. 即便裁剪包内容,也无法防御任意第三方 vendor 共存的场景;
    "重复注册不崩溃"(幂等或冲突报错)本质上只能由运行时注册表保证
likedislike
丛吉钰丛吉钰成员
3 天前 添加了label:bug-report
丛吉钰丛吉钰成员
3 天前 修改标题为 “[Bug-Report|缺陷反馈]: 多个算子执行example失败”,原标题为“[Bug-Report|缺陷反馈]: ”
丛吉钰丛吉钰成员
3 天前 将 cong-jiyu 设为负责人
CANN-robotCANN-robot成员
3 天前 关闭了 issue
CANN-robotCANN-robot成员
3 天前 添加了label:resolved