CANN ops-transformer 旋转位置编码算子 RopeWithSinCosCache 深度解析:cache 化 RoPE 的计算原理与 aclnn 两段式调用实战

发布时间:2026/9/18 6:10:26
CANN ops-transformer 旋转位置编码算子 RopeWithSinCosCache 深度解析:cache 化 RoPE 的计算原理与 aclnn 两段式调用实战 CANN ops-transformer 旋转位置编码算子 RopeWithSinCosCache 深度解析cache 化 RoPE 的计算原理与 aclnn 两段式调用实战【免费下载链接】ops-transformer本项目是CANN提供的transformer类大模型算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-transformer导读本文聚焦 CANN ops-transformer 仓库中的旋转位置编码算子RopeWithSinCosCache位于 posembedding/rope_with_sin_cos_cache该算子是推理网络中用于将预计算的 sin/cos 位置编码表cache直接应用到 query/key 上的高性能实现。读完本文你将完整掌握该算子的 rope/mrope 两种计算模式、GPT-NeoX 与 GPT-J 两种旋转风格的计算公式、全部入参约束以及基于aclnnRopeWithSinCosCache两段式接口的落地调用方法并能结合仓库源码理解其参数校验、多核 tiling 与 kernel 分派原理。产品支持情况依据 posembedding/rope_with_sin_cos_cache/README.md该算子对产品的支持情况如下产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×Kirin X90 处理器系列产品√Kirin 9030 处理器系列产品√需要补充说明的是在 op_host/rope_with_sin_cos_cache_def.cpp 的算子定义中RopeWithSinCosCache实际为ascend910b、ascend910_93、ascend950、kirinx90、kirin9030五个平台配置了 AICore 算子实现其中ascend950使用独立的rope_with_sin_cos_cache_apt实现Kirin 平台使用独立配置与产品支持矩阵一致。Kirin X90/Kirin 9030 处理器系列产品不支持 BFLOAT16其算子配置中 queryIn/keyIn/cosSinCache 仅支持DT_FLOAT与DT_FLOAT16见 rope_with_sin_cos_cache_def.cpp。带cacheMode扩展参数的 V2 接口aclnnRopeWithSinCosCacheV2目前不支持 Ascend 950PR/Ascend 950DT见 docs/aclnnRopeWithSinCosCacheV2.md。功能说明为推理性能设计的 cache 化旋转位置编码设计动机旋转位置编码RoPE在 Transformer 推理网络中广泛应用。常规实现中每个 token 的 sin/cos 值需要在计算时临时生成而在推理场景下位置编码值往往是可预先计算并缓存的。RopeWithSinCosCache 算子正是将 sin 和 cos 输入通过 cachecosSinCache传入直接按位置索引查表并执行旋转位置编码计算从而省去重复计算提升推理性能。整体计算分三步按位置索引positions从cosSinCache中取出对应的cosSin张量将cosSin沿最后一维切分为cos与sin两半将query/key拆分为需要旋转的部分queryRot前rotaryDim维和直接透传的部分queryPass其余维度对queryRot应用旋转最后拼回。mrope 模式多模态位置编码mrope 模式下positions的 shape 为[m, numTokens]其中 m 为mropeSection的元素个数支持 3 或 4用于多模态如图像、视频、文本混合场景下对不同位置使用不同的位置编码频率cosSin[i] cosSinCache[positions[i]] cos, sin cosSin.chunk(2, dim-1)当mropeSection元素个数为3时按三段拼接cos与sincos0 cos[0, :, :mropeSection[0]] cos1 cos[1, :, mropeSection[0]:(mropeSection[0] mropeSection[1])] cos2 cos[2, :, (mropeSection[0] mropeSection[1]):(mropeSection[0] mropeSection[1] mropeSection[2])] cos torch.cat((cos0, cos1, cos2), dim-1) sin0 sin[0, :, :mropeSection[0]] sin1 sin[1, :, mropeSection[0]:(mropeSection[0] mropeSection[1])] sin2 sin[2, :, (mropeSection[0] mropeSection[1]):(mropeSection[0] mropeSection[1] mropeSection[2])] sin torch.cat((sin0, sin1, sin2), dim-1)当mropeSection元素个数为4时使用更简洁的 split 形式表达同一语义cos torch.cat([m[i] for i, m in enumerate(cos.split(mropeSection, dim-1))], dim-1) sin torch.cat([m[i] for i, m in enumerate(sin.split(mropeSection, dim-1))], dim-1)之后统一进入旋转计算与 rope 模式共用queryRot query[..., :rotaryDim] queryPass query[..., rotaryDim:]rope 模式标准位置编码rope 模式下positions的 shape 为[numTokens]一维索引直接查表并切分cosSin[i] cosSinCache[positions[i]] cos, sin cosSin.chunk(2, dim-1) queryRot query[..., :rotaryDim] queryPass query[..., rotaryDim:]说明在 aclnn 接口中mropeSection入参传nullptr即表示 rope 模式传入非空mropeSection即开启 mrope 模式详见 docs/aclnnRopeWithSinCosCache.md 参数说明。从源码看kernel 中以mropeSection[0] 0作为进入 mrope 分支的判断条件见 op_host/op_api/aclnn_rope_with_sin_cos_cache.cpp。rotate_halfGPT-NeoX style旋转模式当isNeoxStyletrue时采用该模式先将queryRot沿最后一维对半切分再交叉相乘后拼接x1, x2 torch.chunk(queryRot, 2, dim-1) o1[i] x1[i] * cos[i] - x2[i] * sin[i] o2[i] x2[i] * cos[i] x1[i] * sin[i] queryRot torch.cat((o1, o2), dim-1) query torch.cat((queryRot, queryPass), dim-1)rotate_interleavedGPT-J style旋转模式当isNeoxStylefalse时采用该模式按奇偶位交错拆分并旋转x1 queryRot[..., ::2] x2 queryRot[..., 1::2] o1[i] x1[i] * cos[i] - x2[i] * sin[i] o2[i] x2[i] * cos[i] x1[i] * sin[i] queryRot torch.stack((o1, o2), dim-1) query torch.cat((queryRot, queryPass), dim-1)对keyIn执行完全相同的旋转流程得到keyOut。参数说明下表完整摘录自 posembedding/rope_with_sin_cos_cache/README.md参数名输入/输出/属性描述数据类型数据格式positions输入Device 侧的 aclTensor输入索引。INT32、INT64NDqueryIn输入Device 侧的 aclTensor表示要执行旋转位置编码的第一个张量公式中的query。BFLOAT16、FLOAT16、FLOAT32NDkeyIn输入Device 侧的 aclTensor表示要执行旋转位置编码的第二个张量。BFLOAT16、FLOAT16、FLOAT32NDcosSinCache输入Device 侧的 aclTensor表示参与计算的位置编码张量。BFLOAT16、FLOAT16、FLOAT32NDmropeSection输入mrope 模式下用于整合输入的位置编码张量信息公式中的mropeSection。INT64-headSize输入表示每个注意力头维度大小。INT64-isNeoxStyle输入true 表示 rotate_halfGPT-NeoX style计算模式false 表示 rotate_interleavedGPT-J style计算模式。BOOL-queryOut输出输出 query 执行旋转位置编码后的结果。FLOAT、FLOAT16、BFLOAT16NDkeyOut输出输出 key 执行旋转位置编码后的结果。FLOAT、FLOAT16、BFLOAT16ND补充要点Kirin X90/Kirin 9030 处理器系列产品不支持 BFLOAT16该说明位于 README 参数表下方。在算子定义 rope_with_sin_cos_cache_def.cpp 中除上述接口入参外底层算子还包含numQHeads、numKHeads、headSize、mropeSection、qStride、kStride、isNeoxStyle、cacheMode等属性其中qStride/kStride表示 query/key 行间步长用于支持非连续输入cacheMode默认为 0。约束说明调用该算子前需满足以下约束源自 README 与 docs/aclnnRopeWithSinCosCache.md 的约束章节queryIn、keyIn、cosSinCache只支持2 维shape 输入其中queryIn/keyInshape 为(numTokens, numQHeads*headSize)/(numTokens, numKHeads*headSize)cosSinCacheshape 为(maxSeqLen, rotaryDim)maxSeqLen表示模型处理序列的最大长度rotaryDim表示旋转位置嵌入的维度大小。queryIn、keyIn、cosSinCache的数据类型需要保持一致且queryOut/keyOut与对应输入数据类型一致。headSize数据类型为 BFLOAT16 或 FLOAT16 时为32 的倍数数据类型为 FLOAT32 时为16 的倍数等价于 64 Byte 对齐tiling 侧按headSize % (64 / 元素字节数) 0校验。rotaryDim始终小于等于headSizeBFLOAT16/FLOAT16 时为 32 的倍数FLOAT32 时为 16 的倍数mrope 模式下应满足rotaryDim mropeSection所有元素之和的 2 倍即mropeSection[0] mropeSection[1] mropeSection2 rotaryDim / 2。输入 tensorpositions的取值应小于cosSinCache的 0 维maxSeqLen。aclnnRopeWithSinCosCache为默认确定性实现。mropeSection 取值限制README 标注为[16, 24, 24]而 docs/aclnnRopeWithSinCosCache.md 与 V2 接口文档给出更完整的白名单[16, 24, 24]、[24, 20, 20]、[8, 12, 12]、[16, 16, 16, 16]V2 接口另支持[11, 11, 10]。源码中的mropeSupportList校验了全部 5 种取值见 aclnn_rope_with_sin_cos_cache.cpp。调用方式aclnn 两段式接口该算子通过 CANN 的 aclnnAscendCL NN两段式接口调用必须先调用aclnnRopeWithSinCosCacheGetWorkspaceSize获取 workspace 大小与执行器再调用aclnnRopeWithSinCosCache执行计算。接口原型aclnnStatus aclnnRopeWithSinCosCacheGetWorkspaceSize( const aclTensor *positions, const aclTensor *queryIn, const aclTensor *keyIn, const aclTensor *cosSinCache, const aclIntArray *mropeSection, int64_t headSize, bool isNeoxStyle, aclTensor *queryOut, aclTensor *keyOut, uint64_t *workspaceSize, aclOpExecutor **executor);aclnnStatus aclnnRopeWithSinCosCache( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);第一段接口参数详解参数名输入/输出描述使用说明数据类型数据格式维度(shape)非连续Tensorpositions输入公式中的 positions用于选取位置编码张量。不支持空 tensorrope 模式 shape 为(numTokens)mrope 模式 shape 为(3, numTokens)或(4, numTokens)。INT64ND1-2√queryIn输入公式中的 query要执行旋转位置编码的第一个张量。不支持空 tensor要求 2Dshape 为(numTokens, numQHeads*headSize)。BFLOAT16、FLOAT16、FLOAT32ND2√keyIn输入要执行旋转位置编码的第二个张量。不支持空 tensor要求 2Dshape 为(numTokens, numKHeads*headSize)。BFLOAT16、FLOAT16、FLOAT32ND2√cosSinCache输入表示参与计算的位置编码张量。不支持空 tensor要求 2Dshape 为(maxSeqLen, rotaryDim)。BFLOAT16、FLOAT16、FLOAT32ND2√mropeSection输入公式中的 mropeSectionmrope 模式下用于整合输入的位置编码张量信息。输入 mropeSection 表示开启 mrope 模式不开启rope 模式时输入nullptr。aclIntArray---headSize输入每个注意力头维度大小。需满足对齐约束见上文。INT64---isNeoxStyle输入表示是否使用 GPT-NeoX 计算模式。true 表示 GPT-NeoX stylefalse 表示 GPT-J style。BOOL---queryOut输出query 执行旋转位置编码后的结果。数据类型同 query要求 2Dshape 为(numTokens, numQHeads*headSize)。FLOAT32、FLOAT16、BFLOAT16ND2×keyOut输出key 执行旋转位置编码后的结果。数据类型同 key要求 2Dshape 为(numTokens, numKHeads*headSize)。FLOAT32、FLOAT16、BFLOAT16ND2×workspaceSize输出返回用户需要在 Device 侧申请的 workspace 大小。-----executor输出返回 op 执行器包含算子计算流程。-----返回值与错误码第一段接口完成入参校验出现以下场景时报错返回值错误码描述ACLNN_ERR_PARAM_NULLPTR161001传入的必选输入、必选输出或必选属性是空指针。ACLNN_ERR_PARAM_INVALID161002输入和输出的数据类型、数据格式不在支持范围内。ACLNN_ERR_INNER_TILING_ERROR561002多个输入 tensor 之间的 shape 信息不匹配或输入属性与输入 tensor 的 shape 信息不匹配。ACLNN_ERR_INNER_TILING_ERROR361001query 或 key 非 64 Byte 对齐或 rotaryDim headSize。完整调用示例以下为完整可运行流程关键步骤摘录完整样例见 examples/test_aclnn_rope_with_sin_cos_cache.cpp。示例为 rope 模式mropeSection传nullptr采用 BFLOAT16 类型#include iostream #include vector #include acl/acl.h #include aclnnop/aclnn_rope_with_sin_cos_cache.h #define CHECK_RET(cond, return_expr) \ do { \ if (!(cond)) { \ return_expr; \ } \ } while (0) // 计算连续 tensor 的 strides 并用 aclCreateTensor 构造 aclTensor template typename T int CreateAclTensor(const std::vectorT hostData, const std::vectorint64_t shape, void **deviceAddr, aclDataType dataType, aclTensor **tensor) { auto size 1; for (auto i : shape) size * i; size * sizeof(T); auto ret aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, return ret); ret aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret ACL_SUCCESS, return ret); std::vectorint64_t strides(shape.size(), 1); for (int64_t i shape.size() - 2; i 0; i--) { strides[i] shape[i 1] * strides[i 1]; } *tensor aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), *deviceAddr); return 0; } int main() { // 1. device/stream 初始化固定写法 int32_t deviceId 0; aclrtStream stream; aclInit(nullptr); aclrtSetDevice(deviceId); aclrtCreateStream(stream); // 2. 构造输入与输出rope 模式positions 为 1 维索引 std::vectorint64_t positionsShape {2}; // numTokens 2 std::vectorint64_t queryInShape {2, 64}; // numQHeads*headSize 2*32 std::vectorint64_t keyInShape {2, 64}; std::vectorint64_t cosSinCacheShape {2, 32}; // (maxSeqLen, rotaryDim) std::vectorint64_t queryOutShape {2, 64}; std::vectorint64_t keyOutShape {2, 64}; void* positionsDeviceAddr nullptr; void* queryInDeviceAddr nullptr; void* keyInDeviceAddr nullptr; void* cosSinCacheDeviceAddr nullptr; void* queryOutDeviceAddr nullptr; void* keyOutDeviceAddr nullptr; aclTensor* positions nullptr; aclTensor* queryIn nullptr; aclTensor* keyIn nullptr; aclTensor* cosSinCache nullptr; aclTensor* queryOut nullptr; aclTensor* keyOut nullptr; int64_t headSize 32; // BF16 下需为 32 的倍数 bool isNeoxStyle true; // true: GPT-NeoX style std::vectorint64_t positionsHostData {0, 1}; std::vectorfloat queryInHostData(128, 1.0f); // 实际请填充真实数据 std::vectorfloat keyInHostData(128, 1.0f); std::vectorfloat cosSinCacheHostData(64, 1.0f); // 长度 2*32 std::vectorfloat queryOutHostData(128, 0.0f); std::vectorfloat keyOutHostData(128, 0.0f); CreateAclTensor(positionsHostData, positionsShape, positionsDeviceAddr, aclDataType::ACL_INT64, positions); CreateAclTensor(queryInHostData, queryInShape, queryInDeviceAddr, aclDataType::ACL_BF16, queryIn); CreateAclTensor(keyInHostData, keyInShape, keyInDeviceAddr, aclDataType::ACL_BF16, keyIn); CreateAclTensor(cosSinCacheHostData, cosSinCacheShape, cosSinCacheDeviceAddr, aclDataType::ACL_BF16, cosSinCache); CreateAclTensor(queryOutHostData, queryOutShape, queryOutDeviceAddr, aclDataType::ACL_BF16, queryOut); CreateAclTensor(keyOutHostData, keyOutShape, keyOutDeviceAddr, aclDataType::ACL_BF16, keyOut); // 3. 两段式调用第一段获取 workspace 与执行器 uint64_t workspaceSize 0; aclOpExecutor* executor nullptr; auto ret aclnnRopeWithSinCosCacheGetWorkspaceSize( positions, queryIn, keyIn, cosSinCache, nullptr /* mropeSection, rope模式 */, headSize, isNeoxStyle, queryOut, keyOut, workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, return ret); // 4. 按需申请 workspace void* workspaceAddr nullptr; if (workspaceSize 0) { ret aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, return ret); } // 5. 第二段接口执行计算 ret aclnnRopeWithSinCosCache(workspaceAddr, workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, return ret); // 6. 同步等待任务执行结束 ret aclrtSynchronizeStream(stream); CHECK_RET(ret ACL_SUCCESS, return ret); // 7. 释放资源 aclDestroyTensor(positions); aclDestroyTensor(queryIn); aclDestroyTensor(keyIn); aclDestroyTensor(cosSinCache); aclDestroyTensor(queryOut); aclDestroyTensor(keyOut); aclrtFree(positionsDeviceAddr); aclrtFree(queryInDeviceAddr); aclrtFree(keyInDeviceAddr); aclrtFree(cosSinCacheDeviceAddr); aclrtFree(queryOutDeviceAddr); aclrtFree(keyOutDeviceAddr); if (workspaceSize 0) aclrtFree(workspaceAddr); aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }要点提醒若开启 mrope 模式只需将示例中的nullptr替换为按aclIntArray构造的mropeSection如{16, 24, 24}或{16, 16, 16, 16}并将positions构造为(3, numTokens)或(4, numTokens)的二维张量。示例中queryIn等输入张量支持非连续stride 不连续Tensor接口内部会先做Contiguous处理queryOut/keyOut不支持非连续见 aclnn_rope_with_sin_cos_cache.cpp 中l0op::Contiguous与l0op::ViewCopy的组合使用。V2 接口cacheMode 扩展仓库同时提供了扩展接口aclnnRopeWithSinCosCacheV2文档见 docs/aclnnRopeWithSinCosCacheV2.md样例见 examples/test_aclnn_rope_with_sin_cos_cache_v2.cpp与 V1 相比新增cacheMode参数用于指示拼接 cos/sin 的方式cacheMode 0与aclnnRopeWithSinCosCache实现相同为分段式拼接 cos 和 sin即上文 mrope 三段/四段 cat 的逻辑。cacheMode 1为交错式拼接 cos 和 sin。以三段为例cosTmp cos cos[..., 1:mropeSection[1] * 3:3] cosTmp[1, ..., 1:mropeSection[1] * 3:3] cos[..., 2:mropeSection[1] * 3:3] cosTmp[2, ..., 2:mropeSection[1] * 3:3] sinTmp sin sin[..., 1:mropeSection[1] * 3:3] sinTmp[1, ..., 1:mropeSection[1] * 3:3] sin[..., 2:mropeSection[1] * 3:3] sinTmp[2, ..., 2:mropeSection[1] * 3:3]V2 的约束差异mrope 模式下cacheMode仅支持 0 和 1且当mropeSection为[16, 16, 16, 16]时仅支持 0tiling 侧同样做了该校验见 rope_with_sin_cos_cache_tiling.cpp。源码中 V1 接口内部固定传入cacheMode 0V2 才真正暴露该参数见 aclnn_rope_with_sin_cos_cache.cpp。源码实现原理算子定义与属性在 op_host/rope_with_sin_cos_cache_def.cpp 中RopeWithSinCosCache通过OpDef注册4 个必选输入positions、queryIn、keyIn、cosSinCache与 2 个必选输出queryOut、keyOut数据类型均为DT_FLOAT / DT_FLOAT16 / DT_BF16positions 为 INT64格式均为 ND属性包括必选的numQHeads、numKHeads、headSize可选的mropeSection默认{0, 0, 0}、qStride、kStride、isNeoxStyle默认 true、cacheMode默认 0各平台配置均开启动态编译DynamicCompileStaticFlag、动态 rank 与动态 shape 支持。入参校验逻辑op_host/op_api/aclnn_rope_with_sin_cos_cache.cpp 中CheckParams依次完成四类校验空指针检查CheckNotNull6 个 tensor 均非空数据类型检查CheckDtypeValidpositions 必须为 INT64keyIn/cosSinCache/queryOut/keyOut的数据类型须与queryIn一致且整体在支持列表内shape 检查CheckShape三个输入 tensor 均为 2 维、均非空、keyIn.shape[0] queryIn.shape[0]、输出与输入 shape 相等mropeSection 校验元素个数必须为 3 或 4、元素非负、当mropeSection[0] 0mrope 模式时要求所有元素之和的 2 倍等于rotaryDim即cosSinCache第 1 维且取值必须命中mropeSupportList白名单{16,24,24}、{8,12,12}、{24,20,20}、{11,11,10}、{16,16,16,16}见 aclnn_rope_with_sin_cos_cache.cpp。Tiling 与多核切分op_host/rope_with_sin_cos_cache_tiling.cpp 展示了 host 侧 tiling 策略从中可以看到该算子典型的性能设计按 token 数切分 corefront_core与tail_core两级分配将numTokens行数据近似均匀地分配到所有 AI Core每个 core 内部再按 UB 容量分多轮循环搬运loop_time_each_front_core/loop_time_each_tail_core按 UB 空间约束分片以maxUbSizeUB 内存为上限根据rotaryDim、headSize、数据类型字节数估算单轮可加载的最大 token 行数与 head 数maxNPerLoopForUb、numHeadsForUb超过时再沿 head 维度循环loop_along_qheads/loop_along_kheadstilingKey 按数据类型分派BF16 对应TILING_BF16 20、FP16 对应 21、FP32 对应 22见 rope_with_sin_cos_cache_tiling.cpp同时校验headSize/rotaryDim的 64 Byte 对齐与headSize rotaryDim全部 tiling 参数约 30 个字段定义在 op_host/rope_with_sin_cos_cache_tiling.h 中kernel 侧通过GET_TILING_DATA读取。Kernel 入口与数据类型分派op_kernel/rope_with_sin_cos_cache.cpp 是 AI Core 侧入口函数rope_with_sin_cos_cache接收position_id、query_in、key_in、cos_sin_cache、query_out、key_out、workspace、tiling八个 GM 地址参数并按 tilingKey 实例化不同的模板实现TILING_KEY_IS(20)→RopeWithSinCosCacheFP16bfloat16_tBF16TILING_KEY_IS(21)→RopeWithSinCosCacheFP16halfFP16TILING_KEY_IS(22)→RopeWithSinCosCacheF32floatFP32。针对不同架构还提供了独立实现op_kernel/arch35/目录下的rope_with_sin_cos_cache_f_bf16_arch35.h、rope_with_sin_cos_cache_fp32_arch35.h等文件面向 arch35 平台另有 op_kernel/rope_with_sin_cos_cache_apt.cpp 对应 Ascend 950 的 regbase 实现。测试与验证仓库为算子提供了完善的测试用例ST 用例tests/st/aclnnRopeWithSinCosCache/atk_aclnnRopeWithSinCosCache.json 定义了 210 组边界与随机用例覆盖 fp16/bf16/fp32 三种类型、headSize 32/64/96/128、rotaryDim 32/64/96/128 以及 numTokens 从 1 到 1310732^171的极大规模组合测试数据还包含nan、inf、-inf等异常值输入UT 用例见 tests/ut/op_host 下的 infershape 与 tiling 单测、tests/ut/op_kernel 下的 kernel 单测及其 gen_data.py 数据生成脚本可在无 NPU 环境下先行验证 tiling 与 kernel 逻辑。小结RopeWithSinCosCache 是 CANN ops-transformer 中面向推理场景的位置编码算子核心价值在于cache 化设计将 sin/cos 位置编码预计算并缓存按positions索引查表避免推理路径上的重复计算双模式覆盖支持标准 rope 与多模态 mrope3/4 段mropeSection并兼容 GPT-NeoXrotate_half与 GPT-Jrotate_interleaved两种主流旋转风格产品矩阵完善覆盖 Ascend 950、Atlas A2/A3 系列与 Kirin X90/Kirin 9030并提供 V1/V2cacheMode两套 aclnn 接口实现细节完整从算子定义、参数校验白名单、UB 感知的多核 tiling 到按数据类型分派的 kernel 模板仓库源码均可逐一对照验证。如需进一步深入可继续阅读 docs/aclnnRopeWithSinCosCache.mdV1 接口完整说明、docs/aclnnRopeWithSinCosCacheV2.mdV2 接口完整说明以及上文列出的源码与测试文件。【免费下载链接】ops-transformer本项目是CANN提供的transformer类大模型算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-transformer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询