当前位置: 首页 > article >正文

CANN图像算子双三次上采样反向

aclnnUpsampleBicubic2dBackward【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv 查看源码产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品√功能说明接口功能aclnnUpsampleBicubic2d的反向传播。如果输入张量的shape为(N, C, H, W)则输出张量的shape为(N, C, inputSize[2], inputSize[3])。计算公式对于一个二维插值点$(N, C, h, w)$插值$gradInput(N, C, h, w)$可以表示为$$ {gradInput(N, C, h, w)}\sum_{i0}^{3}\sum_{j0}^{3}{W(i, j)}*{f(h_i, w_j)} $$$$ scaleH \begin{cases} (inputSize[2]-1) / (outputSize[0]-1) alignCornerstrue \ 1 / scalesH alignCornersfalsescalesH0\ inputSize[2] / outputSize[0] otherwise \end{cases} $$$$ scaleW \begin{cases} (inputSize[3]-1) / (outputSize[1]-1) alignCornerstrue \ 1 / scalesW alignCornersfalsescalesW0\ inputSize[3] / outputSize[1] otherwise \end{cases} $$其中i和j是$W(i, j)$的索引变量。$f(h_i, w_j)$是gradOut在$(h_i, w_j)$的像素值。$W(i, j)$是双三次抗锯齿插值的权重定义为$$ W(d) \begin{cases} (a2)|d|^3-(a3)|d|^21 |d|\leq1 \ a|d|^3-5a|d|^28a|d|-4a 1|d|2 \ 0 otherwise \end{cases} $$其中$a-0.75$$d |(h, w) - (h_i, w_j)|$函数原型每个算子分为两段式接口必须先调用“aclnnUpsampleBicubic2dBackwardGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小再调用“aclnnUpsampleBicubic2dBackward”接口执行计算。aclnnStatus aclnnUpsampleBicubic2dBackwardGetWorkspaceSize( const aclTensor* gradOut, const aclIntArray* outputSize, const aclIntArray* inputSize, const bool alignCorners, double scalesH, double scalesW, aclTensor* gradInput, uint64_t* workspaceSize, aclOpExecutor** executor)aclnnStatus aclnnUpsampleBicubic2dBackward( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)aclnnUpsampleBicubic2dBackwardGetWorkspaceSize参数说明参数名输入/输出描述使用说明数据类型数据格式维度(shape)非连续TensorgradOutaclTensor*输入表示反向计算的梯度Tensor对应公式描述中的gradOut。不支持空Tensor。数据类型与gradInput一致。当数据格式为ND时默认按照NCHW格式处理。gradOut的所有维度取值均小于等于(2^31-1)。FLOAT32、FLOAT16、BFLOAT16NCHW、ND、NHWC4√outputSizeaclIntArray*输入表示输入gradOut在H和W维度上的空间大小。对应公式中的outputSize。size为2且各元素均大于零。INT64---inputSizeaclIntArray*输入表示输出gradInput分别在N、C、H、W或N、H、W、C维度上的空间大小。对应公式中的inputSize。size为4且各元素均大于零。INT64---alignCornersbool输入决定是否对齐角像素点对应公式中的alignCorners。如果为True则输入和输出张量的角像素点会被对齐否则不对齐。----scalesHdouble输入表示输出gradInput的height维度乘数对应公式中的scalesH。-----scalesWdouble输入表示输出gradInput的width维度乘数对应公式中的scalesW。-----gradInputaclTensor*输出表示反向计算的输出张量对应公式中的gradInput。不支持空Tensor。数据类型、数据格式与gradOut保持一致。shape的N轴和C轴与gradOut保持一致。gradInput的所有维度取值均小于等于(2^31-1)。FLOAT32、FLOAT16、BFLOAT16NCHW、ND、NHWC4√workspaceSizeuint64_t*输出返回需要在Device侧申请的workspace大小。-----executoraclOpExecutor**输出返回op执行器包含了算子计算流程。-----Atlas 训练系列产品 参数gradOut、gradInput的数据类型不支持BFLOAT16。参数gradOut、gradInput的数据格式不支持NHWC。Atlas A2 训练系列产品/Atlas A2 推理系列产品 、 Atlas A3 训练系列产品/Atlas A3 推理系列产品 参数gradOut、gradInput的数据格式不支持NHWC。返回值aclnnStatus返回状态码具体参见aclnn返回码。第一段接口完成入参校验出现以下场景时报错返回码错误码描述ACLNN_ERR_PARAM_NULLPTR161001传入的gradOut、outputSize、inputSize或gradInput是空指针。ACLNN_ERR_PARAM_INVALID161002gradOut的数据类型和数据格式不在支持的范围内。gradOut和gradInput的数据类型不一致。gradOut的维度不为4维。outputSize的size不等于2。outputSize的某个元素值小于1。inputSize的size不等于4。inputSize的某个元素值小于1。gradOut与inputSize在N、C维度上的size不同。gradOut在H、W维度上的size与outputSize[0]和outputSize[1]不一致。gradOut和gradInput的N/C轴的维度大小不相等。gradOut和gradInput的数据格式不在支持的范围之内。aclnnUpsampleBicubic2dBackward参数说明参数名输入/输出描述workspace输入在Device侧申请的workspace内存地址。workspaceSize输入在Device侧申请的workspace大小由第一段接口aclnnUpsampleBicubic2dBackwardGetWorkspaceSize获取。executor输入op执行器包含了算子计算流程。stream输入指定执行任务的Stream。返回值aclnnStatus返回状态码具体参见aclnn返回码。约束说明参数inputSize、outputSize、scalesH、scalesW需要满足如下约束$$ outputSize_H floor(inputSize_H * scalesH) $$$$ outputSize_W floor(inputSize_W * scalesW) $$确定性计算aclnnUpsampleBicubic2dBackward默认非确定性实现支持通过aclrtCtxSetSysParamOpt开启确定性。当满足如下条件时不支持确定性计算$inputSize_W$ 130000$inputSize_H$/$outputSize_H$ 50$inputSize_W$/$outputSize_W$ 50 $inputSize_N$ * $inputSize_C$ * $inputSize_H$ $inputSize_W$ * 0.5$inputSize_H$/$outputSize_H$ 0.02 $inputSize_W$/$outputSize_W$ 0.02 $inputSize_N$ * $inputSize_C$ * $inputSize_H$ $inputSize_W$ * 10000调用示例示例代码如下仅供参考具体编译和执行过程请参考编译与运行样例。#include iostream #include vector #include acl/acl.h #include aclnnop/aclnn_upsample_bicubic_2d_backward.h #define CHECK_RET(cond, return_expr) \ do { \ if (!(cond)) { \ return_expr; \ } \ } while (0) #define LOG_PRINT(message, ...) \ do { \ printf(message, ##__VA_ARGS__); \ } while (0) int64_t GetShapeSize(const std::vectorint64_t shape) { int64_t shapeSize 1; for (auto i : shape) { shapeSize * i; } return shapeSize; } int Init(int32_t deviceId, aclrtStream *stream) { // 固定写法资源初始化 auto ret aclInit(nullptr); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclInit failed. ERROR: %d\n, ret); return ret); ret aclrtSetDevice(deviceId); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSetDevice failed. ERROR: %d\n, ret); return ret); ret aclrtCreateStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtCreateStream failed. ERROR: %d\n, ret); return ret); return 0; } template typename T int CreateAclTensor(const std::vectorT hostData, const std::vectorint64_t shape, void **deviceAddr, aclDataType dataType, aclTensor **tensor) { auto size GetShapeSize(shape) * sizeof(T); // 调用aclrtMalloc申请device侧内存 auto ret aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMalloc failed. ERROR: %d\n, ret); return ret); // 调用aclrtMemcpy将host侧数据拷贝到device侧内存上 ret aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMemcpy failed. ERROR: %d\n, ret); return ret); // 计算连续tensor的strides std::vectorint64_t strides(shape.size(), 1); for (int64_t i shape.size() - 2; i 0; i--) { strides[i] shape[i 1] * strides[i 1]; } // 调用aclCreateTensor接口创建aclTensor *tensor aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_NCHW, shape.data(), shape.size(), *deviceAddr); return 0; } int main() { // 1. 固定写法device/stream初始化参考acl API手册 // 根据自己的实际device填写deviceId int32_t deviceId 0; aclrtStream stream; auto ret Init(deviceId, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(Init acl failed. ERROR: %d\n, ret); return ret); // 2. 构造输入与输出需要根据API的接口自定义构造 std::vectorint64_t selfShape {1, 1, 2, 2}; std::vectorint64_t outShape {1, 1, 3, 3}; void *selfDeviceAddr nullptr; void *outDeviceAddr nullptr; aclTensor *self nullptr; aclTensor *out nullptr; std::vectorfloat selfHostData {1, 2, 3, 4.1}; std::vectorfloat outHostData {0, 0, 0, 0, 0, 0, 0, 0, 0}; // 创建self aclTensor ret CreateAclTensor(selfHostData, selfShape, selfDeviceAddr, aclDataType::ACL_FLOAT, self); CHECK_RET(ret ACL_SUCCESS, return ret); // 创建out aclTensor ret CreateAclTensor(outHostData, outShape, outDeviceAddr, aclDataType::ACL_FLOAT, out); CHECK_RET(ret ACL_SUCCESS, return ret); std::vectorint64_t outArraySize {2, 2}; const aclIntArray *outputSize aclCreateIntArray(outArraySize.data(), outArraySize.size()); CHECK_RET(outputSize ! nullptr, return ACL_ERROR_INTERNAL_ERROR); std::vectorint64_t inputArraySize {1, 1, 3, 3}; const aclIntArray *inputSize aclCreateIntArray(inputArraySize.data(), inputArraySize.size()); CHECK_RET(inputSize ! nullptr, return ACL_ERROR_INTERNAL_ERROR); // 3. 调用CANN算子库API需要修改为具体的Api名称 uint64_t workspaceSize 0; aclOpExecutor *executor; // 调用aclnnUpsampleBicubic2dBackward第一段接口 ret aclnnUpsampleBicubic2dBackwardGetWorkspaceSize( self, outputSize, inputSize, 1, 1.1, 1.1, out, workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnUpsampleBicubic2dBackwardGetWorkspaceSize failed. ERROR: %d\n, ret); return ret); // 根据第一段接口计算出的workspaceSize申请device内存 void *workspaceAddr nullptr; if (workspaceSize 0) { ret aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); return ret); } // 调用aclnnUpsampleBicubic2dBackward第二段接口 ret aclnnUpsampleBicubic2dBackward(workspaceAddr, workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnUpsampleBicubic2dBackward failed. ERROR: %d\n, ret); return ret); // 4. 固定写法同步等待任务执行结束 ret aclrtSynchronizeStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSynchronizeStream failed. ERROR: %d\n, ret); return ret); // 5. 获取输出的值将device侧内存上的结果拷贝至host侧需要根据具体API的接口定义修改 auto size GetShapeSize(outShape); std::vectorfloat resultData(size, 0); ret aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), outDeviceAddr, size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(copy result from device to host failed. ERROR: %d\n, ret); return ret); for (int64_t i 0; i size; i) { LOG_PRINT(result[%ld] is: %f\n, i, resultData[i]); } // 6. 释放aclTensor需要根据具体API的接口定义修改 aclDestroyTensor(self); aclDestroyTensor(out); aclDestroyIntArray(outputSize); aclDestroyIntArray(inputSize); // 7. 释放device资源需要根据具体API的接口定义修改 aclrtFree(selfDeviceAddr); aclrtFree(outDeviceAddr); if (workspaceSize 0) { aclrtFree(workspaceAddr); } aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

