CANN算子开发实战:从动态Shape到测试验证的深度解析

华为CANN StrideSlice算子:深度学习张量切片优化实战 张量切片是深度学习模型部署中的基础操作,直接影响内存访问效率与推理性能。其核心原理是通过begin/end/stride参数控制多维数据的采样范围与步长,在华为CANN架构中更融合了内存布局感知、边界检查融合等硬件级优化。作为AI加速的关键技术,高效的切片操作能提升2倍预处理速度并减少20%显存占用,广泛应用于数据增强、特征图下采样等场景。本文以ResNet50优化为例,详解如何通过StrideSlice算子实现算子融合与内存访问优化,解决实际工程中的形状匹配与性能劣化问题。 阅读详情

摘要:

在现代 AI 应用中,高性能计算和模型迭代速度是决定性的竞争因素。华为 CANN(Compute Architecture for Neural Networks)作为昇腾(Ascend)AI 处理器的核心,其算子(Operator)的性能和灵活性直接影响着整个AI框架的效率。本文将深度剖析 CANN 算子开发的关键流程,重点从固定Shape算子到动态Shape算子的演进出发,详细阐述其实现机理、调试方法、UT/ST(单元/系统)测试验证全流程,并介绍如何使用 msprof 进行性能采集,旨在为 AI 开发者提供一份全面而深入的 CANN 算子开发实战指南。

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

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

声明: 该文仅是为了记录 CANN 训练营的学习过程所用,不参与任何商业用途

一、 引言:为什么动态Shape算子至关重要?

在 AI 模型,特别是 CV 和 NLP 领域,输入的 Shape(如图片分辨率、句子长度)常常是变化的。传统的固定Shape算子在编译时固定了所有维度信息,这意味着每当遇到一个新的输入 Shape,AI 框架就可能需要重新编译、加载一个新的算子二进制文件

这种模式存在两大弊端:

  1. 编译开销大:模型推理或训练前的图编译时间会急剧增加。
  2. 二进制文件臃肿:项目中会产生大量针对不同Shape的二进制文件,导致存储和管理困难。

为了解决这一痛点,动态Shape算子应运而生。其核心思想是将 Shape 信息从“编译时常量”转变为“运行时变量”,通过参数传入核函数(Kernel Function),使单一的算子二进制文件能够处理不同 Shape 的输入数据,极大提升了框架的灵活性和执行效率

在这里插入图片描述

二、 核心变革:从固定Shape到动态Shape的改造

将一个固定 Shape 算子改造为动态 Shape 算子,其本质是将原先硬编码在代码中或作为全局变量的 Shape 信息,转变为通过一个特定结构体在运行时传入。在 CANN TIK C++ 开发中,这个关键的结构体就是 Tiling

1. 关键机制:Tiling结构体

Tiling 结构体是 Host 侧(CPU)与 Device 侧(NPU 核函数)之间传递“切分策略”的桥梁。它通常包含了算子在 NPU 上执行所必需的调度信息。

下面是一个Tiling结构体的示例(在op_host/add_tik2_tiling.h中定义):

// op_host/add_tik2_tiling.h
// BEGIN_TILING_DATA_DEF宏用于定义结构体的开始
BEGIN_TILING_DATA_DEF(AddTik2TilingData)
  // TILING_DATA_FIELD_DEF(变量名, 变量类型)
  TILING_DATA_FIELD_DEF(blockDim, uint32_t)     // 并行计算使用的核数
  TILING_DATA_FIELD_DEF(totalLength, uint32_t)  // 总共需要计算的数据个数
  TILING_DATA_FIELD_DEF(tileNum, uint32_t)      // 每个核上计算数据分块的个数
END_TILING_DATA_DEF(AddTik2TilingData)

2. 固定Shape vs. 动态Shape:实现对比

为了更直观地展示差异,我们用一个表格来总结:

对比维度固定Shape算子 (Fixed Shape)动态Shape算子 (Dynamic Shape)
Shape信息来源编译时常量、全局变量运行时通过 Tiling 结构体参数传入
核函数入参主要是输入/输出数据的指针额外增加 Tiling 结构体指针 (uint8_t* tilingData)
核函数实现循环边界、偏移量计算等直接使用全局常量必须首先解析 tilingData 指针,获取Shape信息后再进行计算
Init 函数逻辑地址区分等可能依赖全局变量调度参数从 Tiling 中获取,常存储在类成员变量中
灵活性低,每个 Shape 需要一个二进制文件高,一个二进制文件支持多种Shape
编译开销高(当 Shape 多变时)低(一次编译,到处运行)

