CANN pyasc 算子调试:使用 asc.dump_tensor 在 NPU 上板打印 Tensor 数据

发布时间:2026/9/18 20:08:00

CANN pyasc 算子调试:使用 asc.dump_tensor 在 NPU 上板打印 Tensor 数据 CANN pyasc 算子调试使用 asc.dump_tensor 在 NPU 上板打印 Tensor 数据【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyascasc.dump_tensor是 CANN pyascAscend C Python 编程接口提供的算子功能调试接口用于在昇腾 AI 处理器 NPU 上板运行时直接 Dump 指定 TensorGlobalTensor/LocalTensor的内容帮助开发者快速核对算子中间计算结果。本文基于 pyasc 仓库中的 API 文档与源码实现系统讲解该接口的函数签名、参数语义、使用约束、完整调用示例及其在编译链路中的实现原理读完即可在自己的算子工程中正确使用 dump_tensor 进行上板调试。接口概述与定位在基于算子工程开发的 Ascend C 算子中当算子计算结果不符合预期时最直接的手段是查看算子内部各阶段 Tensor 的真实数据。asc.dump_tensor正是为此设计的调试接口它可以在 Kernel 执行到指定位置时将GlobalTensorGlobal Memory 上的张量或LocalTensorUnified Buffer / L1 Buffer / L0C Buffer 等本地存储上的张量中指定数量的元素内容打印出来。该接口属于 pyasc 的 basic 能力层与asc.printf打印标量和字符串、asc.dump_acc_chk_point按偏移位置精细 Dump等共同组成算子功能调试工具箱详见 算子调试调优指南。函数签名与参数说明pyasc 通过 Python 重载overload同时支持GlobalTensor与LocalTensor两种入参函数签名如下asc.language.basic.dump_tensor(tensor: GlobalTensor, desc: int, dump_size: int, shape_info: ShapeInfo | None None) - None asc.language.basic.dump_tensor(tensor: LocalTensor, desc: int, dump_size: int, shape_info: ShapeInfo | None None) - None参数类型说明tensorGlobalTensor/LocalTensor需要 Dump 的 Tensordescint用户自定义附加信息行号或其他自定义数字用于区分多次打印dump_sizeint需要 Dump 的元素个数shape_infoShapeInfo \| None传入 Tensor 的 shape 信息可按照 shape 信息进行打印缺省为None从源码实现看python/asc/language/basic/dump_tensor.pydesc与dump_size均被严格校验为RuntimeInt对应 IR 侧的整数运行时值并被转换为uint32类型后传入 IR 构建器shape_info若不为None则必须是ShapeInfo类型并会通过to_ir()转换成 IR 表示。最终统一调用create_asc_DumpTensorOp生成ascendc.dump_tensor算子指令。对应的 Ascend C 函数原型pyasc 接口与 Ascend C 接口一一对应asc.dump_tensor对应 Ascend C 中的DumpTensor模板函数包含带 / 不带ShapeInfo两组重载template typename T __aicore__ inline void DumpTensor(const LocalTensorT tensor, uint32_t desc, uint32_t dumpSize) template typename T __aicore__ inline void DumpTensor(const GlobalTensorT tensor, uint32_t desc, uint32_t dumpSize)template typename T __aicore__ inline void DumpTensor(const LocalTensorT tensor, uint32_t desc, uint32_t dumpSize, const ShapeInfo shapeInfo) template typename T __aicore__ inline void DumpTensor(const GlobalTensorT tensor, uint32_t desc, uint32_t dumpSize, const ShapeInfo shapeInfo)这一映射关系同样可以从编译链路测试中得到印证在 test/Target/AscendC/basic/dump_tensor.mlir 中IR 侧的ascendc.dump_tensor %arg0, %c1_ui32, %c2_ui32经ascir-translate -mlir-to-ascendc生成后输出为AscendC::DumpTensor(v1, v2, v3);而带 shape 的重载则会先构造AscendC::ShapeInfo v4;再生成AscendC::DumpTensor(v1, v2, v3, v4);。使用约束说明根据 API 文档 的约束章节使用该接口前需注意以下几点适用场景该功能仅用于 NPU 上板调试仅支持以下三种调用方式通过 Kernel 直调方式调用算子通过单算子 API 调用方式调用算子间接调用单算子 APIaclnnxxx接口即 PyTorch 框架单算子直调场景。存储位置限制当前仅支持打印存储位置为Unified Buffer / L1 Buffer / L0C Buffer / Global Memory的 Tensor 信息。地址对齐要求操作数地址对齐要求请参见《Ascend C 算子开发接口》中的“通用说明和约束 - 通用地址对齐约束”。数据量上限该接口使用 Dump 功能所有使用 Dump 功能的接口在每个核上 Dump 的数据总量包括信息头不可超过1M。开发者需自行控制待打印的内容数据量超出则不会打印。此外参考 算子调试调优指南 的说明asc.dump_tensor接口会对算子实际运行的性能带来一定影响通常在调测阶段使用正式发布版本前应移除。调用示例无 Tensor shape 的打印只打印 Tensor 数据不关心其形状组织asc.dump_tensor(src_local, 5, date_len)其中src_local为LocalTensordesc5作为本次打印的自定义标识date_len为需要打印的元素个数。带 Tensor shape 的打印先构造asc.ShapeInfo对象再传入数据会按照 shape 信息组织打印shape_info asc.ShapeInfo() asc.dump_tensor(x, 2, 64, shape_info)ShapeInfo定义于 python/asc/language/core/types.py构造时可传入shape: Array、original_shape: Array以及data_format: DataFormat默认为DataFormat.ND并提供shape(dim)、original_shape(dim)方法访问各维度信息。完整实战示例在 vadd 算子中 Dump 数据参考 算子调试调优指南 中的 vadd 示例将 dump_tensor 完整嵌入一个多核 vector 加法算子的调试流程import asc asc.jit def vadd_kernel(x: asc.GlobalAddress, y: asc.GlobalAddress, z: asc.GlobalAddress, BLOCK_LENGTH: asc.ConstExpr[int], BUFFER_NUM: asc.ConstExpr[int], TILE_LENGTH: asc.ConstExpr[int], TILE_NUM: asc.ConstExpr[int]): offset asc.get_block_idx() * BLOCK_LENGTH x_gm asc.GlobalTensor() x_gm.set_global_buffer(x offset) # 使用 dump_tensor 打印 x_gm 输入并附带 shape 信息 tmp_array asc.array(asc.uint32, [4, 16]) tmp_shape_info asc.ShapeInfo(tmp_array) asc.dump_tensor(x_gm, 0, 32, tmp_shape_info) for i in range(TILE_NUM): copy_in(i, x_gm, y_gm, in_queue_x, in_queue_y, TILE_LENGTH) compute(z_gm, in_queue_x, in_queue_y, out_queue_z, TILE_LENGTH) copy_out(i, z_gm, out_queue_z, TILE_LENGTH) asc.jit def copy_in(i: int, x_gm: asc.GlobalAddress, y_gm: asc.GlobalAddress, in_queue_x: asc.TQue, in_queue_y: asc.TQue, TILE_LENGTH: asc.ConstExpr[int]): x_local in_queue_x.alloc_tensor(x_gm.dtype) asc.data_copy(x_local, x_gm[i * TILE_LENGTH:], countTILE_LENGTH) # 使用 dump_tensor 打印 Local Memory 的 Tensor if i 0: asc.dump_tensor(x_local, 1, 32)运行输出样例上板执行后打印结果分为两类Global Memory 的 Tensor 会带positionGM标记并按传入的 shape 组织成二维数组展示超出实际数据的维度以-占位Local MemoryUnified Buffer的 Tensor 则标记为positionUB按一维形式输出opTypev, DumpHead: AIV-0, CoreTypeAIV, block dim16, total_block_num16, block_remain_len1048024, block_initial_space1048576, rsv0, magic5aa5bccd CANN Version: XX.XX, TimeStamp: XXXXXXXXXXXXXXXXX DumpTensor: desc0, addr41200000, data_typefloat32, positionGM, dump_size32 [[19.000000, 4.000000, 38.000000, 50.000000, ...], [39.000000, 9.000000, 82.000000, 37.000000, ...], [-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-], [-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-]] DumpTensor: desc1, addr0, data_typefloat32, positionUB, dump_size32 [6.000000, 34.000000, 52.000000, 38.000000, ...]每条DumpTensor输出的信息头包含desc本次 Dump 的自定义标识、addrTensor 起始地址、data_type元素数据类型、position存储位置 GM/UB/L1/L0C、dump_size元素个数便于与代码中的调用点一一对应定位。源码级实现原理Python 层生成 DumpTensorOp 指令dump_tensor的 Python 实现位于 python/asc/language/basic/dump_tensor.py核心流程如下对desc、dump_size做类型校验须为RuntimeInt若传入shape_info校验其类型并通过shape_info.to_ir()转换为 IR 值调用全局 IR 构建器global_builder.get_ir_builder().create_asc_DumpTensorOp(...)将tensor、desc转为uint32、dump_size转为uint32以及可选的shapeInfo组装为ascendc.dump_tensor算子指令。该文件还同时定义了printf、print_time_stamp、dump_acc_chk_point、metrics_prof_start/stop等调试接口统一通过require_jit装饰器约束其在 JIT 编译上下文中使用并在 python/asc/language/basic/init.py 中导出到asc命名空间如asc.dump_tensor。编译链路从 IR 到 Ascend C 代码生成的ascendc.dump_tensor指令在代码生成阶段由 lib/Target/AscendC/Basic/DumpTensor.cpp 等目标代码发射模块处理最终产出AscendC::DumpTensor(...)调用。该映射关系由 test/Target/AscendC/basic/dump_tensor.mlir 中的FileCheck测试用例完整覆盖包括 GlobalTensor / LocalTensor 两种形态以及带 / 不带 ShapeInfo 两种重载。调试模式自动识别仓库中还实现了调试模式的自动检测机制在 lib/Dialect/Asc/Transforms/DetectEnableDebugPass.cpp 中Pass 会遍历算子 IR一旦发现ascendc::DumpTensorOp或PrintfOp等其他调试算子即为所在函数或模块设置enableDebug属性驱动后续编译流程打开调试支持。这意味着开发者只需在 Kernel 代码中写下asc.dump_tensor(...)编译链会自动识别并启用相应能力无需手工配置开关。单元测试验证pyasc 的单元测试 python/test/unit/language/basic/test_common_api.py 中对dump_tensor做了覆盖在 Kernel 直调场景下分别对LocalTensorx_local与GlobalTensorx_gm调用asc.dump_tensor(tensor..., desc0, dump_size5)验证接口在 JIT 编译与启动全链路下可正常生成与执行。与相关调试接口的对比接口打印对象特点asc.dump_tensorTensor 内容支持 GM/UB/L1/L0C可带 shape 打印按元素个数 dumpasc.dump_acc_chk_pointTensor 内容与 dump_tensor 类似但支持指定 Tensor 的偏移位置进行 Dump且附加信息仅支持uint32_t适用于精细化调试asc.printf标量与字符串类似 Cprintf需对\n转义打印执行位置与中间标量值asc.print_time_stamp时间戳打印时间戳辅助分析执行时序各接口的完整 API 说明可参阅 basic 语言接口索引调试整体流程可参阅 算子调试调优指南。使用建议控制打印数据量每个核上所有 Dump 接口的数据总量含信息头不超过 1M超出部分不会被打印因此应只对关键位置、关键 Tensor 做局部 dump避免整个大 Tensor 全量打印。善用 desc 标识在循环内或多个位置调用时通过不同的desc值如行号、循环序号区分输出便于与代码点对应。配合 shape_info 使用对 Global Memory 的输入张量传入真实 shape可得到按维度组织的可读输出对无 shape 需求或一维数据可不传。仅用于调测阶段dump_tensor 会显著影响算子实际运行性能正式发布前应移除相关调用。【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/18 21:13:03

