SetValueOperation 算子使用与实现解析:ascend-transformer-boost 原地张量切片赋值

发布时间:2026/9/19 0:48:14

SetValueOperation 算子使用与实现解析:ascend-transformer-boost 原地张量切片赋值 SetValueOperation 算子使用与实现解析ascend-transformer-boost 原地张量切片赋值【免费下载链接】ascend-transformer-boost本项目是CANN提供的是一款高效、可靠的Transformer加速库基于华为Ascend AI处理器提供Transformer定制化场景的高性能融合算子。项目地址: https://gitcode.com/cann/ascend-transformer-boost导读本文基于 ascend-transformer-boost 开源仓库中的 SetValueOperation 算子知识条目及其对应源码完整讲解该算子的语义、参数定义、参数校验规则、Runner 执行链路与测试验证方式。SetValueOperation 是仓库中一个 tier S、单阶段single-stage、无独立输出张量的原地拷贝类算子核心能力是把源张量 src 的内容写入目标张量 dst 的指定切片区域dst[starts:ends] src。读完本文你将掌握 SetValueParam 各字段的语义与取值范围、算子内部两层结构Operation 层 Ops Runner 层的工作方式以及如何通过仓库内的 CSV 测试用例快速验证算子行为。1. 算子定位与知识库入口SetValueOperation 在 ATBAscend Transformer Boost算子知识库中被归类为other分类下的单算子条目知识条目位于 .agent/knowledge/ops/other/set_value/index.md其元数据为元数据项值说明op.nameset_value算子标识op.categoryother功能分类op.tierS复杂度分级S 表示低复杂度单算子op.typesingle单算子非融合算子source.repo_pathsrc/ops/ops_infer/set_value/算子源码目录Runnerops_runner通过 OpsRunner 执行Pipeline单阶段一次内核图单节点即可完成知识条目本身是导航性质的它将读者引向路由文件 .agent/knowledge/routing/set_value.md其中包含文件清单、推荐阅读顺序与源码路径并指向主索引 .agent/knowledge/README.md。路由文件标注了该算子关键信息分类 infer、复杂度 S、文件数 4、Runner 类型 OpsRunner/Operation、ACLNN: no即该算子不提供独立的 ACLNN 接口而是走 ATB 原生的 Operation OpsRunner 执行路径。2. 源码文件结构与推荐阅读顺序SetValueOperation 的实现非常精简仅包含 4 个文件全部位于 src/ops/ops_infer/set_value/#文件角色关注重点1set_value_operation.hOperation 定义输入输出数量、InferShape 签名、校验接口2set_value_operation.cppOperation 实现参数校验逻辑、CreateRunner() 决策3set_value_ops_runner.hOps Runner 定义原生 Ops 执行接口SetupKernelGraph4set_value_ops_runner.cppOps Runner 实现内核图构建、CopyOperation 节点、平台适配路由文件给出的推荐阅读顺序是先看set_value_operation.h了解输入输出数量与 InferShape 签名再看set_value_operation.cpp理解 CreateRunner() 的决策逻辑随后阅读set_value_ops_runner.h与set_value_ops_runner.cpp理解原生 Ops 的调用链与平台适配。参数头文件为 include/atb/infer_op_params.h。需要说明的是从源码结构看该算子并没有绑定独立的专属 kernel而是通过 Runner 在内核图中复用CopyOperationAsdOps 的 Copy 参数类型完成实际拷贝这一点在第 5 节详述。3. SetValueParam 参数定义详解算子的全部行为由 include/atb/infer_op_params.h 中定义的infer::SetValueParam结构体控制其完整定义如下//! \struct SetValueParam //! \brief 将输入源张量中的内容拷贝到输入目标张量指定位置中. //! 该拷贝为原地拷贝最终结果修改在输入目标张量中.br //! 输入目标张量 dst: [a,b,c], 输入源张量src: [d,e,f]. //! dst[starts[0]: ends[0], starts[1]: ends[1], starts[2]: ends[2]] src.br //! 其中 ends[0]-starts[0]需为src第0维的维度大小,ends[1]-starts[1]需为src第1维的维度大小,ends[2]-starts[2]需为src第2维的维度大小。 struct SetValueParam { //! \brief 每一维拷贝起始位置 SVectorint64_t starts; //! \brief 每一维拷贝结束位置后一个位置拷贝到该位置前一个位置为止 SVectorint64_t ends; //! \brief 每一维拷贝步长当前仅支持strides为全1. SVectorint64_t strides; //! \brief 预留参数 uint8_t rsv[8] {0}; };参数语义与约束归纳如下字段类型语义约束startsSVectorint64_t每一维拷贝起始位置含长度须等于张量维数starts[i] 0starts[i] ends[i]endsSVectorint64_t每一维拷贝结束位置的后一个位置不含ends[i] dst 第 i 维大小stridesSVectorint64_t每一维拷贝步长当前仅支持全 1rsvuint8_t[8]预留字段置 0CreateOperation 中通过 OP_PARAM_RSV_CHECK 校验参数校验的关键公式见源码 L129每一维的拷贝元素个数(ends[i] - starts[i] - 1) / strides[i] 1必须等于 src 对应维度大小在 strides 全为 1 的前提下该式退化为ends[i] - starts[i] src.dims[i]。这意味着 dst 中被覆盖的切片形状必须与 src 完全一致SetValue 本质上是一个形状受限的原地张量切片拷贝。4. Operation 层生命周期、InferShape 与参数校验Operation 层由 set_value_operation.h 与 set_value_operation.cpp 实现。SetValueOperation继承自OperationBase并在构造时从AtbOperationIrCfg单例加载名为SetValueOperation的算子 IR 配置。4.1 输入输出数量static const int32_t IN_TENSOR_NUM 2; static const int32_t OUT_TENSOR_NUM 0;该算子有2 个输入、0 个输出输入 0 是目标张量 dst会被原地修改输入 1 是源张量 src。由于是原地拷贝InferShapeImpl无需推导任何输出 shape仅记录日志后直接返回NO_ERROR——这也解释了为什么算子没有独立的输出张量。4.2 算子创建入口CreateOperation模板特化是算子的工厂入口set_value_operation.cpptemplate Status CreateOperation(const infer::SetValueParam opParam, Operation **operation) { if (operation nullptr) { return ERROR_INVALID_PARAM; } OP_PARAM_RSV_CHECK(opParam); *operation new (std::nothrow) SetValueOperation(opParam); if (*operation nullptr) { ATB_LOG(ERROR) failed to new operation; return ERROR_OUT_OF_HOST_MEMORY; } return NO_ERROR; }它会先通过OP_PARAM_RSV_CHECK校验预留字段再用new (std::nothrow)创建算子实例内存分配失败时返回ERROR_OUT_OF_HOST_MEMORY。4.3 参数校验规则InferShapeCheck / SetupCheckInferShapeCheckImpl与SetupCheckImpl都调用两个私有方法完成校验DimNumCheckImplset_value_operation.cppdst 与 src 的维数必须相等否则返回ERROR_INVALID_TENSOR_DIM_NUMdst 维数必须等于starts/ends/strides三个参数的长度否则返回ERROR_INVALID_PARAM。DimsCheckImplset_value_operation.cpp逐条校验校验项规则错误码src 维度大小src.dims[i] dst.dims[i]每一维ERROR_INVALID_TENSOR_DIMstrides必须全为 1ERROR_INVALID_PARAMstarts/endsstarts[i] 0ends[i] dst.dims[i]starts[i] ends[i]ERROR_INVALID_PARAM拷贝形状(ends[i]-starts[i]-1)/strides[i]1 必须等于 src.dims[i]ERROR_INVALID_PARAM差异维度数src 与 dst 至多两个维度不同且其中一个必须是最高维第 0 维ERROR_INVALID_TENSOR_DIM其中差异维度数的判定逻辑值得展开代码遍历 dst 的第 1 维到最后一维统计与 src 不同的维度个数 count。若 count 1即第 1 维之后至少两个维度不同则报错若 count 0即第 1 维之后全部相同也报错——此时 src 与 dst 要么完全相同、要么只在第 0 维不同而只有一个维度不同时该维度不能是最高维。这与参数头文件中的 warning 注释完全一致输入 src 和输入 dst 的各维度要求有一个或两个维度不相同如果有一个维度不相同则这个维度不能是最高维第 0 维如果有两个维度不相同则其中一个不同的维度必须是最高维第 0 维。换句话说合法的形状组合是src 相对 dst 在非最高维中恰好有一个维度变小可选地第 0 维也变小形成切片区域写入 dst。4.4 Runner 决策与参数序列化CreateRunner是 Operation 到执行层的桥接set_value_operation.cppstd::shared_ptrRunner SetValueOperation::CreateRunner(Context context) const { (void)context; return std::make_sharedSetValueOpsRunner(param_); }它直接构造SetValueOpsRunner并传入参数副本。此外GetParamJson通过OpParamToJson(param_)将参数序列化为 JSON供 IR 图 dump 与调试使用。整体调用链为CreateOperationSetValueParam → SetValueOperation → CreateRunner() → SetValueOpsRunner → SetupKernelGraph() → CopyOperation 内核图节点 → 执行拷贝5. Runner 层SetValueOpsRunner 与 CopyOperation 内核图执行层由 set_value_ops_runner.h 与 set_value_ops_runner.cpp 实现。SetValueOpsRunner继承自OpsRunner唯一的核心工作是重写SetupKernelGraph把算子参数翻译成一张单节点内核图。5.1 输入张量编排kernelGraph_.inTensors.resize(IN_TENSOR_COUNT); // 2 个输入 kernelGraph_.outTensors.resize(0); // 0 个输出 Mki::Tensor dst kernelGraph_.inTensors.at(inTensorNum); Mki::Tensor src kernelGraph_.inTensors.at(inTensorNum);dst 为输入 0src 为输入 1内核图不声明任何输出张量与 Operation 层的GetOutputNum() 0保持一致。5.2 内核图节点构建内核图仅含 1 个节点kernelGraph_.nodes.resize(1)节点类型为CopyOperation参数类型为AsdOps::OpParam::Copy。构建逻辑set_value_ops_runner.cpp分三步dstSize直接把 src 各维大小填入copyParam.dstSize表示拷贝区域尺寸dstStride先将 dst 各维自后向前做累积乘积得到dimMatul[i]dst 第 i 维之后所有维度的总元素数再令dstStride[i] dimMatul[i1] * param_.strides[i]最后一维直接取strides[last]从而把 dst 视为行主序的线性缓冲计算目标切片区域每一维的线性步长dstOffsetdstOffset starts[last] Σ(starts[i] * dimMatul[i1])即把各维起始位置换算成 dst 线性内存中的起始偏移并带有整型溢出保护——当(INT64_MAX - dstOffset) / dimMatul[i1] starts[i]时直接返回ERROR_INVALID_PARAM避免偏移量上溢导致非法内存访问。最终节点拓扑为copyNode.opDesc {0, CopyOperation, copyParam}; copyNode.inTensors {dst, src}; copyNode.outTensors {dst};可见该内核图把src 拷贝到 dst 的指定线性偏移区域输出仍指向 dst 本身从内核图层面再次印证了原地修改语义。文件末尾的注册宏完成了算子与内核参数的绑定REG_RUNNER_TYPE(SetValueOpsRunner); REG_OP_PARAM(AsdOps::OpParam::Copy);5.3 单阶段流水线整个执行路径只有一次内核图下发、一个 CopyOperation 节点因此路由文件将其标记为单阶段single-stage流水线。相比多阶段融合算子SetValue 的 host 侧开销极低无需 tiling 决策、无需多节点编排参数翻译完成后直接执行单节点拷贝。6. 算子配置dtype 与 format 支持算子支持的数据类型与排布在 ops_configs/atb_ops_info.ini 的[SetValueOperation]段中声明[SetValueOperation] input0.namex1 input0.dtypefloat16,float,int32,int64,bf16 input0.formatnd,nd,nd,nd,nd input1.namex2 input1.dtypefloat16,float,int32,int64,bf16 input1.formatnd,nd,nd,nd,nd配置要点两个输入分别命名为 x1dst与 x2src支持的 dtype 为float16、float、int32、int64、bf16共 5 种格式仅支持nd排布两个输入支持相同的 dtype/format 组合要求 src 与 dst 类型一致。7. 测试验证与用例剖析仓库为该算子提供了多层次的测试资产可用于验证语义与校验规则。7.1 高层测试CSV 用例高层测试目录 tests/high_level_test/SetValueOperation/ 按场景划分为 Smoke、Dtype_dataFormat、Boundary_value、Performance、Requirements 等多个子目录。以 Smoke 用例 为例其结构与典型取值如下CaseNameOpParamInShape (dst;src)InDTypeExpectedErrorsetValueInt64_smoke{starts:[0,0,0],ends:[13,2,4096],strides:[1,1,1]}28,10,4096;13,2,4096int64NO_ERRORsetValuefloat16_smoke{starts:[0,0,0],ends:[13,2,4096],strides:[1,1,1]}28,10,4096;13,2,4096float16NO_ERRORsetValueInt32_smoke{starts:[0,0,0],ends:[13,2,4096],strides:[1,1,1]}28,10,4096;13,2,4096int32NO_ERRORsetValuefloat_smoke{starts:[0,0,0],ends:[13,2,4096],strides:[1,1,1]}28,10,4096;13,2,4096floatNO_ERROR验证一下第 4 节的校验规则dst[28,10,4096]src[13,2,4096]两者在第 0、1 维不同且第 0 维为最高维、第 2 维相同符合两个维度不同且其中之一是最高维的要求ends[0]-starts[0]13src.dims[0]ends[1]-starts[1]2src.dims[1]ends[2]-starts[2]4096src.dims[2]拷贝形状一致。同一 CSV 前半部分还包含大量 Generalization 随机形状用例如 dst[984,3680]、src[13,1024]或 dst[15,12,2304]、src[13,12,1024]覆盖 int32/int64/float16/float 等类型ExpectedError 均为 NO_ERROR。此外 Dtype_dataFormat 与 Boundary_value 目录分别覆盖类型/格式组合与边界形状Requirements 验证 bf16 精度支持Performance 提供性能基线BaseLine对照。7.2 API 测试在 API 测试侧仓库提供了 test_set_value.py 与对应的 set_value.csv 用例数据可从 Python 侧驱动算子执行并做数值对比。结合 CSV 测试框架tests/apitest/opstest/csv/与高层测试框架tests/high_level_test/operation_test.py即可将上述用例一键跑通用于回归验证与精度检查。8. 使用要点与限制总结综合参数头文件注释、源码校验逻辑与测试用例使用 SetValueOperation 时需要重点注意以下几点原地语义算子没有输出张量结果直接写回输入 dst调用方需保证 dst 可写且允许被就地修改形状强约束dst 与 src 必须同维数src 各维均不能大于 dst 对应维两者恰好有 1 或 2 个维度不同且唯一的差异维不能是第 0 维、两个差异维中必须包含第 0 维strides 仅支持全 1strides 数组长度必须等于维数且所有元素必须为 1否则返回ERROR_INVALID_PARAM切片区间语义ends[i]是开区间上界拷贝到 ends[i]-1 为止且拷贝形状(ends[i]-starts[i]-1)/strides[i]1必须与 src 第 i 维大小严格一致类型与格式支持 float16/float/int32/int64/bf16 五种 dtype格式仅支持 nd执行路径不提供 ACLNN 接口统一走SetValueOperation → SetValueOpsRunner → CopyOperation 内核图的单阶段执行链路。该算子以极简的一张内核图 一个 CopyOperation 节点实现了通用的原地切片赋值能力适合在需要将某张量内容写入另一张量指定区域的场景中作为基础构件使用。若需深入了解其知识条目组织方式可继续阅读 .agent/knowledge/ops/other/set_value/index.md 与路由文件 .agent/knowledge/routing/set_value.md。【免费下载链接】ascend-transformer-boost本项目是CANN提供的是一款高效、可靠的Transformer加速库基于华为Ascend AI处理器提供Transformer定制化场景的高性能融合算子。项目地址: https://gitcode.com/cann/ascend-transformer-boost创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/19 0:43:14