3. 核函数(Kernel)的改造

改造核函数是动态 Shape 的核心

  • 固定Shape实现 (示例):

    注意BLOCK_DIM和TOTAL_LENGTH是全局或宏定义的。

    // op_kernel/add_tik2_kernel_fixed.cpp
    // 全局变量或宏定义
    const uint32_t BLOCK_DIM = 8;
    const uint32_t TOTAL_LENGTH = 1024;
    const uint32_t TILE_NUM = (TOTAL_LENGTH + BLOCK_DIM - 1) / BLOCK_DIM;
    
    extern "C" __global__ __aicore__ void add_tik2_fixed(
        __gm__ uint8_t* x, __gm__ uint8_t* y, __gm__ uint8_t* z) 
    {
        // 直接使用全局常量
        uint32_t loop_max = TILE_NUM; 
        // ... 业务逻辑 ...
    }
    
  • 动态Shape实现 (示例):

    Tiling信息通过 tilingData 指针传入,并在核函数内部首先被解析。

    // op_kernel/add_tik2_kernel_dynamic.cpp
    #include "add_tik2_tiling.h" // 引入Tiling定义
    
    extern "C" __global__ __aicore__ void add_tik2_dynamic(
        __gm__ uint8_t* x, __gm__ uint8_t* y, __gm__ uint8_t* z, 
        __gm__ uint8_t* tilingData) // 关键:Tiling指针作为入参
    {
        // 关键:在核函数内部解析Tiling数据
        GET_TILING_DATA(tiling, tilingData, AddTik2TilingData);
    
        // 使用从Tiling中解析出的变量
        uint32_t loop_max = tiling.tileNum; 
        uint32_t core_id = GetBlockIdx();
        // ... 业务逻辑 ...
    }
    

在这里插入图片描述

三、 算子开发的中枢:Host侧实现与注册

算子不仅仅是 NPU 上的核函数,更需要 Host 侧(CPU)的代码来“管理”它,使其能被 AI 框架(如 TensorFlow, PyTorch)正确调用。这部分工作主要在 op_host/add_tik2.cpp 文件中完成

1. 算子原型注册 (Operator Prototype Registration)

这是算子对外的“接口声明”。它告诉 CANN 框架这个算子叫什么名字、有几个输入(Input)、几个输出(Output)以及它们的名称

// op_host/add_tik2.cpp
#include "ge/ge_op_define.h"

namespace ge {
// 注册算子原型
GE_OPERATOR_STORE_BEGIN(AddTik2, "AddTik2")
  // 注册输入:名称"x",数据类型"DT_FLOAT"
  .Input("x", ge::DT_FLOAT)
  // 注册输入:名称"y",数据类型"DT_FLOAT"
  .Input("y", ge::DT_FLOAT)
  // 注册输出:名称"z",数据类型"DT_FLOAT"
  .Output("z", ge::DT_FLOAT)
GE_OPERATOR_STORE_END(AddTik2)
} // namespace ge

2. Shape推导 (Shape Inference)

这是实现动态 Shape 支持的关键步骤。Host侧需要提供一个InferShape函数,该函数在图编译阶段被调用,根据输入 Tensor 的 Shape 推导出 输出 Tensor 的 Shape

// op_host/add_tik2.cpp
namespace ge {
// 实现InferShape函数
IMPLEMT_INFERFUNC(AddTik2, AddTik2InferShape) {
    // 简单示例:Add算子,输出Shape应与输入Shape一致
    // 实际场景下需要做更复杂的检查和广播(broadcast)处理
    const Operator& op = OPOBJECT_TO_OPERATOR(opObject);
    ge::TensorDesc out_desc = op.GetInputDesc("x"); 
    op.UpdateOutputDesc("z", out_desc); // 更新输出"z"的Shape描述
    return GRAPH_SUCCESS;
}

// 注册InferShape函数
REGISTER_INFERFUNC(AddTik2, AddTik2InferShape)
} // namespace ge

3. Tiling实现与注册 (Tiling Implementation)