CANN图像算子双三次上采样反向

aclnnUpsampleBicubic2dBackward 【免费下载链接】ops-cv 本项目是CANN提供的图像处理、目标检测相关的算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-cv 📄 查看源码 产品支持情况 产品是否支持 Ascend 950PR/Asc…...

AI Agent时代,向量数据库的角色正在悄然重构

在构建复杂多步Agent工作流的生产环境中,我最近反复踩到一个坑:模型能生成规划,工具调用也顺畅,但执行几轮后决策就开始漂移,自我纠正能力迅速衰减。日志一查,问题出在检索层——它还是那个经典RAG的“一次…...

大模型对齐技术:从RLHF到DPO的演进与实践

1. 大模型对齐技术发展脉络大模型对齐(Alignment)技术是确保AI系统行为与人类价值观和意图保持一致的关键领域。过去几年里,我们见证了从基于强化学习的RLHF方法到更高效直接的DPO技术的演进过程。这种转变不仅仅是技术路线的优化&#xff0c…...

使用 Taotoken 后 API 调用延迟与稳定性在实际开发中的体感观察

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Taotoken 后 API 调用延迟与稳定性在实际开发中的体感观察 在将大模型能力集成到应用中的开发过程中,API 调用的响…...

extract-video-ppt:从视频中智能提取PPT内容的终极解决方案

