Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
在 Atlas 推理系列产品上使用 AscendC 实现 Cast 算子(命名 cast_v3),并新增支持 BF16 数据类型输入。
现有 Cast 算子(TBE 实现)在 310P AICore 上仅支持 40 组 dtype 组合,BF16 及其他未列出组合走 AICPU 实现,性能较差。在包含 bfloat16 计算的 LLM 微调、混合精度训练等场景中,bf16↔fp32、bf16↔int8/int16、int64→int32、fp16→bool 等类型转换路径会报 unsupported dtype combination,导致模型无法在 Atlas 推理系列产品上跑通。
本次任务使用 AscendC 新增独立的 cast_v3 算子,扩展支持的 dtype 组合至 53 组,并将原 AICPU 路径下沉到 AICore,性能显著提升。
cast_v3 算子的主要功能是执行张量类型转换,将输入 tensor 从一种 dtype 转换为另一种 dtype,计算公式 out = cast(x, dst_type)。在深度学习训练与推理中,类型转换是基础且高频的操作。
out = cast(x, dst_type)
现有 Cast 算子部分 dtype 组合走 AICPU 实现,涉及 host→device 数据搬运与 CPU 计算,性能较差,成为端到端推理的瓶颈。cast_v3 算子通过 AscendC 实现,将这些组合下沉到 AICore 执行,利用 Vector/Core 侧硬件并行计算能力,性能显著优于 AICPU 方案。
Aclnn 直调(aclnnCastV3 两段式接口)
输入:BOOL、FLOAT16、FLOAT、INT8、UINT8、INT16、INT32、INT64、BF16(共 9 种) 输出:BOOL、FLOAT16、FLOAT、INT8、UINT8、INT16、INT32(共 7 种,比输入少 BF16 和 INT64) 共 53 组合法 dtype 组合 属性:dst_type(int,指定目标 dtype)
支持形状:ND 格式,输入输出 shape 相同。
Host 侧将数据视为一维向量,仅考虑数据个数,不考虑维度信息。
Tiling 数据结构:
Tiling Key 规划:
分核策略: 优先满核,核间不能均分时,前几个核多处理一块。 内存优化: 充分使用 UB 空间,根据 UB 大小、输入/输出 dtype 字节数、double buffer 及各 tiling key 路径所需临时 buffer 大小,计算单次 UB 处理元素数。
Kernel 侧进行 Init 和 Process 两个阶段,其中 Process 包括 CopyIn → Compute → CopyOut 三个阶段。
关键语义对齐:
bool(x) = (x != 0)
关联 PR: https://gitcode.com/cann/ops-math/merge_requests/4159
/assign @YOLO-MIC
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
一、背景信息(必填)
在 Atlas 推理系列产品上使用 AscendC 实现 Cast 算子(命名 cast_v3),并新增支持 BF16 数据类型输入。
现有 Cast 算子(TBE 实现)在 310P AICore 上仅支持 40 组 dtype 组合,BF16 及其他未列出组合走 AICPU 实现,性能较差。在包含 bfloat16 计算的 LLM 微调、混合精度训练等场景中,bf16↔fp32、bf16↔int8/int16、int64→int32、fp16→bool 等类型转换路径会报 unsupported dtype combination,导致模型无法在 Atlas 推理系列产品上跑通。
本次任务使用 AscendC 新增独立的 cast_v3 算子,扩展支持的 dtype 组合至 53 组,并将原 AICPU 路径下沉到 AICore,性能显著提升。
二、价值/作用(必填)
cast_v3 算子的主要功能是执行张量类型转换,将输入 tensor 从一种 dtype 转换为另一种 dtype,计算公式
out = cast(x, dst_type)。在深度学习训练与推理中,类型转换是基础且高频的操作。现有 Cast 算子部分 dtype 组合走 AICPU 实现,涉及 host→device 数据搬运与 CPU 计算,性能较差,成为端到端推理的瓶颈。cast_v3 算子通过 AscendC 实现,将这些组合下沉到 AICore 执行,利用 Vector/Core 侧硬件并行计算能力,性能显著优于 AICPU 方案。
三、设计方案(必填)
3.1 使能方式
Aclnn 直调(aclnnCastV3 两段式接口)
3.2 总体设计
3.2.1 算子支持的数据类型
输入:BOOL、FLOAT16、FLOAT、INT8、UINT8、INT16、INT32、INT64、BF16(共 9 种)
输出:BOOL、FLOAT16、FLOAT、INT8、UINT8、INT16、INT32(共 7 种,比输入少 BF16 和 INT64)
共 53 组合法 dtype 组合
属性:dst_type(int,指定目标 dtype)
支持形状:ND 格式,输入输出 shape 相同。
3.2.2 host 侧设计
Host 侧将数据视为一维向量,仅考虑数据个数,不考虑维度信息。
Tiling 数据结构:
Tiling Key 规划:
分核策略: 优先满核,核间不能均分时,前几个核多处理一块。
内存优化: 充分使用 UB 空间,根据 UB 大小、输入/输出 dtype 字节数、double buffer 及各 tiling key 路径所需临时 buffer 大小,计算单次 UB 处理元素数。
3.2.3 kernel 侧设计
Kernel 侧进行 Init 和 Process 两个阶段,其中 Process 包括 CopyIn → Compute → CopyOut 三个阶段。
关键语义对齐:
bool(x) = (x != 0))3.3 支持硬件
3.4 算子约束限制
关联 PR:
https://gitcode.com/cann/ops-math/merge_requests/4159