TilingFunc 是 Host 侧的核心逻辑。它在运行时被调用,根据当前真实的输入Shape,计算出具体的 Tiling 参数(如 BLOCK_DIM, TOTAL_LENGTH 等),然后将这个 Tiling 结构体传递给 NPU 核函数

// op_host/add_tik2.cpp
namespace ge {
// 实现Tiling函数
IMPLEMT_TILING_FUNC(AddTik2, AddTik2TilingFunc) {
    // 1. 获取输入Tensor的Shape
    auto shape = op.GetInputDesc("x").GetShape();
    uint32_t totalLength = shape.GetShapeSize(); // 假设是简单一维

    // 2. 实例化Tiling结构体
    AddTik2TilingData tiling;

    // 3. 计算Tiling策略 (这是算子性能优化的核心)
    tiling.blockDim = 8; // 假设固定使用8个核
    tiling.totalLength = totalLength;
    tiling.tileNum = (totalLength + tiling.blockDim - 1) / tiling.blockDim;

    // 4. 将Tiling数据设置到Op中,以便传递给Kernel
    op.SetTilingData(tiling.SaveToBuffer(), tiling.GetSize());

    return GRAPH_SUCCESS;
}

// 注册Tiling函数
REGISTER_TILING_FUNC(AddTik2, AddTik2TilingFunc)
} // namespace ge

4. 信息库配置 (.ini)

最后,开发者需要配置 op_host/add_tik2.ini 文件,将算子的核函数、TilingFunc等信息注册到 CANN 的算子信息库中

[AddTik2] ; 算子类型
opInterface = "AddTik2"      ; TilingFunc的注册名
kernelName = "add_tik2_dynamic" ; NPU核函数名 (必须与.cpp中一致)
binFileName = "./add_tik2"     ; 编译生成的.o或.so的相对路径

四、 保证质量:功能调试与测试验证

一个能跑的算子不等于一个好算子。严格的调试和测试是保证算子功能正确、性能达标的必要条件

1. 功能调试:TKC++孪生调试技术

CANN 提供了TKC++孪生调试技术,允许开发者在 CPU 模式下运行和调试 NPU 代码

  • GDB调试:
    开发者可以直接使用 GDB 工具,在 CPU 模式下对算子代码进行单步调试
    在这里插入图片描述

    # GDB调试命令示例
    (gdb) b add_tik2_dynamic  # 在核函数入口打断点
    (gdb) r                     # 运行
    (gdb) p tiling.tileNum    # 打印Tiling解析出的变量
    (gdb) n                     # 单步执行
    
  • 打印调试:
    printf 或 std::cout 语句只在CPU模式下生效。必须使用 CCE_KT_TEST 宏进行隔离:

    // op_kernel/add_tik2_kernel_dynamic.cpp
    extern "C" __global__ __aicore__ void add_tik2_dynamic(...)
    {
        GET_TILING_DATA(tiling, tilingData, AddTik2TilingData);
    
        // 只在CPU模式下编译和执行
        #ifdef CCE_KT_TEST
        printf("Debug: CoreID=%u, tileNum=%u\n", GetBlockIdx(), tiling.tileNum);
        #endif
        
        // ... 业务逻辑 ...
    }
    

2. 测试验证:UT与ST的双重保障

  • UT (Unit Testing, 单元测试):

    • 目的:验证算子核函数的逻辑正确性。
    • 运行:UT 在 CPU 模拟环境下运行,不依赖 NPU 硬件
    • 执行:build.sh -u tik2
  • ST (System Testing, 系统测试):

    • 目的:验证算子在真实NPU硬件上的功能和精度。
    • 流程:
      1. 定义测试用例 (add_tik2.json):
        在这里插入图片描述

        {
          "op_name": "AddTik2",
          "input_desc": [
            { "name": "x", "shape": [8, 1024], "type": "float32" },
            { "name": "y", "shape": [8, 1024], "type": "float32" }
          ],
          "output_desc": [
            { "name": "z", "shape": [8, 1024], "type": "float32" }
          ]
        }
        
      2. 定义期望数据 (test_add_tik2_data.py):
        msopst工具会调用此Python脚本,使用Numpy等标准库生成“黄金数据”用于精度对比

        import numpy as np
        
        def get_golden_data(input_data):
            """
            使用Numpy实现Add算子的标准计算
            """
            input_x = input_data[0]
            input_y = input_data[1]
            
            # 黄金数据
            expected_output = np.add(input_x, input_y)
            
            return [expected_output]
        
      3. 执行与对比:run_case.sh 脚本会自动调用 msopst 工具,在NPU上执行算子,并将输出结果与get_golden_data的Numpy结果对比

      4. 生成报告:最终生成 st_report.json 报告
        在这里插入图片描述