球面邻域匹配度:量化打车难的时空诊断模型

简介:本资源是一份面向数学建模初学者与竞赛参与者的实战型分析报告,聚焦“互联网”背景下城市出租车资源配置优化这一典型交通管理问题,旨在通过数据建模解决“打车难”这一现实痛点。报告基于2015年成都真实时空数据,构建了以“…

2026/9/18 21:13:03

变压器绕组变形试验详解:从FRA曲线到Python量化诊断

简介:变压器绕组变形试验培训PPT课件是一份面向变电检修、运维及电气试验人员的专业培训资源,针对110kV及以上电力变压器绕组变形检测方法进行了系统梳理。包内共1个PPT,单份课件体积仅707KB,方便直接下载使用。课件共37页&#x…

2026/9/18 21:13:03

RAG系统工程实战:从检索增强到可信可溯的生产级落地

1. 这不是“加个检索”那么简单:RAG早已脱离玩具阶段,进入系统工程深水区你搜“RAG实战”,刷出来的90%内容还在教你怎么用LangChain加载PDF、调个OpenAI API、跑通一个能回答“公司年报里提到多少次‘数字化转型’”的demo。这就像十年前教人…

2026/9/18 21:13:03

中国地面气候日值数据集V3.0处理指南:缺测值与格式陷阱详解

干过中国地面气候日值数据集(V3.0)的人,多少都经历过这种崩溃瞬间:明明从数据网下载了标准化产品,跑出来的气温曲线却直接飙到三千多摄氏度,降水序列里无缘无故出现一条四位数毫米的“极端暴雨”。我最早处理这批数据的时候&#…

2026/9/18 21:08:03

企业数智库建设:四层数据链路、KPI规则与知识图谱落地

简介:面向企业高层管理者、技术负责人与数字化项目骨干的《企业数智库建设指南》PDF文档,聚焦知识驱动的智能交互如何提升运营效率与决策科学性。内容从数智库内核与实现路径切入,梳理信息化提供客观数据、数字化构建实时业务模型、智能化借助…

2026/9/18 14:13:01

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

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

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

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

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

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
免费获取方案
咨询二维码