extract-video-ppt:从视频中智能提取PPT内容的终极解决方案 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 在数字化学习与知识传播的时代,视频已成为信息传递…...

AI文本检测系统性能评估实战:从混淆矩阵到ROC曲线的完整指南

1. 项目概述:为什么我们需要评估AI文本检测系统?最近在做一个关于AI生成文本检测的项目,和几个同行交流时发现,大家普遍存在一个误区:模型训练出来,看到测试集上的准确率(Accuracy)达…...

Speech-AI-Forge:模块化语音AI工具链,整合Whisper与VITS快速构建应用

1. 项目概述:当AI学会“说话”,我们能做什么? 最近在GitHub上看到一个挺有意思的项目,叫“Speech-AI-Forge”。光看名字,你可能会觉得这又是一个关于语音识别的老生常谈。但当我真正点进去,把代码拉下来跑…...

快速学C语言——第 3 章:变量与数据类型

第 3 章:变量与数据类型 ​ 在编程世界中,程序需要处理各种数据,比如一个人的年龄、一件商品的价格,或者一个单词。 ​ 为了在程序中存储和操作这些数据,我们需要用到变量和数据类型。它们是构建程序逻辑…...

Hermes Agent框架接入Taotoken自定义模型提供方的配置要点

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Hermes Agent框架接入Taotoken自定义模型提供方的配置要点 Hermes Agent 是一个流行的智能体开发框架,它允许开发者灵活…...