五、 性能调优:使用msprof洞察算子瓶颈

功能正确只是第一步,算子性能是最终追求。CANN 提供了强大的性能采集工具 msprof

msprof 允许开发者收集算子在 NPU 上执行时的详细硬件指标,如 AI Core 利用率、L0/L1/L2 Cache 命中率、DDR 带宽占用等

性能采集步骤:

  1. 设置环境变量:

    source /usr/local/Ascend/ascend-toolkit/set_env.sh
    
  2. 编译NPU可执行文件:

    bash run.sh add_tik2 ascend910 Aicore npu
    
  3. 使用msprof采集:执行采集命令,指定要分析的应用和收集的指标。

    # 示例:采集AI Core的管线利用率(pipeUtilization)
    msprof --application="./add_tik2_npu" \
           --output="./out" \
           --ai-core=on \
           --aic-metrics="pipeUtilization"
    
  4. 分析报告:msprof 会在 out/device_0/summary/ 目录下生成 .csv 报告
    在这里插入图片描述

通过分析这些数据,开发者可以精确地定位性能瓶颈(例如是计算受限还是访存受限),并针对性地优化 Tiling 策略或核函数逻辑

六、 总结

CANN 算子开发是一个严谨且精密的工程。从应对真实场景需求的动态Shape改造(Tiling结构体与核函数解析),到连接框架的Host侧注册(GE_OPERATOR, InferShape, TilingFunc),再到保证质量的UT/ST测试验证(gtest, msopst),最后到追求极致性能的msprof调优,每一步都环环相扣且有“码”可依

掌握这一全栈流程,不仅能使开发者在昇腾平台上游刃有余地实现自定义算子,更是深入理解 AI 硬件架构和高性能计算的必经之路

CDO批量处理nc文件:5分钟搞定CMIP6数据双线性插值(附完整代码) 本文详细介绍了如何使用CDO工具链中的`remapbil`命令,快速实现CMIP6数据的批量双线性插值处理。通过环境配置、核心操作步骤、高级优化技巧及典型报错解决方案,帮助科研人员高效处理大规模nc文件,显著提升气象数据处理效率。 阅读详情

相关推荐

CTFshow-pwn入门-前置基础pwn32-pwn34

CTFshow-pwn入门-前置基础pwn32-pwn34

你们de4月天的博客 1132

华为CANN算子UT测试体系深度解析与实战指南

本文深入解析华为CANN异构计算架构下的算子单元测试(UT)体系,揭示其从单元测试到工业级验证的全链路实战技能。文章以达芬奇3DCube计算单元为核心,系统阐述了通过三级测试框架实现CPU/NPU双环境验证、精度自动化比对等关键技术,并提供了完整的AddCustom算子测试实例。实践表明,该测试体系可将问题定位时间缩短85%,实现100%代码分支覆盖和float16千分之一精度验证。文章还包含企业级测试流水线方案、六大测试问题诊断工具等实用内容,为开发者构建完整的异构计算测试技术图谱。

weixin_39450680的博客 1427

平衡电桥检测高压绝缘电阻的原理

检测绝缘漏电的高压拓扑如下:BMU需要连接BAT+,BAT-和PE线,并测量电池总压(Ubatt)和负母线电压(Un),并计算出正母线电压(Up)。

booksyhay的专栏 1万+

面向动态Shape的通用融合算子设计-从理论到昇腾CANN工程实践

📝【摘要】本文系统阐述了昇腾AI处理器中动态Shape融合算子的关键技术,提出基于CANN架构的三维解决方案:1)动态Tiling机制实现运行时自适应分块;2)弹性Workspace内存管理;3)高效运行时参数传递。通过RMSNorm+SwiGLU融合算子的完整实现案例,验证单一二进制可适配B×S×H三维动态输入,实测性能较静态方案提升3.2倍。文章还涵盖企业级推荐系统优化实践(P99延迟降低53%)及动态算子调试方法论,为AI推理中可变输入场景提供工程化实践指南。

six_1243096140的博客 786

