已关闭
[Requirement|需求建议]: 【社区任务】MaxPool3D 算子贡献 #4468
lusonglier创建于  7月31日关闭于  8月10日
lusonglier
lusonglier
7月31日 创建

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

Backgroud(背景信息)

使用Ascend C对TBE实现的MaxPool3D算子进行重构,实现MaxPool3D算子在ascend910b AICore配置上的适配。算子支持对5维输入张量的D、H、W三个空间维执行最大池化,并通过ACLNN两段式接口完成调用。

Origin(信息来源)

外部贡献

Benefit / Necessity (价值/作用)

MaxPool3D算子的主要功能是在三维空间窗口内计算最大值,可用于视频理解、三维视觉、医学影像和体数据特征提取等场景。实现MaxPool3D的Ascend C版本,可替代原有TBE实现,并通过显式分核、数据搬运和向量化归约完成算子在昇腾硬件上的适配。
本次实现支持float16、float32和bfloat16数据类型,逻辑布局支持NDHWC和NCDHW,存储格式支持ND和NDC1HWC0;支持ksize、strides、padding、pads、dilation、ceil_mode和data_format属性。其中padding模式支持SAME、VALID和CALCULATED。

支持设备:
Atlas A2训练系列产品

Design(设计方案)

host侧设计:
完成MaxPool3D算子原型、dtype推导、shape推导、tiling注册和ACLNN接口适配。ACLNN侧对输入和输出进行基础校验,并对非连续Tensor执行连续化;shape推导侧根据data_format确定D/H/W维,结合窗口、步长、膨胀率、padding模式和ceil_mode计算输出shape。

tiling策略:
1)分核策略
根据输出元素总数和数据布局确定切分粒度splitQuantum,将输出任务划分为若干计算单元,并在不超过可用AIV核数的前提下分配任务。通过normalCoreOut记录每核任务量,通过balancedSplit处理需要均衡分配的场景。小任务使用实际所需核数,数据量较大时尽量使用多核并行。

2)单core内切分策略
根据dtype、UB Block对齐要求和数据布局规划单核处理粒度,充分利用UB空间。使用输入队列、输出队列和计算缓存管理Local Memory,通过DataCopy/DataCopyPad完成GM与UB之间的数据搬运,并使用Max接口完成窗口最大值规约。

3)tilingkey规划策略
host侧根据dtype、NDHWC/NCDHW逻辑布局、ND/NDC1HWC0存储布局和算子属性选择tilingKey,使kernel侧能够选择对应的计算策略。对于无需区分处理方式的场景,使用通用tilingKey。

数据检测:
1)输入dtype仅支持float16、float32和bfloat16,输出dtype必须与输入一致。
2)输入逻辑rank必须为5;ND输出为5维,NDC1HWC0物理输出为6维,N维和C维容量必须满足输入输出一致性要求。
3)data_format仅支持NDHWC和NCDHW;padding仅支持SAME、VALID和CALCULATED。
4)ksize、strides和dilation仅支持长度1、3或5,D/H/W维取值必须大于0;ksize和strides为5维时N、C维必须为1。
5)CALCULATED模式下pads必须包含6个非负整数,顺序为front、back、top、bottom、left、right;同时校验输出shape与属性推导结果一致。

kernel侧设计:
kernel根据tilingKey选择对应的计算策略,整体执行分为Init和Process两个阶段。
1)Init阶段读取MaxPool3DTilingData,初始化输入输出GlobalTensor、队列和临时缓存,并确定当前核的输出区间。
2)Process阶段包括数据搬入、最大值计算和结果搬出。根据data_format和storage format计算输入输出地址,并结合stride、dilation和pad确定有效池化窗口,对窗口内的有效输入完成最大值规约。
3)计算过程适配NDHWC、NCDHW和NDC1HWC0相关数据布局。通用计算以对应dtype的负无穷作为规约初值,并显式处理NaN传播。
4)Ascend C的MaxPool3D算子流程见下图。

graph TD
    A[ACLNN输入] --> B[参数校验与shape推导]
    B --> C[host解析shape和属性]
    C --> D[计算分核并生成tiling数据]
    D --> E[kernel初始化与数据搬入]
    E --> F[执行三维最大池化]
    F --> G[写回输出并返回]
likedislike
lusonglier
lusonglier
7月31日 评论:

/assign @fullt

likedislike
CANN-robotCANN-robot成员
7月31日 将 fullt 设为负责人
lusonglierlusonglier
7月31日 关联了pull request:【社区任务】MaxPool3D 算子贡献
lusonglierlusonglier
8月4日 关联了pull request:【社区任务】MaxPool3D 算子贡献
fulltower成员
8月10日 评论:

PR已合入,该issue关闭

likedislike
Ffulltower成员
8月10日 issue状态由 进行中 改变为 已完成
Ffulltower成员
8月10日 关闭了 issue
CANN-robotCANN-robot成员
8月10日 添加了label:Accepted