ChatGPT与MidJourney协同:AI辅助艺术创作实战工作流

1. 项目概述:当艺术创作遇上AI工具作为一名在创意行业摸爬滚打了十多年的从业者,我亲眼见证了无数艺术家、设计师和内容创作者在某个深夜对着空白画布或闪烁的光标,陷入那种熟悉的、令人窒息的“创作瓶颈”。灵感枯竭、风格固化、效率低下&am…...

开源量化框架trading-strategy:DeFi链上策略开发与回测实战指南

1. 项目概述与核心价值最近在量化交易和算法策略开发的圈子里,一个名为tradingstrategy-ai/trading-strategy的开源项目热度持续攀升。作为一名在金融科技和自动化交易领域摸爬滚打了十多年的老兵,我习惯性地会去审视每一个新出现的“明星项目”&#xf…...

将小米TTS封装为OpenAI风格API:实现离线高质量语音合成

1. 项目概述:从“小爱同学”到通用语音合成最近在折腾智能家居和语音交互项目时,我遇到了一个挺有意思的需求:想把小米设备上那个熟悉的“小爱同学”语音,集成到我自己的应用里。你可能也注意到了,像“小爱同学”这样的…...

CipherOcto:去中心化AI基础设施协议架构解析与实践指南

1. 项目概述:从中心化到去中心化的AI基础设施革命如果你和我一样,在过去几年里深度使用过各种AI助手,从ChatGPT到Claude,再到各种开源模型,你一定会被一个核心问题困扰:我的数据去哪了?我的计算…...

CANN/CANN CVE ID申请指导书

CVE ID申请指导书 【免费下载链接】community 本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息 项目地址: https://gitcode.com/cann/community 1 目的 为确保CANN开源社区在漏洞披露过程中&#xff0…...

终极指南:5步掌握REFramework,打造专属RE引擎游戏Mod

终极指南:5步掌握REFramework,打造专属RE引擎游戏Mod 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework 想要为《生化危机》…...

本地AI智能体与云端协作平台混合架构部署指南

1. 项目概述:连接本地AI与云端协作的桥梁如果你正在探索如何将本地运行的AI智能体(Agent)与一个集中的云端控制面板连接起来,让团队成员能随时随地通过网页或手机与应用内的多个AI助手对话,那么你很可能已经遇到了一个…...

