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

CANN/ops-cv快速入门指南

快速入门:基于ops-cv仓

【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv

使用须知

本指南旨在帮助您快速上手CANN和ops-cv算子仓的使用。为方便您快速了解算子开发全流程,以AddExample算子为实践对象,算子源码位于ops-cv/examples/add_example,操作流程如下:

  1. 前提条件:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景推荐WebIDE或Docker部署,操作简单。

    说明:WebIDE或Docker环境默认提供最新商发版CANN包;如需体验master分支最新能力,可手动搭建环境。

  2. 编译运行:编译自定义算子包并安装,实现快速调用算子。

  3. 算子开发:通过修改现有算子Kernel,体验开发、编译、验证的完整闭环。

  4. 算子调试:掌握算子打印和性能采集方法。

  5. 算子验证:学习如何修改算子example样例,以验证算子在不同输入下的功能正确性。

一、编译运行

本阶段目的是快速体验项目标准流程,验证环境能否成功进行算子源码编译、打包、安装和运行。

1. 进入项目源码

  • WebIDE环境:

    默认提供最新商发版CANN包配套的项目源码,进入源码目录,${gitCode_id}替换为开发者个人gitCode账号。

    cd /mnt/workspace/gitCode/${gitCode_id}/ops-cv
  • 非WebIDE环境:

    根据release仓库源码与CANN版本配套关系,执行如下命令下载源码,${tag_version}替换为目标分支标签,例如9.0.0。

    git clone -b ${tag_version} https://gitcode.com/cann/ops-cv.git && cd ops-cv

说明:如需切换源码分支版本,请参考如下指导。

  1. 在源码目录执行git branch,查询当前源码版本。
  2. 在源码目录执行git checkout ${tag_version},切换到目标分支源码,注意满足源码与CANN版本配套关系。若源码已存在,执行git pull拉取最新源码。

2. 编译AddExample算子

编译指定的算子,通用编译命令格式:bash build.sh --pkg --soc=<芯片版本> --ops=<算子名>

以AddExample算子为例,编译命令如下:

bash build.sh --pkg --soc=${soc_version} --ops=add_example -j16

${soc_version}设置方法如下:

访问CANN下载中心,根据页面提示复制硬件查询命令,在当前环境中执行,返回芯片ID信息,再回填到官网按Enter键获取产品名,产品名对应的${soc_version}取值如下,请按实际场景传参。

  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:取值为ascend910b
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:取值为ascend910_93
  • Atlas 350 加速卡:取值为ascend950

若提示如下信息,说明编译成功。

Self-extractable archive "cann-ops-cv-custom_linux-${arch}.run" successfully created.

编译成功后,run包存放于项目根目录的build_out目录下。

3. 安装AddExample算子包

./build_out/cann-ops-cv-*linux*.run

AddExample安装在${ASCEND_HOME_PATH}/opp/vendors路径中,${ASCEND_HOME_PATH}表示CANN软件安装目录。

4. 配置环境变量

将自定义算子包的路径加入环境变量,确保运行时能够找到。

export LD_LIBRARY_PATH=${ASCEND_HOME_PATH}/opp/vendors/custom_cv/op_api/lib:${LD_LIBRARY_PATH}

5. 快速验证:运行算子样例

通用的运行命令格式:bash build.sh --run_example <算子名> <运行模式> <包模式>

以AddExample为例,其提供了简单算子样例add_example/examples/test_aclnn_add_example.cpp,运行该样例验证算子功能是否正常。

bash build.sh --run_example add_example eager cust --vendor_name=custom

预期输出:打印算子AddExample的加法计算结果,表明算子已成功部署并正确执行。

add_example first input[0] is: 1.000000, second input[0] is: 1.000000, result[0] is: 2.000000 add_example first input[1] is: 1.000000, second input[1] is: 1.000000, result[1] is: 2.000000 add_example first input[2] is: 1.000000, second input[2] is: 1.000000, result[2] is: 2.000000 add_example first input[3] is: 1.000000, second input[3] is: 1.000000, result[3] is: 2.000000 add_example first input[4] is: 1.000000, second input[4] is: 1.000000, result[4] is: 2.000000 add_example first input[5] is: 1.000000, second input[5] is: 1.000000, result[5] is: 2.000000 add_example first input[6] is: 1.000000, second input[6] is: 1.000000, result[6] is: 2.000000 add_example first input[7] is: 1.000000, second input[7] is: 1.000000, result[7] is: 2.000000 ...

