2026/1/2 15:13:35
网站建设
项目流程
快速制作网站,visual studio制作网站开发,长春百度关键词推广,阳江网站制作建设前言
声明#xff1a;本文所有内容均围绕Ascend C算子开发能力认证(中级)相关知识点进行考试心得分享#xff0c;为保障考试的公平性#xff0c;不会对具体的算法进行全文献式说明。
相关知识点是不会落下的#xff0c;所以肯定会对您通过考试有些帮助#xff0c;祝您考…前言声明本文所有内容均围绕Ascend C算子开发能力认证(中级)相关知识点进行考试心得分享为保障考试的公平性不会对具体的算法进行全文献式说明。相关知识点是不会落下的所以肯定会对您通过考试有些帮助祝您考试顺利。主页地址https://www.hiascend.com/edu/certification/detail/34bf904cb410497cb9c582be6c047ff7通过证明后面的文章我会细致的对所有用到的知识点进行说明。目录前言一、考前准备与出题者目考察目的分析1、领取考试券2、考试环境搭建要求3、考试题目说明核心特性为什么这个函数如此重要核心用途Sigmoid 到底解决什么问题4、考试说明5、提交要求二、具体代码分析与代码编写1、AclNNInvocation 项目说明2、SigmoidCustom 项目说明3、理解代码查阅SigmoidCustom\op_host\sigmoid_custom_tiling.h文件查阅SigmoidCustom\op_host\sigmoid_custom.cpp文件查阅SigmoidCustom\op_kernel\sigmoid_custom.cpp文件必要跳坑说明三、校验代码效果1、服务器启动2、编码修改3、编译操作4、校验操作5、提交拿证总结一、考前准备与出题者目考察目的分析从此开始进行逐一的分析总结希望能对大家有所贡献。1、领取考试券https://www.hiascend.com/进入后我们先进入到【用户个人中心】。插条消息社区内的徽章很多可以时时的展示自己的价值多来参与活动吧。点击成长值超链接去领取代金券去领取点击领取领取成功提示点击【个人中心-我的券码】并点击复制的图标按钮。现在我们已经有了免费的券码了。返回到中级页面即可进行考试https://www.hiascend.com/edu/certification/exam/34bf904cb410497cb9c582be6c047ff7能提交5次我这里能看到我提交了2次通过的。2、考试环境搭建要求这里给的是环境的一个说明我这里使用的是华为云-ModelArts-Notebook的部署方式处理的。环境上要有昇腾NPU且CANN版本为8.0.0.beta1。请开发者自行准备。典型场景举例若指导文档中CANN版本号与8.0.0.beta1不一致请自行调整开发者套件Atlas200I DK A2或香橙派部署方式华为云-ModelArts-Notebook 部署方式3、考试题目说明这个不分是对具体的算子工程进行了算法说明Ascend C算子Sigmoid要求编写其对应位置的代码最后完成算子调用的测试。下图中可以看到【点击下载】对应的的项目并且是tar.gz的我们也就知道肯定不是是windows环境跑的了鼠标右键复制一下下载链接备用我这里已经给大家复制出来了不过我看到的具体连接地址是【.zip】也就是说windows也能处理看看。https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/AscendC/SigmoidCustom.zip我们先来理解一下这个算法sigmoid(x) 1/(1 exp(-x))我们先来看这个函数Sigmoid 函数也叫逻辑斯蒂函数Logistic Function是深度学习、机器学习中最基础也最核心的激活函数之一。所以本次中级的考试认证使用Sigmoid 函数是非常恰当的。完整的数学表达式其中 x 是输入可以是任意实数e 是自然常数≈2.71828输出值严格落在 \((0, 1)\) 区间内。核心特性为什么这个函数如此重要先从数学特性理解它的【设计巧思】值域压缩无论输入 x 是还是输出都会被 “挤压” 到(0,1) 之间还有光滑可导、单调递增、中心对称都可以用这个函数来表达。核心用途Sigmoid 到底解决什么问题Sigmoid 的核心价值是将任意实数映射为概率 / 置信度或实现【二分类决策】主要应用在以下场景1、 二分类任务的输出层最核心用途机器学习中二分类问题比如判断邮件是否为垃圾邮件、肿瘤是否为恶性、用户是否点击广告需要输出 属于正类的概率而概率的取值范围必须是[0,1]——Sigmoid 恰好能满足这一需求。案例分析假设模型通过特征计算得到一个原始得分 x比如 x3经过 Sigmoid 转换后这里公式不好拼可以自己复制自行拿去sigma(3)1/(1e^{-3}) \approx 1/(10.0498) \approx 0.9502这表示该样本属于正类的概率为95.02%通常设定阈值如 0.5输出 0.5 → 判定为正类输出 0.5 → 判定为负类输出 0.5 → 需结合业务规则决策。这就是具体的用法至此我们应该能理解到出题的这位老师的良苦用心了。4、考试说明这里的4.1和4.2是对基础结构以及编译操作给了提示。然后是4.3和4.4对过程有效性与最终运行效果的说明。5、提交要求最后一个要求是根据实际选择的服务器来修改对应的value值。根据自己选的服务器来进行具体的修改我这里用的是【Ascend910b】的可以看到我已经对应的修改了。二、具体代码分析与代码编写为了减少服务器的使用时长我们先进行本地的具体代码查阅与编辑最后上传到服务器上再跑一下看看是否能通过。我们随便找个开发工具打开看看。这基本就了解了然后我们具体看看。1、AclNNInvocation 项目说明官方说明AclNNInvocation是一个基于华为昇腾神经网络接口的算子测试和调用项目。该项目主要用于调用和验证自定义算子的功能正确性和计算精度。确认是要校验我们代码是否正确的项目了下面是对应的层级结构。AclNNInvocation/ ├── inc/ # 头文件目录 │ ├── common.h # 通用工具函数声明 │ ├── op_runner.h # 算子运行器类定义 │ └── operator_desc.h # 算子描述结构体定义 ├── src/ # 源文件目录 │ ├── main.cpp # 主程序入口 │ ├── op_runner.cpp # 算子运行器实现 │ ├── operator_desc.cpp # 算子描述实现 │ └── common.cpp # 通用工具函数实现 ├── scripts/ # 脚本目录 │ ├── acl.json # ACL 配置文件用于 dump 或 profiling │ ├── gen_data.py # 生成测试数据和真值数据 │ └── verify_result.py # 验证计算结果精度 ├── input/ # 输入数据目录 ├── output/ # 输出数据目录 └── run.sh # 主运行脚本我查看了main.cpp 的代码下面的对应的函数说明。InitResource(): 初始化 ACL 环境设置设备CreateOpDesc(): 创建算子描述定义输入输出张量的形状、数据类型和格式SetInputData(): 从文件加载输入数据RunOp(): 创建算子运行器并执行算子ProcessOutputData(): 将计算结果保存到文件2、SigmoidCustom 项目说明官方说明SigmoidCustom是一个基于华为昇腾AI 处理器的自定义算子开发项目。该项目实现了自定义的 Sigmoid 激活函数算子包含完整的算子开发框架支持在昇腾设备上高效执行并可集成到 TensorFlow 等深度学习框架中使用。既然说是自定义的那么就代表这是我们要进行编译的项目项目结构是SigmoidCustom/ ├── op_kernel/ # 算子内核实现设备端代码 │ ├── sigmoid_custom.cpp # Sigmoid 算子的核心计算实现AscendC │ └── CMakeLists.txt # 内核编译配置 ├── op_host/ # 算子主机端代码 │ ├── sigmoid_custom.cpp # 算子注册、形状推理、数据类型推理、Tiling 函数 │ ├── sigmoid_custom_tiling.h # Tiling 数据结构定义 │ └── CMakeLists.txt # 主机端编译配置 ├── framework/ # 框架集成代码 │ └── tf_plugin/ # TensorFlow 插件 │ ├── tensorflow_sigmoid_custom_plugin.cc # TensorFlow 算子注册 │ └── CMakeLists.txt ├── cmake/ # CMake 构建脚本和工具 │ ├── config.cmake # 构建配置 │ ├── func.cmake # 构建函数 │ ├── intf.cmake # 接口定义 │ ├── makeself.cmake # 打包配置 │ └── util/ # 构建工具脚本Python ├── scripts/ # 安装和升级脚本 │ ├── install.sh # 算子安装脚本 │ ├── upgrade.sh # 算子升级脚本 │ └── help.info # 帮助信息 ├── CMakeLists.txt # 主构建文件 ├── CMakePresets.json # CMake 预设配置 └── build.sh # 构建脚本我们要对op_kernel下的sigmoid_custom.cpp与op_host下的sigmoid_custom.cpp和sigmoid_custom_tiling.h进行编码。这里我们还需要修改CMakePresets.json文件中的配置这里直接改修行了后面我就不再重复。配置文件改完后对应的代码中也需要匹配。3、理解代码查阅SigmoidCustom\op_host\sigmoid_custom_tiling.h文件这里我先给个流程默认的代码情况给出的是让考生自行定义tiling结构体成员变量。我们需要定义 Tiling 数据结构 的两个成员变量用于在昇腾设备上进行数据分块Tiling计算。// 数据总长度元素总数 TILING_DATA_FIELD_DEF(uint32_t, totalLength); // 分块数量将数据分成多少块处理 TILING_DATA_FIELD_DEF(uint32_t, tileNum);totalLength: 输入张量的总元素数例如[8, 2048] 16384tileNum: 数据分块数量通常等于 BLOCK_DIM8 个 AI Core作用: 优化大规模数据的并行计算将数据分成多个块由不同的 AI Core 并行处理。查阅SigmoidCustom\op_host\sigmoid_custom.cpp文件太长了我就弄成GIF的了。那么对应的代码理论上您应该已经可以搞出来了。1、计算输入张量的总元素数量Total Length// GetInputShape(0): 获取第 0 个输入的形状信息。// GetOriginShape(): 获取原始形状不考虑动态形状。// GetShapeSize(): 计算形状的总元素数量例如 [8, 2048] 16384。我们这里定义一个context。uint32_t totalLength context-GetInputShape(0)-GetOriginShape().GetShapeSize();2、设置块维度到上下文告诉框架使用多少个 AI Core 进行并行计算根据const uint32_t BLOCK_DIM 8;指定的AI Core 进行具体计算。context-SetBlockDim(BLOCK_DIM);3、设置 Tiling 数据中的总长度字段这个值会被传递到设备端内核代码用于计算每个分块的大小和位置。tiling.set_totalLength(totalLength);4、设置 Tiling 数据中的分块数量字段这个值会被传递到设备端内核代码用于确定循环次数loopCount。tiling.set_tileNum(TILE_NUM);5、将 Tiling 数据保存到缓冲区中GetRawTilingData()-GetData(): 获取原始 Tiling 数据的缓冲区指针。GetRawTilingData()-GetCapacity(): 获取缓冲区的容量大小。SaveToBuffer(): 将 tiling 结构体的数据序列化到缓冲区供设备端内核读取。tiling.SaveToBuffer(context-GetRawTilingData()-GetData(), context-GetRawTilingData()-GetCapacity());6、设置实际使用的 Tiling 数据大小GetDataSize(): 获取序列化后的 Tiling 数据实际大小。SetDataSize(): 告诉框架实际使用了多少字节的 Tiling 数据。这个大小会被传递给设备端用于正确读取 Tiling 数据。context-GetRawTilingData()-SetDataSize(tiling.GetDataSize());7、获取工作空间Workspace大小数组的指针GetWorkspaceSizes(1): 申请 1 个工作空间大小配置项。Workspace 是算子执行时需要的临时内存空间用于存储中间计算结果。size_t *currentWorkspace context-GetWorkspaceSizes(1);8、设置工作空间大小设置工作空间大小为 0表示 Sigmoid 算子不需要额外的临时内存空间。Sigmoid 是逐元素计算可以直接将结果写入输出不需要中间缓冲区。currentWorkspace[0] 0;9、返回成功状态表示 Tiling 计算完成GRAPH_SUCCESS 表示图编译成功可以继续后续的编译和执行流程。return ge::GRAPH_SUCCESS;查阅SigmoidCustom\op_kernel\sigmoid_custom.cpp文件就这个文件需要补充的多但是逻辑上我们是清楚的就是具体搞算法的过程呗。具体的写之前我们再回顾一下整个关键主键应用层: AclNNInvocation 项目用于测试和调用自定义算子。框架层: TensorFlow 插件和 GE 图引擎负责算子注册和图形化执行。算子层: 算子定义、形状推理、Tiling 计算等主机端逻辑。运行时层: ACL 运行时和调度器负责任务调度和资源管理。设备层: 内核代码和 AI Core执行实际的计算任务。注块维度不能为零分块数量不能为零函数理解sigmoid_custom.cpp ├─ 1. 头文件和常量定义 ├─ 2. KernelSigmoid 类 │ ├─ Init() 函数准备工作 │ ├─ Process() 函数执行计算 │ ├─ CopyIn() 函数复制输入数据 │ ├─ Compute() 函数执行 Sigmoid 计算 │ └─ CopyOut() 函数复制输出数据 └─ 3. 内核入口函数整体逻辑第一步理解整体结构Init() → Process() → CopyIn/Compute/CopyOut第二步理解数据分块totalLength → blockLength → tileLength第三步理解内存操作全局内存 ↔ 本地缓冲区第四步理解计算过程Sigmoid 的数学公式和代码实现第五步理解优化机制双缓冲、并行化、流水线//最终的处理 op.Init(x, y, tiling_data.totalLength, tiling_data.tileNum); op.Process();必要跳坑说明我们在处理最后的除法时要使用的是【AscendC::Div】函数这点非常的重要不要想着直接取反就行那是完全不行的是个大坑要直接跳过去我尝试了下面是错误的效果。逻辑和坑都说明白了自己需要重补一下代码哦。三、校验代码效果这里需要先启动服务器然后再进行基础环境搭建编译完成后最后去校验即可。1、服务器启动我使用的是华为云的ModelArts的Notebook来操作的这里要注意只有贵阳一有哦。选完启动即可启动时间长一点。创建个【Terminal】运行各类命令。在根目录进行操作即可。通过下面的命令直接下载到服务器上即可。wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/AscendC/SigmoidCustom.zip下载完毕后使用下面命令解压即可。unzip SigmoidCustom.zip我们已经修改了对应的代码把已经修改过的代码进行替换掉服务器上的文件即可。我们环境是ascend910b的所以处理一下再次重申哦。改完效果2、编码修改SigmoidCustom\op_host\sigmoid_custom_tiling.hSigmoidCustom\op_host\sigmoid_custom.cppSigmoidCustom\op_kernel\sigmoid_custom.cpp代码都需要自己补充我的逻辑给的很清晰了。完成后我们就要去编译工作了。3、编译操作编译之前一定要运行一下给予对应的运行权限。给权限的目录是SigmoidCustom/SigmoidCustom/build_out给权限的命令chmod x -R *4、校验操作在SigmoidCustom/AclNNInvocation文件夹下校验校验命令。bash run.sh我们把文件夹压缩一下提交即可。zip -r SigmoidCustom.zip SigmoidCustom5、提交拿证提交通过会给提示我们可以看到。第二天拿证总结本文分享了AscendC算子开发能力认证(中级)考试的经验心得。考试围绕Sigmoid算子开发展开详细介绍了考前准备、考试环境搭建、题目分析和代码编写过程。重点解析了Sigmoid函数的数学特性、核心用途以及具体实现方法包括Tiling数据结构定义、主机端和设备端代码编写要点。文章还提供了编译运行和验证的具体步骤并提醒注意使用AscendC::Div函数等关键细节。最后说明了提交方式和证书获取流程为考生顺利通过认证提供了实用指导希望能为大家提供到帮助。2025年昇腾CANN训练营第二季基于CANN开源开放全场景推出0基础入门系列、码力全开特辑、开发者案例等专题课程助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证即可领取精美证书完成社区任务更有机会赢取华为手机平板、开发板等大奖。报名链接https://www.hiascend.com/developer/activities/cann20252社区地址https://www.hiascend.com/developer