文件最后提交记录最后更新时间
3 个月前
2 个月前
2 个月前
3 个月前
1 个月前
README.md

SwiGLU样例

概述

本样例在大语言模型和混合专家(MoE)场景下,基于SwiGLU高阶API对两个输入Tensor按元素做SwiGLU计算。SwiGLU是采用Swish作为激活函数的GLU变体,计算公式为 dst_i = src0_i ⊗ Swish(src1_i),其中 Swish(x) = x/(1+e^(-βx))。该API常用于LLM中的门控前馈网络(FFN),支持float/half/bfloat16_t等数据类型。本样例使用float数据类型,输入Tensor元素个数为32,beta值为1,完成SwiGLU激活计算。

支持的产品

  • Ascend 950PR/Ascend 950DT
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品

目录结构介绍

├── swiglu
│   ├── scripts
│   │   ├── gen_data.py         // 输入数据和真值数据生成脚本
│   ├── CMakeLists.txt          // 编译工程文件(支持 -DCMAKE_ASC_RUN_MODE、-DCMAKE_ASC_ARCHITECTURES)
│   ├── data_utils.h            // 数据读入写出函数
│   └── swiglu.asc              // Ascend C样例实现 & 调用(含Tiling机制)

样例描述

  • 样例功能:
    SwiGLU是采用Swish作为激活函数的GLU变体。

    计算公式如下:

    dstTensori=(srcTensor0i)⨂Swish(srcTensor1i)dstTensor_i=(srcTensor0_i)\bigotimes Swish(srcTensor1_i)

    其中Swish激活函数的计算公式如下(β为常量):

    Swish(x)=x/(1+e(−βx))Swish(x)=x/(1 + e^{(-\beta x)})

  • 样例规格:

    表1:样例规格表
    样例类型 swiglu
    样例输入
    nameshapedata typeformat
    src0[1, 32]floatND
    src1[1, 32]floatND
    样例输出
    dst[1, 32]floatND
    核函数名swiglu_custom
  • 样例实现:
    本样例实现的是固定shape的样例,输入元素个数为32。通过Tiling机制将计算参数(dataLength、sharedTmpBufferSize)从Host端传递到Device端,支持灵活配置计算规模。

    • Kernel实现
      核心计算步骤:将输入数据从GM搬运到UB后,调用 AscendC::SwiGLU 完成SwiGLU计算,再将结果搬回Global Memory。

    • Tiling实现
      临时空间处理:通过 AscendC::GetSwiGLUMaxMinTmpSize 获取所需临时空间大小,由Tiling传递到Kernel端。当临时空间大于0时,使用开发者提供的buffer;否则由框架自动申请。

    • 调用实现
      使用内核调用符 <<<>>> 调用核函数,传入src0、src1、dst、workspace和tiling参数。

编译运行

在本样例根目录下执行如下步骤,编译并执行样例。

  • 配置环境变量

    请根据当前环境上CANN开发套件包的安装方式,选择对应配置环境变量的命令。

    • 默认路径,root用户安装CANN软件包

      source /usr/local/Ascend/cann/set_env.sh
      
    • 默认路径,非root用户安装CANN软件包

      source $HOME/Ascend/cann/set_env.sh
      
    • 指定路径install_path,安装CANN软件包

      source ${install_path}/cann/set_env.sh
      
  • 样例执行

    默认模式(dav-2201架构)

    mkdir -p build && cd build;
    cmake -DCMAKE_ASC_ARCHITECTURES=dav-2201 ..; make -j;
    python3 ../scripts/gen_data.py
    ./demo
    

    使用CPU调试或NPU仿真模式时,添加 -DCMAKE_ASC_RUN_MODE=cpu-DCMAKE_ASC_RUN_MODE=sim 参数即可。

    示例如下:

    cmake -DCMAKE_ASC_RUN_MODE=cpu -DCMAKE_ASC_ARCHITECTURES=dav-2201 ..; make -j; # cpu调试模式
    cmake -DCMAKE_ASC_RUN_MODE=sim -DCMAKE_ASC_ARCHITECTURES=dav-2201 ..; make -j; # NPU仿真模式
    

    注意: 切换编译模式前需清理cmake缓存,可在build目录下执行 rm CMakeCache.txt 后重新cmake。

  • 编译选项说明

    表2:编译选项说明
    选项可选值说明
    CMAKE_ASC_RUN_MODEnpu(默认)、cpu、sim运行模式:NPU运行、CPU调试、NPU仿真
    CMAKE_ASC_ARCHITECTURESdav-2201(默认)、dav-3510NPU架构:dav-2201对应Atlas A2/A3系列,dav-3510对应Ascend 950PR/Ascend 950DT
  • 执行结果

    执行结果如下,说明精度对比成功。

    test pass!