你的STM32输入捕获测量结果飘忽不定?可能是滤波器与分频器没搞懂(附实测波形分析)

STM32输入捕获测量不稳定的深层解析:滤波器与分频器的黄金组合 实验室里,你盯着屏幕上跳动的PWM测量数值,眉头紧锁——同样的信号源,为什么每次捕获的频率值都不一样?这不是个例,而是许多嵌入式工程师在使用…...

CANN ops-blas Csrot算子

Csrot算子实现 【免费下载链接】ops-blas 本项目是CANN提供的高性能线性代数计算以及轻量化GEMM调用算子库。 项目地址: https://gitcode.com/cann/ops-blas 概述 BLAS Csrot算子实现。 Csrot(复数向量旋转)算子实现了对两个复数向量的平面旋转运算,是BLAS…...

AnolisOS 8.8 服务器到手第一件事:保姆级网卡配置与静态IP设置(含DHCP/静态切换)

AnolisOS 8.8 服务器网络配置全攻略:从基础配置到高级调优 刚拿到一台全新的AnolisOS 8.8服务器时,网络配置往往是首要任务。无论你是将服务器部署在本地数据中心还是云环境中,正确的网络配置都是确保服务器可访问性和后续服务部署的基础。本…...

CANN/ops-tensor贡献指南

贡献指南 【免费下载链接】ops-tensor ops-tensor 是 CANN (Compute Architecture for Neural Networks)算子库中提供张量类计算的基础算子库,采用模块化设计,支持灵活的算子开发和管理。 项目地址: https://gitcode.com/cann/o…...

保姆级教程:用ArcGIS Pro的克里金插值和栅格计算器,搞定水源涵养量评估

从零到精通:ArcGIS Pro水源涵养量评估全流程实战指南 当你第一次在学术论文中看到"水源涵养量评估"这个专业术语时,是否感到无从下手?作为生态规划的基础性工作,准确评估水源涵养能力不仅关系到学术研究的严谨性&#x…...

CANN/ge Format 推导特性分析

Format 推导(Infer Format)特性分析 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型…...

RoboMaster机甲大师赛备赛:如何用STM32+CAN总线精准控制四个大疆3508电机?

RoboMaster机甲大师赛实战:STM32与CAN总线驱动四台大疆3508电机的工程指南 在RoboMaster机甲大师赛中,机器人底盘的运动性能直接决定了战术执行的灵活性和稳定性。四台大疆3508电机通过CAN总线协同工作,需要解决从硬件配置到软件算法的系统工…...

CANN具身智能世界模型指南

cosmos-transfer2.5-2B视频风格转换具身智能世界模型昇腾使用指南 【免费下载链接】cann-recipes-embodied-intelligence 本项目针对具身智能业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-embodied-i…...

别再只盯着原理了!深入MOS管米勒平台,看懂缓启动电路性能优化的关键

深入MOS管米勒平台:缓启动电路性能优化的关键策略 在电源系统设计中,缓启动电路的重要性往往被低估。许多工程师满足于实现基本功能,却忽略了性能优化的深层机理。当面对更快的稳定时间要求或更精确的电流控制需求时,仅理解基础工…...

CANN pi0.5昇腾推理指南

pi0.5机器人VLA大模型昇腾使用指南 【免费下载链接】cann-recipes-embodied-intelligence 本项目针对具身智能业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-embodied-intelligence pi0.5整体介绍…...

CANN/sip批量矩阵向量乘法

CgemvBatched 【免费下载链接】sip 本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。 项目地址: https://gitcode.com/cann/sip 产品支持情况 产品是否支持Atlas 200I/500 A2 推…...

M-LLM 赋能高效视频理解:基于帧选择的优化策略深度解析

随着短视频平台的蓬勃发展,视频数据的爆炸式增长给视频理解带来了巨大的挑战。传统的视频理解方法往往需要处理大量的视频帧,计算成本高昂。为了解决这个问题,研究人员提出了基于 M-LLM (Multimodal Large Language Model) 的视频帧选择策略&…...

Balena Etcher:极致安全的跨平台镜像烧录工具深度解析

Balena Etcher:极致安全的跨平台镜像烧录工具深度解析 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 还在为制作启动盘而烦恼吗?无论是树…...

CANN PTO自动模式总览

auto模式总览 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend p…...