SAP PCE私有云MM02修改物料主数据基本单位报错

当前发现只有改为AAAADL(无量纲)单位时会报错,其他的正常。一开始以为配置的ISO码换算有问题,对配置排查后,排除配置问题。最后发现是PCE当前版本的原因,需要打上NOTE。SAP PCE私有云在没有库存和业务单据的情况下,MM02修改物料主数据基本单位报错“EA CPZP MK000000000000:PCS 不可转换为”,详见截图。点击【显示错误】,提示EA CPZP MK000000000000:PCS 不可转换为。从SAP FOR ME下载NOTE 3531359,链接。

dingqing86的专栏 520

萤石云cs刷机解绑固件

萤石CS-C2C-32WFR刷机包,萤石CS-C6TC刷机包,萤石CS-C6H刷机包,萤石猫眼产品等等。萤石云摄像头固件修改,绑定手机号解绑,更换序列号教程。

海康威视技术支持 2万+

深入解析华为CANN算子开发-从TensorFlow框架到昇腾AI执行(训练营深度实战篇)

在人工智能加速器的开发实践中,算子(Operator)是连接高层框架与底层硬件的关键纽带。华为昇腾AI处理器通过CANN(Compute Architecture for Neural Networks)提供了高性能算子开发框架,使开发者能够将主流深度学习框架如TensorFlow的算子映射到硬件上执行,从而充分发挥昇腾AI算力。本篇文章将从算子开发流程、框架适配、插件开发到测试验证,系统解析CANN算子的开发实践,帮助读者理解完整技术路径。

一键难忘的博客 1438

Python-自动化绘制股票价格通道线

创建更强大、更可靠的价格通道检测算法。

探索人工智能领域 948

昇腾 CANN 算子开发实战:从自定义算子到部署调优

介绍昇腾计算架构(CANN)的核心组件与功能,包括异构计算架构、算子开发框架和推理引擎的作用。说明自定义算子的应用场景,如高性能计算、模型优化及特定硬件加速需求。列出开发环境的硬件与软件要求,包括昇腾芯片型号、驱动版本和CANN工具链的安装步骤。提供环境配置的验证方法,如运行示例算子测试环境是否正常。详细描述算子开发的流程,包括算子定义、计算逻辑实现、核函数编写及内存管理。

ujainu2的博客 703

手把手教你学Simulink--单相逆变器模糊逻辑控制策略仿真

本文介绍了在Simulink中设计单相逆变器模糊逻辑控制策略的完整流程。主要包括:1)构建单相逆变器模型;2)使用FuzzyLogicToolbox设计模糊控制器,定义输入输出变量和模糊规则;3)将控制器集成到Simulink模型;4)添加干扰源和示波器;5)配置仿真参数并分析结果。该方法利用模糊控制处理非线性系统的优势,可实现输出电压的精确跟踪,具有良好的鲁棒性。文中提供了详细的步骤说明和示例代码,强调准确设计隶属函数和规则库对控制性能的关键作用。该仿真设计为电力电子控制系统的开发提供了有效支持。

MHD0815的博客 201

从 Service Entry Sheet 按 PO 行项目追溯服务行:PACKNO 与 ESLL 层级解包实战

摘要: SAP MM模块中,外部服务采购的数据结构较为复杂,服务明细并非直接存储在采购订单行项目表EKPO中,而是通过PACKNO关联到服务包表ESLL。本文解析了从采购订单行项目EBELN+EBELP获取服务行号SRVPOS的方法,重点分析了服务包的层级结构(根包、子包SUB_PACKNO),并提供了兼容合同项目的ABAP代码实现。通过EKPO-PACKNO定位根包后,需结合ESUC和ESLL表逐层解析子包,最终获取服务明细数据,解决了服务采购场景下的数据关联难题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 174

从0到1掌握Ascend C算子工程开发方式

本文系统介绍Ascend C算子的标准工程开发流程,从快速开发与标准开发方式对比入手,详细解析包括数据流设计、算子工程创建、HOST/Device架构理解、Tiling机制等核心内容。标准开发方式通过代码分离、高通用性设计,使算子能真正应用于生产环境,涵盖从工程创建到编译部署的全流程,并强调数据搬移-计算-输出三步骤的关键作用。文章还提供Sigmoid算子开发实战指南,帮助开发者掌握将算子产品化的专业方法。