二、算子开发

本阶段目的是对已成功运行的AddExample算子尝试修改核函数代码

1. 修改Kernel实现

找到AddExample算子的核心kernel实现文件ops-cv/examples/add_example/op_kernel/add_example.h,尝试将算子中的Add操作改为Mul操作:

__aicore__ inline void AddExample<T>::Compute(int64_t currentNum) { AscendC::LocalTensor<T> xLocal = inputQueueX.DeQue<T>(); AscendC::LocalTensor<T> yLocal = inputQueueY.DeQue<T>(); AscendC::LocalTensor<T> zLocal = outputQueueZ.AllocTensor<T>(); AscendC::Add(zLocal, xLocal, yLocal, currentNum); outputQueueZ.EnQue<T>(zLocal); inputQueueX.FreeTensor(xLocal); inputQueueY.FreeTensor(yLocal); }

2. 编译与验证

重复编译运行章节中的步骤:

  1. 重新编译

    先回到项目根目录,编译命令如下:

    bash build.sh --pkg --soc=ascend910b --ops=add_example -j16
  2. 重新安装

    ./build_out/cann-ops-cv-*linux*.run
  3. 重新验证

    bash build.sh --run_example add_example eager cust --vendor_name=custom
  4. 成功标志:输出结果变成乘法结果。

    add_example first input[0] is: 1.000000, second input[0] is: 1.000000, result[0] is: 1.000000 add_example first input[1] is: 1.000000, second input[1] is: 1.000000, result[1] is: 1.000000 add_example first input[2] is: 1.000000, second input[2] is: 1.000000, result[2] is: 1.000000 add_example first input[3] is: 1.000000, second input[3] is: 1.000000, result[3] is: 1.000000 add_example first input[4] is: 1.000000, second input[4] is: 1.000000, result[4] is: 1.000000 add_example first input[5] is: 1.000000, second input[5] is: 1.000000, result[5] is: 1.000000 add_example first input[6] is: 1.000000, second input[6] is: 1.000000, result[6] is: 1.000000 add_example first input[7] is: 1.000000, second input[7] is: 1.000000, result[7] is: 1.000000 ...

三、算子调试

本阶段以AddExample为例,在算子中添加打印并采集算子性能数据,以便后续问题分析定位。

1. 打印

算子如果出现执行失败、精度异常等问题,添加打印进行问题分析和定位。

请在examples/add_example/op_kernel/add_example.h中进行代码修改。

  • printf

    该接口支持打印Scalar类型数据,如整数、字符型、布尔型等,详细介绍请参见《Ascend C API》中"算子调测API > printf"。

    blockLength_ = (remainderLength > tilingData->blockFactor) ? tilingData->blockFactor : remainderLength; ubLength_ = tilingData->ubFactor; // 打印当前核计算Block长度 AscendC::PRINTF("Tiling blockLength is %llu\n", blockLength_);
  • DumpTensor

    该接口支持Dump指定Tensor的内容,同时支持打印自定义附加信息,比如当前行号等,详细介绍请参见《Ascend C API》中“算子调测API > DumpTensor”。

    AscendC::LocalTensor<T> xLocal = inputQueueX.DeQue<T>(); AscendC::LocalTensor<T> yLocal = inputQueueY.DeQue<T>(); AscendC::LocalTensor<T> zLocal = outputQueueZ.AllocTensor<T>(); AscendC::Add(zLocal, xLocal, yLocal, currentNum); AscendC::DumpTensor(zLocal, 0, 128); outputQueueZ.EnQue<T>(zLocal);

2. 性能采集

当算子功能验证正确后,可通过msprof工具采集算子性能数据。

  • 生成可执行文件

    调用AddExample算子的example样例,生成可执行文件(test_aclnn_add_example),该文件位于项目ops-cv/build目录。

    bash build.sh --run_example add_example eager cust --vendor_name=custom
  • 采集性能数据

    进入AddExample算子可执行文件目录ops-cv/build/,执行如下命令:

    msprof --application="./test_aclnn_add_example"

