已关闭
[Requirement|需求建议]: add external op task framework integration #429
su-yueming创建于  9月18日关闭于  9月20日
su-yueming成员
9月18日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Backgroud(背景信息)

需求功能 :为 opdev 层新增外部算子任务接入框架(Direct Invoke Task),提供 AddDirectInvokeTask SPI 接口,允许算子实现方以 prepare / launch / destroy 三个回调的方式,将自定义计算任务挂接到 ACLNN 两阶段执行框架( aclOpExecutor )中。

解决的问题 :此前外部/自定义算子要接入 ACLNN 执行体系,必须走 AI Core kernel launcher 或描述符式的老接口,无法覆盖"实现方自行管理 kernel 下发、tiling、workspace"的场景。新接口解决了以下问题:

  1. 实现选择、tiling、workspace 计算由算子方自主完成 :prepare 回调在 ACLNN phase 1 同步执行,返回 workspace 需求( DirectInvokeWorkspaceRequest ),由 opbase 统一分配并纳入内存规划(对齐、生命周期复用);
  2. 任务下发与执行器生命周期解耦 :launch 回调在 phase 2 使用调用方 stream 提交计算任务,支持多次 device dispatch;destroy 回调保证 launchState 在任何失败路径上精确销毁一次;
  3. 与执行缓存机制的兼容 :DirectInvoke 不使用 OpExecCache 的设备任务回放,含 DirectInvoke 任务的 executor 自动禁用 device-task cache replay,但保留显式 executor repeat(prepare 一次、launch 每次执行),动态输出 shape 场景则完全禁止 repeat;
  4. DFX 能力对齐 AI Core 路径 :profiling/dump 归因取自 opType 与注册时捕获的 DFX 上下文,支持输入/输出 dump 与溢出检测。

Origin(信息来源)

算子开发

Benefit / Necessity (价值/作用)

  • 打通外部算子接入通道 :外部算子无需侵入 opbase 内部实现,仅通过三个非抛异常回调即可挂入 ACLNN 执行框架,降低接入成本;
  • 内存安全与复用 :workspace 由 opbase executor 统一分配(每字节尺寸一个 DT_UINT8 tensor),享受内存规划器的对齐与复用能力;
  • 执行语义清晰 :明确约定 launchState 地址无关性、args 消费时机、失败路径资源释放责任,避免内存泄漏与重复释放;
  • DFX 能力完备 :与 AI Core 路径一致的 dump/溢出检测/归因能力,保障可维可测;
  • 典型应用场景 :融合算子、第三方库算子(如自定义 kernel、外部加速库调用)以 ACLNN 接口形态接入推理/训练图执行。

Design(设计方案)

总体思路:在 opdev 层新增 Direct Invoke 任务类型( KernelLauncher 子类 DirectInvokeKernelLauncher ,launcher 类型 DIRECT_INVOKE ),以三回调 SPI 替代原描述符式接口(不保留旧 ABI 兼容)。
接口定义 ( direct_invoke_task.h ):

注册流程 ( direct_invoke_task.cpp ):

AddDirectInvokeTask:
  1. 参数校验:回调非空、opType 合法、args 结构完整
     (可选输入 tensor 可为空,输出必须非空,入口 workspace 列表
     必须为空)
  2. 同步调用 prepare(args, &workspaceRequest, &launchState)
     失败 → destroy(launchState) + DestroyOpArgContext
     (args),返回错误
  3. AppendRequestedWorkspaces:按 prepare 返回的 sizes,
     executor->AllocTensor 分配 DT_UINT8 workspace 并追加到 
     args
  4. new (std::nothrow) DirectInvokeKernelLauncher(...)
     任一失败路径保证 destroy 精确调用一次
  5. RegisterKernelLauncher:BuildGraph 构图 + 
  AddToKernelLauncherList
  6. executor->AbandonCache(includeOutShape)
     —— 禁用 device-task cache replay(launchState 可经显式 
     repeat 复用,
        但 launch 回调每次执行;动态输出 shape 完全禁止缓存)

执行流程 : DirectInvokeKernelLauncher::Launch() 恢复注册时捕获的 TLS L0 上下文 → 输入 dump → 调用 launch_(launchState, args, stream) → 输出 dump → 成功后按需溢出检测(模型捕获场景跳过)。

关键设计约束 :

  • launchState 必须地址无关,最终 tensor/workspace 地址从 launch 的 args 获取;
  • repeatability 检查复用 AI CPU 路径的 LauncherRepeatableChecker ;
  • workspace 尺寸合法性校验(非 0、不超过 int64 最大值);
  • OOM 异常路径加固,所有失败路径无泄漏、无重复释放。
    配套改动 :新增 AddDirectInvokeTask.md 接口文档、opbase.xml 打包清单、stub 生成(gen_stubapi.py),以及 944 行 UT( test_direct_invoke.cpp )覆盖参数校验、失败路径资源回收、workspace 分配、repeat 与缓存禁用等场景。
likedislike
Ssu-yueming成员
9月18日 添加了label:requirement
Ssu-yueming成员
9月18日 将 su-yueming 设为负责人
Ssu-yueming成员
9月18日 修改标题为 “[Requirement|需求建议]: add external op task framework integration”,原标题为“[Requirement|需求建议]: ”
CANN-robotCANN-robot成员
9月20日 关闭了 issue
CANN-robotCANN-robot成员
9月20日 添加了label:resolved
Ssu-yueming成员
9月29日 关联了pull request:feat(opdev): add external op task framework integration