gao_dou的博客 1797

6-2 GPU GART 绑定机制与 TLB 失效

本文详细解析了AMD GPU的GART(Graphics Address Remapping Table)绑定机制实现。主要内容包括: 绑定流程:从ttm_tt_bind()到硬件PTE更新的完整调用链,重点分析amdgpu_gart_bind()函数实现。 关键函数: amdgpu_gart_bind():执行安全检查、记录映射关系、更新页表等操作 amdgpu_gart_map():将CPU页映射为多个GPU页并填充PTE amdgpu_gmc_set_pte_pde():处理硬件特定的PTE格式 内存

图形/计算GPU的驱动与虚拟化技术分享园地 2655

昇腾BN算子开发实战:CANN高效实现技巧

本文详细介绍了在华为昇腾CANN架构下开发高性能BatchNormalization算子的实战指南。首先解析了BN算子的数学原理及CANN开发的核心挑战,包括数据复用效率、计算并行度和阶段适配性。接着详细说明了开发环境搭建步骤和算子实现流程,涵盖算子原型定义、TBE代码实现及编译部署。重点阐述了通过数据格式优化、计算融合和缓存预取三大优化策略,使算子吞吐量提升1.5倍以上,延迟降低60%。最后总结了常见问题调试技巧,并展望了多精度计算、动态形状支持等未来优化方向。该指南为开发者提供了从理论到实践的完整BN算

2501_94568765的博客 793

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

基于CANN的算子开发实战:从问题定位到性能落地的全流程实践

摘要:随着AI模型复杂度提升,通用算子难以满足特定场景需求,华为CANN解决方案通过深度适配Ascend硬件特性,提供自定义算子开发能力。本文系统分析自定义算子的三大触发场景(功能缺失、性能不足、精度不匹配),提出基于CANN工具链的瓶颈定位四步法,详细阐述从算子原型设计、数学逻辑转换到硬件资源适配的开发全流程,并以自定义Swish激活算子为例,展示基于TE API的工程实现路径,为AI异构计算开发者提供实践指导。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1155

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度解析CANN ops-nn:AI推理引擎的算子基石与性能优化实战

下面我们通过一个完整的加法算子开发示例,演示从环境准备到验证的全过程。CANN ops-nn作为昇腾AI软件栈的核心组件,通过提供高性能算子实现完善的开发工具和丰富的优化策略,为AI应用落地提供了坚实的算力基础。随着AIGC技术的快速发展,ops-nn将在大模型推理、多模态生成和实时内容生成等领域发挥越来越重要的作用。昇腾算子共建仓已经正式上线Gitee社区,这是国内首个面向昇腾开发者的算子共建平台。

cccxcmm的博客 807

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

CANN算子开发最佳实践:从架构设计到性能优化的深度解析

在AI芯片性能竞争日益激烈的今天,华为昇腾(Ascend)平台的CANN(Compute Architecture for Neural Networks)软件栈为开发者提供了强大的异构计算能力。CANN算子开发竞赛作为技术创新的重要平台,不仅推动了AI算子的性能优化,更形成了一套完整的开发方法论。本文将从架构设计、测试验证到性能调优三个维度,深入探讨CANN算子开发的最佳实践。 ## 算子架构

gitblog_00427的博客 361

Ascend C算子与PyTorch生态无缝融合:自定义算子开发实战指南

本文深入探讨了华为CANN架构下AscendC算子与PyTorch生态的融合技术,提出了一套完整的七层软件栈解决方案。通过达芬奇3DCube计算单元、AscendC向量化编程和PyTorchAdapter桥接三大核心技术,实现了90%的CUDA算子迁移成本降低和89%的算子融合覆盖率。文章详细介绍了动态Shape融合、三级测试框架等关键技术,并提供了AddCustom算子融合实例、企业级测试方案和六大诊断工具。开发者可通过本文获得从单元测试到系统集成的完整技术指导,有效提升NPU算子开发效率20%以上。

six_1243096140的博客 987

CANN-Ascend-C算子开发实战:从零构建自定义神经网络算子

我们以一个简单的逐元素加法算子为例,演示完整的开发流程。

2501_92193083的博客 331

CANN 模型量化高性能AI应用:深度探索昇腾CANN模型量化实战全攻略