采集结果在项目ops-cv/build/目录,msprof命令执行完后会自动解析并导出性能数据结果文件,详细内容请参见msprof。

四、算子验证

本阶段通过修改AddExample算子example样例中的输入数据,验证该算子在多种场景下的功能正确性。

1. 修改测试输入

找到并编辑AddExampleops-cv/examples/add_example/examples/test_aclnn_add_example.cpp,修改输入张量的形状和数值。

修改输入/输出数据:修改输入、输出的shape信息,以及初始化数据,构造相应的输入、输出tensor。

int main() { // ... 初始化代码 ... // === ① 修改selfX的输入 === // 修改前:shape = {32, 4, 4, 4}, 数值全为1 // 修改后:将输入shape改为 {8, 8, 8, 8},并填充不同的测试数据 std::vector<int64_t> selfXShape = {8, 8, 8, 8}; std::vector<float> selfXHostData(4096); // 4096 = 8 * 8 * 8 *8 // 可使用循环填充更有区分度的数据,例如递增序列 for (int i = 0; i < 4096; ++i) { selfXHostData[i] = static_cast<float>(i % 10); // 填充0-9的循环值 } // === ② 参考selfX,同理修改selfY、selfZ的输入 === // ... 后续执行代码 ... }

2. 重新编译并验证

  1. 由于只修改了example测试代码,无需重新编译算子包。

  2. 重新执行验证命令:

    bash build.sh --run_example add_example eager cust --vendor_name=custom
  3. 观察算子输出结果是否符合预期。

结语

体验完上述流程,您已基本完成算子开发过程,如果您想进一步贡献新算子或学习更多高阶开发、调试等技能,请访问本项目README学习进阶教程和贡献指南等。

【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv

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

http://www.jsqmd.com/news/788440/

相关文章:

  • 多模态大模型InternLM-XComposer实战:从部署到创意图像描述生成
  • vbonk/repo-template:一站式代码仓库模板,提升团队协作与项目工程化水平
  • 9. USART 串口协议
  • 如何让微信网页版重新可用?wechat-need-web插件完整安装指南
  • 互联网大厂 Java 求职面试模拟:技术与趣味的较量
  • 专业指南:5步解锁PS4手柄在Windows平台的完整游戏体验
  • WechatDecrypt终极指南:三步快速解密微信聊天记录数据库
  • 开源智能体平台Idun-Agent-Platform:从架构设计到生产部署全解析
  • Arm Musca-B1时钟系统架构与低功耗配置详解
  • 开源产品技能图谱:从能力原子化到个人与团队成长实践
  • 基于MCP协议构建AI联网搜索服务器:WebSearch-MCP部署与实战指南
  • 5分钟搞定B站视频转文字:你的终极免费解决方案
  • 北京外国语大学附属新华外国语学校口碑如何? - mypinpai
  • ARM7TDMI-S存储操作时序与优化实践
  • 3步搞定Windows右键菜单管理:让右键菜单不再臃肿的实用指南
  • 小红书数据采集技术突破:从复杂反爬到高效采集的全栈解决方案
  • 构建AI智能协作空间:事件驱动架构与实时通信实践
  • 终极手柄映射指南:用AntiMicroX让任何游戏都支持手柄操控
  • 本地大模型应用Clippy:复古UI与现代AI的融合实践
  • CANN/tensorflow迭代循环设置API
  • 从零构建个人命令行工具集:基于Node.js与Commander.js的插件化架构实践
  • DeepMesh:基于Transformer与强化学习的点云到高质量网格生成技术详解
  • 3步掌握FunClip智能视频剪辑:为什么选择这款开源工具能让你效率翻倍?
  • 基于Stable Diffusion与AnimateDiff的AI动画生成实战指南
  • 终极指南:3步轻松解锁QQ音乐加密文件,macOS用户的完整解决方案
  • 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-8. 组合模式
  • K8s 核心资源详解(Pod/Deployment/Service 实战)
  • 2026年华铁智能科技性价比排名 - mypinpai
  • B站视频转文字终极指南:3分钟学会用AI高效提取视频内容
  • 火爆分享的AI应用背后,如何用Taotoken实现稳定低成本的API调用