资讯详情

asc-devkit Tiling 上下文构建指南:用 ContextBuilder::BuildTilingContext 离线验证算子 Tiling 函数

📅 2026/10/16 1:33:11 | 华诺云谱 👁 阅读
asc-devkit Tiling 上下文构建指南:用 ContextBuilder::BuildTilingContext 离线验证算子 Tiling 函数
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载在 Ascend C 算子开发中Tiling 函数负责根据输入 Tensor 描述计算切分策略并填充 TilingData正常由框架自动调用。当需要脱离框架、单独对 Tiling 函数做调测Tiling 调测时context_ascendc::ContextBuilder提供了手动构造gert::TilingContext的完整链路而BuildTilingContext()正是这条链路中最终提交构建的接口它把此前通过链式 API 配置的算子名、IO 数量、Tensor 描述、属性、平台信息等一次性装配成 TilingContext并以KernelRunContextHolder共享指针的形式返回。读完本文你可以掌握 BuildTilingContext 的函数原型与调用顺序、底层实现细节与错误处理机制并能结合OpTilingRegistry独立完成一次完整的 Tiling 函数离线验证。功能定位与函数原型按照 BuildTilingContext API 文档 的定义该接口的功能说明为构造KernelRunContextHolder的对象该对象可通过GetContext接口获取TilingContext类型的对象。函数原型std::shared_ptrKernelRunContextHolder BuildTilingContext()参数说明无。返回值说明指向KernelRunContextHolder的共享指针构建失败时返回nullptr。约束说明文档层面未列出额外约束但从实现代码看调用BuildTilingContext()前需要先完成算子信息与 Tensor 描述的声明详见下文且链上任何一个环节置错都会导致构建失败。它是ContextBuilder类中与BuildKernelRunContext()并列的两个终结接口之一BuildKernelRunContext()用于构造 TilingParse 验证用的KernelContext而BuildTilingContext()面向 Tiling 函数验证场景两者共用同一个 Builder 类但走不同的内部构建器。这一点在头文件 context_builder.h 中有清晰的分组注释// kernel context builder与// Tiling Context Builder。构建链路BuildTilingContext 之前的链式配置ContextBuilder采用 Builder 模式所有配置接口均返回当前 Builder 对象的引用最终以BuildTilingContext()收尾。完整的 TilingContext 构建链路及各环节作用如下各接口的详细说明可参考 ContextBuilder 接口索引接口作用说明SetOpNameType(opName, opType)设置算子的名字与类型opType需与 Tiling 函数注册时的 OpType 一致NodeIoNum(inputNum, outputNum)声明算子 IR 原型定义的输入/输出个数必须配合IrInstanceNum使用IrInstanceNum(instanceNum)按输入 index 顺序声明实例化时每种输入的实际个数支持 dynamic tensor 多实例场景AddInputTd(index, dtype, originFormat, storageFormat, storageShape[, constValues/filePath])增加输入 Tensor 描述值依赖场景可传入内存数据指针或 bin 文件路径AddOutputTd(index, dtype, originFormat, storageFormat, storageShape)增加输出 Tensor 描述输出个数需与NodeIoNum声明一致AddAttr(attrName, attrValue)设置算子属性及对应值支持 int64_t、bool、string、float 及多种 vector 类型不支持重复添加同名属性TilingData(void *tilingData)传入指向 TilingData 的指针只支持以调用BuildTilingContext()为前提使用Workspace(gert::ContinuousVector *workspace)传入指向gert::ContinuousVector的指针同样只支持以调用BuildTilingContext()为前提使用AddPlatformInfo(customSocVersion)设置硬件平台信息传空指针自动获取当前硬件信息传入具体 AI 处理器型号则加载对应平台信息CompileInfo(void *compileInfo)/PlatformInfo(void *platformInfo)直接传入编译信息与平台信息对象与AddPlatformInfo二选一使用关键顺序约束调用AddInputTd前需要先调用NodeIoNum与IrInstanceNum输入的 index 需要基于算子 IR 定义按照IrInstanceNum声明顺序排布参见 AddInputTd API 文档NodeIoNum与IrInstanceNum必须配合使用参见 NodeIoNum、IrInstanceNumAddPlatformInfo调用后需要通过BuildTilingContext()来构建 Tiling 上下文并传递给 Tiling 函数使用参见 AddPlatformInfoTilingData()与Workspace()由于 TilingContext 与 KernelContext、TilingParseContext 内部数据排序不同只支持以调用BuildTilingContext()为前提使用其他场景建议用Outputs接口否则发生未定义行为参见 TilingData、Workspace。输入数据的三种来源AddInputTd提供三个重载对应输入 Tensor 数据的三种来源ContextBuilder AddInputTd(int32_t index, ge::DataType dtype, ge::Format originFormat, ge::Format storageFormat, gert::StorageShape storageShape); ContextBuilder AddInputTd(int32_t index, ge::DataType dtype, ge::Format originFormat, ge::Format storageFormat, gert::StorageShape storageShape, void* constValues); ContextBuilder AddInputTd(int32_t index, ge::DataType dtype, ge::Format originFormat, ge::Format storageFormat, gert::StorageShape storageShape, const std::string filePath);不传数据仅声明 shape、dtype、格式Tensor 内容为空适用于 shape 依赖、非值依赖的输入内存指针constValues值依赖场景下传入数据指针。注意 bfloat16 与 float16 的数据依赖场景应传入 float 格式数据接口内部会自行转换为 bfloat16 或 float16——实现代码 context_builder_impl.cpp 中的SET_CONST_DATA_FUNC_MAP正是按 dtype 分发到SetConstData模板函数或SetConstDataWithFloat16/SetConstDataWithBF16其中 FP16/BF16 的转换逻辑分别见 context_builder_impl.cppbin 文件路径filePath值依赖场景下直接读取 bin 格式数据文件。实现见 context_builder_impl.cpp先按 StorageShape 与 dtype 计算 Tensor 字节大小再调用DataUtils::ReadBinFile读入文件并拷贝进 Tensor 缓冲区。文件不存在、路径过长超过PATH_MAX或为空都会置错最终导致BuildTilingContext()返回nullptr。BuildTilingContext 的源码实现解析从源码结构看ContextBuilder是一个对外接口类内部全部委托给ContextBuilderImpl处理。公开入口在 context_builder.cppstd::shared_ptrKernelRunContextHolder ContextBuilder::BuildTilingContext() { ASCENDC_ASSERT(impl_ ! nullptr, return nullptr, CXT_ASCENDC_LOGE(impl_ is nullptr!)); return impl_-BuildTilingContext(); }真正的构建逻辑在 ContextBuilderImpl::BuildTilingContext核心流程可归纳为四步错误标志短路检查errFlag_。此前任何一次AddInputTd/AddOutputTd的非法操作如 shape 计算出的 tensorSize 为负、bin 文件读取失败、常量数据设置失败都会将errFlag_置位此时直接打印Build Context Error!并返回nullptr保证构建结果是全成功或全失败回填输入 Tensor按inputNum_逐个从dependTensorsData_中取出AddInputTd创建的 Tensor 缓冲区组装为gert::Tensor*指针数组再调用tilingCtxBuilder_-InputTensors(tensorVec)注入底层构建器调用底层 Build执行tilingCtxBuilder_-Build()得到gert::ContextHoldergert::TilingContext若GetContext()为空则返回nullptr。从源码结构看tilingCtxBuilder_与kernelCtxBuilder_分别是gert::OpTilingContextBuilder与gert::OpKernelContextBuilder在 ContextBuilderImpl 构造函数 中初始化并预置了default_name/default_type、IONum(1, 1)等默认值——这也解释了为何测试用例 test_tiling.cpp 中不做任何NodeIoNum声明、直接AddInputTd后构建也会走到错误路径包装返回值将 context holder、输入/输出 Tensor 缓冲区std::vectorstd::unique_ptruint8_t[]负责持有 Tensor 内存生命周期与KernelContext*一起传入KernelRunContextHolder的私有构造函数以std::shared_ptr形式返回。关于返回值KernelRunContextHolder其结构定义见 KernelRunContextHolder 文档 与 context_builder.hstruct KernelRunContextHolder { KernelRunContextHolder(); ~KernelRunContextHolder(); templatetypename T T *GetContext() const { return reinterpret_castT*(kernelContext); } gert::ComputeNodeInfo *MutableComputeNodeInfo(); std::unique_ptrValueHolderImpl valueHolder; std::unique_ptruint8_t[] computeNodeExtendHolder; KernelRunContext *context {nullptr}; // ... };GetContextT()获取 context 成员变量转化为模板 T 的指针T 可选KernelContext以及它的子类如TilingContext。注意模板参数写错如传入与内部类型不匹配的 T不会报错因此 Tiling 场景应固定使用GetContextgert::TilingContext()MutableComputeNodeInfo()返回构造的gert::ComputeNodeInfo类指针从 context_builder_impl.h 的实现看TilingContext 场景下它返回tilingCtx-GetComputeNodeInfo()valueHolder保证 holder 内部值包括 Tensor 缓冲区与 context 本体不提前析构的智能指针这是共享指针持有 holder、裸指针使用 context这一所有权设计的核心tilingContext裸指针的生命周期由tilingContextHolder共享指针保障。AddPlatformInfo的实现同样值得注意传空指针时通过dlopen(libruntime.so)动态获取rtGetSocVersion函数自动探测硬件型号传入具体型号时则直接使用该字符串见 context_builder.cpp。从实现看当前型号映射表支持Ascend310P、Ascend910、Ascend910B、Ascend910_93、Ascend310B、Ascend950、Ascend350等短型号名内部统一查Short_SoC_version字段设置失败会打印报错信息并中断构建链路。端到端实战完整 Tiling 调测流程BuildTilingContext()的典型应用场景是工程化算子开发中的 Tiling 调测加载编译好的 Tiling 动态库获取 Tiling 函数指针用ContextBuilder构建的 TilingContext 作为入参执行验证。完整流程详见 如何进行Tiling调测参考 工程化算子开发 完成算子实现通过算子包编译Tiling 动态库为部署目录下的liboptiling.so或算子动态库编译Tiling 集成在libcust_opapi.so中获取 Tiling 动态库编写测试代码ContextBuilder配置输入输出 Tensor 的形状、数据类型、格式及平台信息构建 TilingContextOpTilingRegistry::LoadTilingLibrary加载动态库、GetTilingFunc获取 Tiling 函数指针执行 Tiling 函数验证正确性// test.cpp #include iostream #include exe_graph/runtime/storage_shape.h #include tiling/context/context_builder.h int main() { gert::StorageShape x_shape {{2, 32}, {2, 32}}; gert::StorageShape y_shape {{2, 32}, {2, 32}}; gert::StorageShape z_shape {{2, 32}, {2, 32}}; auto param gert::TilingData::CreateCap(4096); auto workspace_size_holder gert::ContinuousVector::Createsize_t(4096); auto ws_size reinterpret_castgert::ContinuousVector *(workspace_size_holder.get()); auto holder context_ascendc::ContextBuilder() .NodeIoNum(2, 1) .IrInstanceNum({1, 1}) .AddInputTd(0, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, x_shape) .AddInputTd(1, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, y_shape) .AddOutputTd(0, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, z_shape) .TilingData(param.get()) .Workspace(ws_size) .AddPlatformInfo(Ascendxxxyy) .BuildTilingContext(); auto tilingContext holder-GetContextgert::TilingContext(); context_ascendc::OpTilingRegistry tmpIns; bool flag tmpIns.LoadTilingLibrary(/your/path/to/so_path/liboptiling.so); // 加载对应的Tiling动态库文件 if (flag false) { std::cout Failed to load tiling so std::endl; return -1; } context_ascendc::TilingFunc tilingFunc tmpIns.GetTilingFunc(AddCustom); // 获取AddCustom算子对应的Tiling函数,此处入参为OpType if (tilingFunc ! nullptr) { ge::graphStatus ret tilingFunc(tilingContext); // 执行Tiling函数 if (ret ! ge::GRAPH_SUCCESS) { std::cout Exec tiling func failed. std::endl; return -1; } } else { std::cout Get tiling func failed. std::endl; return -1; } return 0; }编译测试代码g test.cpp -I${INSTALL_DIR}/include -L${INSTALL_DIR}/lib64 -Wl,-rpath,${INSTALL_DIR}/lib64 -ltiling_api -lc_sec -lgraph_base -lregister -lunified_dlog -lplatform -o test其中${INSTALL_DIR}替换为 CANN 软件安装路径root 用户默认/usr/local/Ascend/cann。必需链接的动态库包括libtiling_api.so包含 ContextBuilder 类、OpTilingRegistry 类等 Tiling 功能库、libc_sec.so安全函数库、libgraph_base.so基础数据结构与接口库、libregister.soTiling 函数注册、算子原型注册等业务注册库、libunified_dlog.solog 库、libplatform.so平台信息库Tiling 函数中使用硬件平台信息时依赖。执行可执行文件./test通过标准输出确认 Tiling 函数执行成功。仓库内还有一套可直接参考的回归测试test_tiling.cpp 中的TestTilingContextBuildWithConstValue演示了多输入、混合 dtypeFP16/BF16/INT64 常量数据、多类型AddAttr、AddPlatformInfo(Ascend910B)的完整构建并在构建成功后通过tilingContext-GetInputShape(1)、GetOutputShape(0)、GetInputDesc(0)-GetDataType()等接口断言 Tensor 描述是否正确装配进 TilingContext可作为验证自己构建结果的模板。常见失败场景与排查建议结合测试用例 test_tiling.cpp 覆盖的边界情况BuildTilingContext()返回nullptr的常见原因包括shape 非法StorageShape 任一维为负或零导致GetTensorSizeByStorageShape计算出非正大小TestTilingContextBuildFailed、TestTilingContextIoFailed均用{{-1, 5120}, {-1, 5120}}触发该路径bin 文件不可读路径为空、超长或不存在TestTilingContextBuildWithBinFile分别用不存在的./expert_tokens_data.bin、5000 字符的超长文件名、空字符串验证失败路径常量数据设置失败dtype 不在SET_CONST_DATA_FUNC_MAP支持范围内或 Tensor holder 空间不足平台信息获取失败AddPlatformInfo传入未知型号、或运行时libruntime.so无法加载导致rtGetSocVersion获取失败设置失败会打印报错信息。排查时可先确认构建链路中每个Add*调用的参数合法性再观察运行日志日志相关环境变量配置请参考 CANN 环境变量参考中的日志配置。此外注意测试代码中gert::TilingData::CreateCap(4096)返回的std::unique_ptr必须保持存活——TilingData(param.get())传入的是裸指针TilingContext 构建完成、Tiling 函数执行期间param不可提前析构workspace_size_holder同理。小结BuildTilingContext()是ContextBuilder面向 Tiling 调测场景的收口接口它以无参调用终结整条 Builder 链把SetOpNameType、NodeIoNum/IrInstanceNum、AddInputTd/AddOutputTd、AddAttr、TilingData、Workspace、AddPlatformInfo等各环节的配置在 ContextBuilderImpl::BuildTilingContext 中统一校验、装配并交由底层gert::OpTilingContextBuilder完成构建。掌握配置顺序 错误短路 holder 所有权这三点后即可在不依赖框架的前提下稳定地离线驱动任意 Tiling 函数为算子的 Tiling 逻辑提供快速、可重复的验证手段。相关资源API 文档BuildTilingContext、ContextBuilder 接口索引、KernelRunContextHolder 结构定义、OpTilingRegistry编程指南如何进行Tiling调测、工程化算子开发源码context_builder.h、context_builder.cpp、context_builder_impl.h、context_builder_impl.cpp测试test_tiling.cpp赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit Tiling下沉详解用 DEVICE_IMPL_OP_OPTILING 宏将 Tiling 函数注册到 Device 侧asc devkit Tiling下沉详解用 DEVICE_IMPL_OP_OPTILING 宏将 Tiling 函数注册到 Device 侧 在 Ascen人工智能深度学习算子库CANNAscendasc-devkit Tiling 调优指南ContextBuilder::AddAttr 接口详解与 TilingContext 属性构造实战asc devkit Tiling 调优指南ContextBuilder::AddAttr 接口详解与 TilingContext 属性构造实战 在 asc人工智能深度学习算子库CANNAscendasc-devkit Tiling 调测实践ContextBuilder::AddInputTd 输入 Tensor 描述接口详解asc devkit Tiling 调测实践ContextBuilder::AddInputTd 输入 Tensor 描述接口详解 在算子 Tiling 函数人工智能深度学习算子库CANNAscend上一篇探索Hexo主题新星Obsidian - 打造个性化的博客体验下一篇【亲测免费】 ProteinMPNN深度学习解析蛋白质结构与功能的新星创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