在昇腾CANN开发中,模型推理性能优化是平衡“计算效率”与“资源开销”的关键技术——通过采用模型量化、图优化、算子融合等手段,可显著提升推理速度,降低端侧部署门槛。本文聚焦CANN模型优化工具链的实战应用,从原理剖析、工具操作到性能调优,系统呈现高效模型的开发与部署全流程。

一键难忘的博客 1368

昇腾CANN算子开发实践:从入门到性能优化

摘要:本文基于昇腾AI处理器开发实践,系统介绍了自定义算子开发流程。针对UGC内容处理需求,详细阐述了从算子定义、TBE实现到性能调优的全过程,特别探讨了亮度调节与滤波复合算子的开发案例。通过向量化计算、双缓冲等优化手段实现3倍性能提升,并总结了数据类型支持、边界处理等核心经验。文章为AI处理器上的高性能算子开发提供了实用方法论和优化技巧。

wudu_123456的博客 1093

CANN 生态实战:基于 `custom-op-tutorial` 快速上手自定义算子开发

在深度学习模型不断演进的今天,标准算子库已难以满足所有创新需求。无论是新型激活函数、注意力机制变体,还是领域专用的数据处理逻辑,自定义算子(Custom Operator)都成为突破性能与功能瓶颈的关键手段。CANN 开源生态中的 custom-op-tutorial项目,正是为降低自定义算子开发门槛而设计的教学型仓库。它以“最小可行示例”为核心理念,提供从零开始编写、编译、测试 NPU 算子的完整流程,是开发者迈入高性能 AI 编程的第一步。本文将带你一步步复现该项目中的经典案例——实现一个。

xuanxuan582的博客 626

Ascend C高性能LayerNorm融合算子开发实战

本文系统阐述了基于AscendC的LayerNorm融合算子开发全流程,重点突破三大核心技术:1)利用Welford单Pass算法将计算密度提升3.2倍;2)通过向量化编程实现95%UB命中率;3)采用三级流水线+双缓冲机制达成80%硬件利用率。文章提供完整代码实现,包含动态Shape支持、混合精度补偿等企业级优化方案,并针对千亿参数大模型场景展示算子融合实践,实测减少37%计算节点和28%内存访问量。开发者可获取从单核算子开发到集群部署的全套技术方案,包括性能调优五维方法论和典型故障排查指南。

七夜zippoe的博客 1633

CANN算子测试计划模板

本模板用于在新增算子、修改接口、优化实现或修复缺陷时记录测试范围和执行结果。它关注正确性、边界、异常输入、兼容性和回归风险;性能数据应采用独立且同口径的 benchmark 记录。 ## 使用规则 1. 在开发前填写“测试范围”和“用例设计”,用于确认本次变更需要覆盖什么。 2. 在提交 PR 前填写“执行环境”“执行结果”和“未覆盖风险”。 3. 每个用例应能够映射到一个接口约束、代码分支、

gitblog_00696的博客 882

CANN算子Add测试报告

## 注意事项 **由于add算子会调用axpy、axpy_v2、mul算子,故在编译时,需要将此三个算子一同带上** 全流程命令如下: ```bash rm -rf build/ # 编译 bash build.sh --pkg --soc=ascend950 --ops=add,axpy,axpy_v2,mul --vendor_name=custom --cov # 安装 ./buil

gitblog_00777的博客 902

CANN ATVOSS Vector算子模板库手把手实战:基于Ascend C的快速算子开发与精度验证全流程

在React Native中开发鸿组件(这里指的是鸿蒙(HarmonyOS)组件),你需要了解鸿蒙开发的基础以及如何在React Native项目中集成鸿蒙应用。鸿蒙OS是由华为开发的一个分布式操作系统,主要用于其智能设备,如手机、平板、智能手表等。首先,你需要熟悉鸿蒙OS的开发环境设置和基本开发流程。React Native本身主要用于Harmony和Harmony平台的开发,但你可以通过以下几种方式将鸿蒙应用集成到React Native项目中:A. 使用WebView。

2302_79499487的博客 749
上一篇: 不用服务器也能远程控 Linux?docker-webtop+cpolar 实测有效
下一篇: 质量与性能的基石:CANN算子开发中的调试、测试与验证深度实践
澪贰
澪贰 优质创作者: C/C++技术领域 优质创作者: C/C++技术领域
博客等级 码龄2年 1万+粉丝 222原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值