asc-devkit Tiling 调测实践:ContextBuilder::AddInputTd 输入 Tensor 描述接口详解

发布时间:2026/10/16 2:32:47
asc-devkit Tiling 调测实践:ContextBuilder::AddInputTd 输入 Tensor 描述接口详解
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载在算子 Tiling 函数TilingParse的本地调测中往往没有真实的图引擎上下文可用。asc-devkit 提供的context_ascendc::ContextBuilder允许开发者在宿主机上手动构造TilingContext而AddInputTd正是这条构造链中为算子逐一补齐输入 Tensor 元数据dtype、格式、shape乃至真实数据值的关键接口。读完本文你将掌握AddInputTd的三个重载原型、参数约束、与NodeIoNum/IrInstanceNum的协作关系以及它在源码层面的实现细节包括 float 到 float16/bfloat16 的自动转换与 bin 文件加载能够独立完成 Tiling 函数的离线调测。在 Tiling 调测体系中的位置asc-devkit 的 Utils-API 中专门设有 Tiling 调测模块核心由两部分组成OpTilingRegistry负责加载 Tiling 共享库并获取 Tiling 函数指针ContextBuilder提供一系列 API 接口支持手动构造TilingContext来验证 Tiling 函数以及构造KernelContext来验证 TilingParse 函数。其典型用法分为两条路径// 构造 KernelContext用于 TilingParse 函数验证 auto kernelContextHolder context_ascendc::ContextBuilder() .Inputs(...) .Outputs(...) .BuildKernelRunContext(); gert::KernelContext* tilingParseContext kernelContextHolder-GetContextgert::KernelContext(); // 构造 TilingContext用于 Tiling 函数验证 auto tilingContextHolder context_ascendc::ContextBuilder() .SetOpNameType(..., ...) .NodeIoNum(...) .IrInstanceNum(...) .AddInputTd(...) .AddOutputTd(...) .AddAttr(...) .BuildTilingContext(); gert::TilingContext* tilingContext tilingContextHolder-GetContextgert::TilingContext();从源码结构看ContextBuilder内部同时持有gert::OpKernelContextBuilder与gert::OpTilingContextBuilder两个底层构造器见 context_builder_impl.h前者服务BuildKernelRunContext()后者服务BuildTilingContext()。AddInputTd只作用于后者的 Tiling 构造链路它把用户声明的每个输入 Tensor 注册进内部的dependTensorsData_映射表最终在BuildTilingContext()中统一交给tilingCtxBuilder_-InputTensors(tensorVec)见 context_builder_impl.cpp。功能说明与函数原型AddInputTd的功能是为算子增加输入 Tensor 的描述。在 context_builder.h 中声明了三个重载// 原型1仅描述元数据dtype/格式/shape不带数据 ContextBuilder AddInputTd(int32_t index, ge::DataType dtype, ge::Format originFormat, ge::Format storageFormat, gert::StorageShape storageShape); // 原型2额外传入内存中的数据指针值依赖场景 ContextBuilder AddInputTd(int32_t index, ge::DataType dtype, ge::Format originFormat, ge::Format storageFormat, gert::StorageShape storageShape, void* constValues); // 原型3额外传入 bin 格式数据文件路径值依赖场景 ContextBuilder AddInputTd(int32_t index, ge::DataType dtype, ge::Format originFormat, ge::Format storageFormat, gert::StorageShape storageShape, const std::string filePath);三个重载的差异仅在于最后一项是否提供该输入 Tensor 的值。若 Tiling 函数只依赖 shape/dtype 做切分用原型 1 即可若 Tiling 函数需要读取输入数据本身即值依赖场景如依据数据内容决定切分策略则需使用原型 2 或原型 3 提供真实数据。参数说明参数输入/输出说明index输入算子输入索引从 0 开始计数dtype输入算子输入 tensor 的数据类型ge::DataType枚举如ge::DT_FLOAT16、ge::DT_INT64originFormat输入算子输入 tensor 原始格式ge::Format枚举如ge::FORMAT_NDstorageFormat输入算子输入 tensor 运行时格式ge::Format枚举如ge::FORMAT_NDstorageShape输入算子输入 tensor 的 shapegert::StorageShape类型分别携带原始 shape 与运行时存储 shapeconstValues输入值依赖场景下该输入 tensor 需要设置的数据指针。bfloat16 与 float16 的数据依赖场景请传入 float 格式的数据接口内部自行转换成 bfloat16 或 float16filePath输入值依赖场景下该输入 tensor 的 bin 格式数据文件路径返回值说明返回当前ContextBuilder的对象引用类型因此支持链式调用这也是 intro 文档中调用示例采用级联写法的原因。约束说明输入的index需要基于算子 IR 定义按照IrInstanceNum声明顺序来排布调用AddInputTd前需要先调用 NodeIoNum 与 IrInstanceNum 接口。其中NodeIoNum(inputNum, outputNum)声明算子 IR 原型定义中的输入/输出种类数IrInstanceNum(instanceNum)则按输入 index 顺序声明实例化时每种输入的实际个数。这一点在源码中可以直接印证ContextBuilderImpl::IrInstanceNum会把各输入的实例数累加后回写为inputNum_即展开后的输入总数而BuildTilingContext正是按该总数遍历dependTensorsData_见 context_builder_impl.cpp 与 L111-L120。也就是说某个输入若在 IR 中是动态张量、被实例化为多个 Tensor例如 MoE 算子的专家路由张量就需要对该 index 的每个实例逐个调用AddInputTd。源码级实现细节元数据注册流程原型 1无数据版本的核心逻辑context_builder_impl.cpp通过DataUtils::GetTensorSizeByStorageShape(storageShape, dtype)按运行时存储 shape与 dtype 计算 tensor 字节数。若 shape 乘积 ≤ 0 或按 dtype 换算后字节数 ≤ 0含溢出场景返回 -1 并置errFlag_最终导致BuildTilingContext()返回空指针调用gert::Tensor::CreateFollowing(dtype, tensorSize, totalSize)创建带存储头部的 tensor 内存依次写入MutableOriginShape()、MutableStorageShape()、SetDataType、SetStorageFormat、SetOriginFormat以 index 为键插入dependTensorsData_供构建阶段取用。值依赖数据填充原型 2 与原型 3原型 2 会按 dtype 查表找到对应的数据填充函数context_builder_impl.cpp 中的SET_CONST_DATA_FUNC_MAP整型/浮点通用类型int8 至 double走模板函数SetConstDataT按字节直接拷贝ge::DT_FLOAT16走SetConstDataWithFloat16把传入的 float 数组逐个经FloatToUint16转为 float16半精度位运算转换含溢出处理ge::DT_BF16走SetConstDataWithBF16把 float 数组逐个经FloatToBF16转换直接右移 fp32 低 16 位。这正是文档参数说明中强调的bfloat16 与 float16 的值依赖场景必须传入 float 格式数据——接口内部以float 元素数 目标字节数 × 2 / sizeof(float)的方式解析输入指针并做转换constexpr int64_t OFFSET 2见 context_builder_impl.cpp。原型 3 的实现context_builder_impl.cpp同样先计算 tensor 字节数malloc一块与之一致的 buffer调用DataUtils::ReadBinFile读取文件路径为空、长度 ≥PATH_MAX、realpath解析失败文件不存在或打开失败均返回 false并置errFlag_把文件内容memcpy_s进 tensor 的数据区随后释放临时 buffer。因此 bin 文件必须与该 index 输入 tensor 的字节数精确匹配且路径必须可被解析为真实存在的绝对路径。单元测试 test_tiling.cpp 专门覆盖了长文件名5000 字符、空字符串路径等异常分支均断言BuildTilingContext()返回空指针。构建阶段的失败语义上述任何一个AddInputTd调用失败shape 非法、内存分配失败、文件读取失败、dtype 无对应填充函数等都不会立即抛错而是累计到ContextBuilderImpl::errFlag_BuildTilingContext()在检查到errFlag_为真时记录 Build Context Error! 并返回nullptr见 context_builder_impl.cpp。因此调测脚本中应在BuildTilingContext()返回值上做空指针判断。完整调用示例以下示例继承自官方文档的调用示例构造一个 5 种输入、1 种输出的算子上下文其中 index 2 是动态张量声明 2 个实例需要对该 index 连续调用两次AddInputTd。注意示例依赖了bias2_shape原文档中未展示其声明此处按上下文补全以保证代码可复制gert::StorageShape x_shape {{1024, 5120}, {1024, 5120}}; gert::StorageShape expert_tokens_shape {{16}, {16}}; gert::StorageShape weight1_shape {{16, 5120, 0}, {16, 5120, 0}}; gert::StorageShape bias1_shape {{16, 0}, {16, 0}}; gert::StorageShape bias2_shape {{16, 5120}, {16, 5120}}; std::vectorfloat x_const_value (1024 * 5120, 2.f); std::vectorfloat bias_value (16 * 5120, 3.f); context_ascendc::ContextBuilder builder; (void)builder.NodeIoNum(5, 1) // 声明算子有5个输入1个输出 .IrInstanceNum({1, 1, 2, 1, 1}) // 声明index 2的算子tensor有两个dynamic实例 .SetOpNameType(tmpName, tmpType) .AddInputTd(0, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, x_shape, reinterpret_castvoid *(x_const_value.data())) // 内部会将该指针指向的数据转为float16类型 .AddInputTd(1, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, weight1_shape) .AddInputTd(2, ge::DT_INT64, ge::FORMAT_ND, ge::FORMAT_ND, expert_tokens_shape, ./expert_tokens_data.bin) // index2 的第一个dynamic tensor值依赖场景传入数据路径 .AddInputTd(3, ge::DT_INT64, ge::FORMAT_ND, ge::FORMAT_ND, expert_tokens_shape, ./expert_tokens_data.bin) // index2 的第二个dynamic tensor值依赖场景传入数据路径 .AddInputTd(4, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, bias1_shape) .AddInputTd(5, ge::DT_BF16, ge::FORMAT_ND, ge::FORMAT_ND, bias2_shape, reinterpret_castvoid*(bias_value.data())) // 内部会将该指针指向的数据转为Bf16类型 .BuildTilingContext();几点实操提示每个 index 的AddInputTd调用次数应等于IrInstanceNum中该位置声明的实例数累计后与构建阶段展开的输入总数一致gert::StorageShape的两组元素分别对应原始 shape 与运行时存储 shape二者可以不同如转置类算子值依赖输入若为 float16/bfloat16 类型constValues指针必须指向 float 数组若为 bin 文件文件内容按目标 dtype 的原始字节排布文件大小须等于storageShape换算出的字节数构建成功后通过holder-GetContextgert::TilingContext()取出上下文可直接验证GetInputShape(i)、GetInputDesc(i)等读取结果是否与声明一致。测试用例佐证仓库中的单元测试 tests/api/utils/tiling/test_tiling.cpp 对AddInputTd做了较完整的验证可作为调测参考TestTilingContextBuildWithConstValueL381-L439同时覆盖三种重载——constValues 指针float → float16/bfloat16 转换、纯元数据、bin 文件路径并断言构建出的TilingContext中GetInputShape(1)、GetOutputShape(0)、GetInputDesc(0)-GetDataType()等值与声明一致TestTilingContextBuildWithBinFileL323-L379验证不存在/超长/空路径时构建失败TestAddInputTdMallocFailedL40-L65通过 mock 使 size 计算返回超大值模拟分配失败后BuildTilingContext()返回空指针TestTilingContextBuildFailedL501-L519shape 含负维度{-1, 5120}时GetTensorSizeByStorageShape判定非法构建失败。小结AddInputTd是 asc-devkit Tiling 调测链路中声明输入的原子接口三个重载分别对应仅元数据、内存数据、bin 文件数据三类诉求调用前必须先完成NodeIoNum/IrInstanceNum声明index 需严格对应 IR 声明顺序float16/bfloat16 值依赖场景由接口内部完成 float 源数据转换。配合 AddOutputTd、AddAttr、TilingData、Workspace 等兄弟接口即可在宿主机上完整离线构造TilingContext实现对 Tiling 函数的本地验证与调测。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit Tiling 调优指南ContextBuilder::AddAttr 接口详解与 TilingContext 属性构造实战asc devkit Tiling 调优指南ContextBuilder::AddAttr 接口详解与 TilingContext 属性构造实战 在 asc人工智能深度学习算子库CANNAscendMarkwon 有序列表缩进解析从 ol-2-spaces.md 看 CommonMark 列表嵌套规则与测试验证Markwon 有序列表缩进解析从 ol 2 spaces.md 看 CommonMark 列表嵌套规则与测试验证 导读 本文以 Markwon 核心模块人工智能深度学习算子库CANNAscendtwilio-go 实战指南用 Go 优雅调用 Twilio API 的短信、语音与号码管理twilio go 实战指南用 Go 优雅调用 Twilio API 的短信、语音与号码管理 twilio go 是 GitHub 上 kevinburke人工智能深度学习算子库CANNAscend上一篇构建企业级微信自动化系统的技术架构与实践下一篇B站视频下载工具轻松获取大会员4K和充电专属内容创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考