news 2026/5/27 17:58:53

如何理解算子开发中的Shape形状,介绍张量描述符中的形状和数据排布格式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何理解算子开发中的Shape形状,介绍张量描述符中的形状和数据排布格式

在华为算子开发中,形状(Shape)是张量(Tensor)的一个核心属性,用于描述张量在各个维度上的大小。 它以元组或列表的形式表示,例如 (3, 4) 或 (2, 3, 4),其中每个数字对应一个维度的元素个数。

形状的维度数量由元组中元素的个数决定,例如形状 (4, 20, 20, 3) 表示一个四维张量。 在物理意义上,形状定义了数据的布局,例如在图像处理中,形状 (4, 20, 20, 3) 可以解释为包含4张20x20像素的彩色图片(每个像素由3个颜色通道组成)。

在算子开发中,正确理解形状对于实现算子逻辑至关重要,因为它影响数据访问模式和内存布局。 例如,在华为CANN框架中,形状与数据排布格式(如NCHW或NC1HWC0)结合使用,以优化计算性能。

形状(Shape)

张量的形状,以(D0, D1, … ,Dn-1)的形式表示,D0到Dn是任意的正整数。

如形状(3,4)表示第一维有3个元素,第二维有4个元素,(3,4)表示一个3行4列的矩阵数组。

形状的第一个元素对应张量最外层中括号中的元素个数,形状的第二个元素对应张量中从左边开始数第二个中括号中的元素个数,依此类推。例如:

物理含义我们应该怎么理解呢?假设我们有这样一个shape=(4, 20, 20, 3)。

假设有一些照片,每个像素点都由红/绿/蓝3色组成,即shape里面3的含义,照片的宽和高都是20,也就是20*20=400个像素,总共有4张的照片,这就是shape=(4, 20, 20, 3)的物理含义。


如果体现在编程上,可以简单把shape理解为操作Tensor的各层循环,比如我们要对shape=(4, 20, 20, 3)的A tensor进行操作,循环语句如下:

produceA{for(i,0,4){for(j,0,20){for(p,0,20){for(q,0,3){A[((((((i*20)+j)*20)+p)*3)+q)]=a_tensor[((((((i*20)+j)*20)+p)*3)+q)]}}}}}

Shape推导(Shape Inference)

Shape推导是图模式下的核心环节。开发者可以通过两种方式实现:

Follow模式

若输出Shape与某输入Shape完全一致,可使用Follow接口快速表达:

this->Output("y1").ParamType(REQUIRED).Follow("x1",FollowType::SHAPE);

自定义InferShape函数

对于输出Shape与输入Shape存在复杂关系的算子,如Reshape,需编写自定义InferShape函数:

ge::graphStatusInferShapeForReshape(InferShapeContext*context){constgert::Shape*x_shape=context->GetInputShape(0);constgert::Tensor*shape_tensor=context->GetInputTensor(1);gert::Shape*output_shape=context->GetOutputShape(0);if(!x_shape||!shape_tensor||!output_shape)returnge::GRAPH_FAILED;auto reshape_size=static_cast<int32_t>(shape_tensor->GetShapeSize());if(shape_tensor->GetDataType()==ge::DT_INT32){int32_t*reshape_data=shape_tensor->GetData<int32_t>();returnReshapeInferShapeImpl<int32_t>(reshape_data,*x_shape,*output_shape,reshape_size);}else{int64_t*reshape_data=shape_tensor->GetData<int64_t>();returnReshapeInferShapeImpl<int64_t>(reshape_data,*x_shape,*output_shape,reshape_size);}}

数据依赖算子

部分算子在Shape推导时,需要依赖输入的真实值,如Reshape依赖shape输入。此类输入需通过ValueDepend(REQUIRED)声明:

this->Input("shape").ParamType(REQUIRED).ValueDepend(REQUIRED);

动态Shape与ShapeRange推导

有些算子(如Unique)的输出Shape在编译阶段无法确定,必须在执行时才能得出。这时需要ShapeRange推导,用于预估最大输出内存:

ge::graphStatusUniqueInferShapeRangeFunc(gert::InferShapeRangeContext*context){auto x_shape_range=context->GetInputShapeRange(0U);auto y_shape_range=context->GetOutputShapeRange(0U);y_shape_range->GetMax()->SetDim(0,x_shape_range->GetMax()->GetDim(0));y_shape_range->GetMin()->SetDim(0,x_shape_range->GetMin()->GetDim(0));returnge::GRAPH_SUCCESS;}

通过ShapeRange推导,框架可以安全地为动态输出分配内存,保证算子执行的正确性。


昇腾训练营报名链接:
https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro

训练营简介:2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 7:10:21

3D模型生成终极指南:腾讯Hunyuan3D-2mini轻量化技术深度解析

还在为复杂的3D建模软件发愁吗&#xff1f;专业建模师需要花费数小时完成的工作&#xff0c;现在普通人只需输入文字描述&#xff0c;30秒内就能获得完整的3D模型。腾讯最新开源的Hunyuan3D-2mini模型&#xff0c;以仅0.6B的参数规模&#xff0c;实现了前所未有的"轻量高速…

作者头像 李华
网站建设 2026/5/21 0:35:29

Kubernetes Dashboard可视化监控:从架构原理到生产实践

在Kubernetes集群运维中&#xff0c;命令行工具虽然功能强大但学习曲线陡峭&#xff0c;而Dashboard作为官方提供的Web管理界面&#xff0c;通过直观的可视化方式降低了操作门槛。本文将深入解析Dashboard的部署架构、安全认证机制和实际应用场景&#xff0c;帮助您构建可靠的可…

作者头像 李华
网站建设 2026/5/20 21:05:13

基于DWS MCP Server搭建数据分析Agent

本文分享自华为云社区《基于DWS MCP Server搭建数据分析Agent》 1. 前言 MCP&#xff08;Model Context Protocol&#xff09;是由Anthropic于2024年11月提出的开放协议标准&#xff0c;旨在解决大型语言模型与外部系统&#xff08;如数据库、API&#xff09;交互的碎片化问题。…

作者头像 李华
网站建设 2026/5/25 2:00:46

兰州失控车辆证明科技已偷走车辆的控制权,黑客入侵会如何?

兰州失控车辆以115公里时速狂奔4个多小时&#xff0c;直到燃油耗尽才将车辆停下&#xff0c;证明了电子控制系统的不可靠&#xff0c;那么那些已赋予智驾更多控制权的车辆呢&#xff1f;想想都觉得后背发凉&#xff0c;事实证明科技无法为人类提供足够的安全保障&#xff01;在…

作者头像 李华
网站建设 2026/5/28 11:13:00

FaceFusion在虚拟演唱会中的粉丝形象互动应用

FaceFusion在虚拟演唱会中的粉丝形象互动应用如今&#xff0c;一场虚拟演唱会的后台正悄然上演着技术与情感的双重交响。大屏上&#xff0c;成千上万张面孔随着音乐节奏律动——那些不是预设的3D模型&#xff0c;而是真实粉丝的脸&#xff0c;被实时“搬”上了舞台。有人看到自…

作者头像 李华
网站建设 2026/5/28 6:36:21

【DC-AC】使用了H桥MOSFET进行开关,电感器作为滤波器,R和C作为负载目标是产生150V的双极输出和4安培(双极)的电流simulink实现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华