news 2026/9/10 6:12:01

CANN/ge:执行动态Shape算子示例代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/ge:执行动态Shape算子示例代码

执行动态Shape算子示例代码

【免费下载链接】geGE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力,并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge

本节介绍基于单算子模型执行的方式调用动态Shape算子的关键接口、示例代码。

基本原理

对于支持动态Shape的算子:

  • 如果算子输出Shape明确时,该类算子执行的基本流程与固定Shape算子执行类似,接口调用流程请参见单算子模型执行总体说明,执行固定Shape算子的示例代码请参见执行固定Shape算子示例代码。

  • 如果无法明确算子的输出Shape时,在调用aclopExecuteV2接口前,需用户调用aclopInferShape接口、aclGetTensorDescNumDims接口、aclGetTensorDescDimV2接口、aclGetTensorDescDimRange等接口,推导或预估算子的输出Shape,作为算子执行接口aclopExecuteV2的输入。

    aclopInferShape接口处,算子输入tensor数据的内存必须根据应用运行模式来确定,应用运行在Host时,此处需申请Host上的内存;应用运行在Device时,此处需申请Device上的内存。

示例代码

以下是关键步骤的代码示例,不能直接拷贝编译运行,仅供参考。调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。

// ...... const char *opType; int numInputs; aclTensorDesc *inputDesc[2]; aclDataBuffer *inputs[2]; int numOutputs; aclTensorDesc *outputDesc[1]; aclopAttr *attr; aclError ret = aclopInferShape(opType, numInputs, inputDesc, inputs, numOutputs, outputDesc, attr); std::vector<std::vector<int64_t>> tensorDims; // inferShape之后的输出tensor的Shape // 循环算子的每一个输出,推导或预估Shape值: for (int index = 0; index < numOutputs; ++index) { std::vector<int64_t> dimSize; // 表示执行算子时,输出的shape size_t dimNums = aclGetTensorDescNumDims(outputDesc[index]); // 表示动态Shape场景下维度个数未知,该场景预留 if (dimNums == ACL_UNKNOWN_RANK) { // 由用户预估最大Shape值max shape dimSize.push_back(max_shape); } else { for (size_t i = 0; i < dimNums; ++i) { int64_t dim; ret = aclGetTensorDescDimV2(outputDesc[index], i, &dim); // 表示动态Shape场景下维度值是动态的 if(dim == -1) { int64_t dimRange[2]; // 获取Shape范围,使用该范围中的Shape最大值来构造输出tensorDesc,作为aclopExecuteV2的输入 ret = aclGetTensorDescDimRange(outputDesc[index], i, 2, dimRange); dim = dimRange[1]; } dimSize.push_back(dim); } } tensorDims.push_back(dimSize); } // 构造算子输入tensorDesc和输入tensor,作为aclopExecuteV2的输入 aclTensorDesc *inputDescNew[2]; aclDataBuffer *inputsNew[2]; aclDataBuffer *outputsNew[1]; // 以上给出了执行算子时输出的Shape, 根据tensorDims中的dims构造输出tensorDesc(即outputDescNew参数值), 用于调用aclopExecuteV2 ret = aclopExecuteV2(opType, numInputs, inputDescNew, inputsNew, numOutputs, outputDescNew, outputsNew, attr, stream); // 针对上面用户预估Shape值以及使用Shape范围中的最大Shape的场景,在算子执行结束后,需增加下面的调用,获取准确的Shape: // for 循环每一个输出的tensorDesc std::vector<std::vector<int64_t>> outTensorDims; // 准确的输出tensorShape for (int index = 0; index < numOutputs; ++index) { std::vector<int64_t> dimSize; int dimNums = aclGetTensorDescNumDims(outputDescNew[index]); for (int i = 0; i < dimNums; i++){ int64_t dim; ret = aclGetTensorDescDimV2(outputDescNew[index], i, &dim); dimSize.push_back(dim); } outTensorDims.push_back(dimSize); } // ......

【免费下载链接】geGE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力,并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

小波变换与梯度下降结合:脉冲噪声迭代去噪原理与Python实现

脉冲噪声这玩意儿&#xff0c;在真实图像处理里远比教科书上描述的烦人。教科书爱拿高斯噪声举例子&#xff0c;可工程上遇到的往往是传感器坏点、传输信道误码、存储介质损伤带来的椒盐噪点——画面上随机位置突然冒一两个纯白或纯黑的像素&#xff0c;密度高了以后整张图跟筛…

作者头像 李华
网站建设 2026/9/10 6:07:40

AI文本去味实战:从机器味到真人感的humanizer改写技巧

最近手头有个挺有意思的活儿&#xff1a;帮几篇AI生成的深度稿做“人性化”改造。甲方给的需求就一句话——“别太AI”&#xff0c;但这个要求其实相当考验人。因为AI文本的“机器味”几乎是从骨子里渗出来的&#xff0c;不是改几个词就能掩盖的。这段时间做下来&#xff0c;我…

作者头像 李华
网站建设 2026/9/10 6:07:18

hermes-agent实战指南:从架构拆解到落地搭建个人智能体

最近一两个月&#xff0c;我一直被一个问题困扰&#xff1a;手头的自动化工具越来越多&#xff0c;但每个工具都是孤岛。管 Git 仓库的只管仓库&#xff0c;发通知的只管通知&#xff0c;汇总文档的只会汇总文档&#xff0c;想让它们协作完成一件事&#xff0c;就得自己写一堆胶…

作者头像 李华