语音输入补进 DSH Mobile,TaoToken 继续给 Harness 供模型调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 0:43:14

基于深度学习的交通标志识别系统毕业设计实战

每年到了毕设选题那阵子,总有一批人在“深度学习”和“能顺利答辩”之间反复横跳。基于深度学习的交通标志识别系统之所以常年热度不减,是因为它同时踩中了三个硬指标:公开数据集现成、模型可大可小、演示效果肉眼可见——传一张路牌图片进去…

2026/9/19 1:53:17

HBase Shell 操作全解析:列族设计、Row Key 与排错指南

简介:这是一份HBase入门实验报告,面向正在学习Hadoop生态与NoSQL数据库的初学者,重点演示如何通过HBase Shell完成创建表、插入数据与查询操作。报告以student表为例,梳理了建表语句、put写入和get查询的具体命令,并记…

2026/9/19 1:53:17

Win10磁盘100%排查:任务管理器到SFC/DISM实战

任务管理器里磁盘一栏长期顶在 100%,鼠标点一下要等三秒,这种滋味我在好几台 windows10 机器上都遇到过。网上搜“磁盘100%解决方法”,答案从关服务到换硬盘五花八门,但真正到了现场,同一招在这台机器上管用&#xff0…

2026/9/19 1:53:17

MATLAB中用SAC实现交通流连续决策预测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 1:48:17

YOLOv11零售客流统计实战:检测、跟踪与热力图全链路解析

简介:这份PDF文档面向零售行业数据分析人员、计算机视觉初学者及目标检测工程实践者,系统讲解如何用YOLOv11完成客流量统计中的轨迹跟踪与热力图生成。全文共43页,支持目录章节跳转与阅读器左侧大纲快速定位,内容完整、图表清晰。…

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/19 0:03:10

验证 OpenSpec 兼容性,Cursor 的 Token 从 TaoToken 出

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 0:03:10

书桌角落的 Mac mini,OpenClaw 通过 TaoToken 跑任务。

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 0:03:10

oh-my-hermes:打造跨工具的命令编排与插件化工作流

1. 项目概述与设计初衷1.1 它到底是什么先说结论:oh-my-hermes 是一个面向开发者日常终端操作的效率工具套件,核心定位是“把分散在各类命令行工具里的高频操作,统一收拢成一套插件化、可编排的工作流”。项目灵感来源很明显——oh-my-zsh 重…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码