本 RFC 在已有的语言无关自定义算子基础能力(EagerExecuteOp)之上,提出三项高阶优化能力:地址刷新(消除 I/O 地址变化时的 D2D 拷贝)、辅流(运行时动态辅流申请,支持多流并行)、私有 tensor 格式支持(自定义算子声明和推导 5HD 等非 ND 数据格式)。三项能力相互独立,开发者可按需组合。 自定义算子接入基础能力参考:https://gitcode.com/cann/ge/issues/1
EagerExecuteOp
当前自定义算子通过 EagerExecuteOp 已具备动态 shape host 调度和静态 shape 自动下沉能力,可以正确运行。但在实际生产场景中,仍存在三个性能与功能缺口:
缺口 1:I/O 地址变化时的不必要 D2D 拷贝
静态 shape 下沉后,kernel launch 的 device-side args 中的 I/O 地址在加载时写死(指向预分配的模型内存)。当模型输入输出地址发生变化时(典型场景:零拷贝,用户传入不同的 device 地址),框架只能把数据 D2D 拷贝到 args 中固定的地址再执行,产生额外拷贝开销。
缺口 2:无法为主流之外的并行任务分配辅流
当前自定义算子在 Execute() 中通过 ctx->GetStream() 获取主流用于 kernel launch。某些算子需要在主流之外下发额外任务(如通信、预处理、后处理),但目前没有辅流申请机制,无法实现主流与辅流的并行执行。
Execute()
ctx->GetStream()
缺口 3:仅支持 ND 格式,无法声明和推导非标准 tensor 数据格式
当前自定义算子体系仅支持 ND(标准多维数组)格式。对于 5HD、NC1HWC0、FRACTAL_NZ 等非标准 tensor 数据排布格式,自定义算子无法声明自身支持哪些格式、无法推导输出格式、也无法让框架根据上下文选择最优格式。老版本 IMPL_OP 机制中有 InferFormat 和 OpSelectFormat 能力,但在新版本 BaseCustomOp 体系中尚未提供。
IMPL_OP
InferFormat
OpSelectFormat
BaseCustomOp
later
/assign@hugo111
辅流申请功能已经完成
变更/设计描述
摘要
本 RFC 在已有的语言无关自定义算子基础能力(
EagerExecuteOp)之上,提出三项高阶优化能力:地址刷新(消除 I/O 地址变化时的 D2D 拷贝)、辅流(运行时动态辅流申请,支持多流并行)、私有 tensor 格式支持(自定义算子声明和推导 5HD 等非 ND 数据格式)。三项能力相互独立,开发者可按需组合。自定义算子接入基础能力参考:https://gitcode.com/cann/ge/issues/1
动机
当前自定义算子通过
EagerExecuteOp已具备动态 shape host 调度和静态 shape 自动下沉能力,可以正确运行。但在实际生产场景中,仍存在三个性能与功能缺口:缺口 1:I/O 地址变化时的不必要 D2D 拷贝
静态 shape 下沉后,kernel launch 的 device-side args 中的 I/O 地址在加载时写死(指向预分配的模型内存)。当模型输入输出地址发生变化时(典型场景:零拷贝,用户传入不同的 device 地址),框架只能把数据 D2D 拷贝到 args 中固定的地址再执行,产生额外拷贝开销。
缺口 2:无法为主流之外的并行任务分配辅流
当前自定义算子在
Execute()中通过ctx->GetStream()获取主流用于 kernel launch。某些算子需要在主流之外下发额外任务(如通信、预处理、后处理),但目前没有辅流申请机制,无法实现主流与辅流的并行执行。缺口 3:仅支持 ND 格式,无法声明和推导非标准 tensor 数据格式
当前自定义算子体系仅支持 ND(标准多维数组)格式。对于 5HD、NC1HWC0、FRACTAL_NZ 等非标准 tensor 数据排布格式,自定义算子无法声明自身支持哪些格式、无法推导输出格式、也无法让框架根据上下文选择最优格式。老版本
IMPL_OP机制中有InferFormat和OpSelectFormat能力,但在新版本BaseCustomOp体系中尚未提供。功能要点
目标
Execute()中动态申请一条或多条辅流,用于下发额外任务。辅流与主流可并行执行,框架提供自动同步和手动同步两种模式InferFormat),框架根据上下文(相邻算子的格式偏好)选择最优格式,减少不必要的格式转换开销技术方案
later
相关文档
测试方案
later
验收标准
later
备注