拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CANN ascend-transformer-boost RmsNormOperation C++ Demo 实战指南:从环境配置到 Qwen / DeepSeek 模型场景

CANN ascend-transformer-boost RmsNormOperation C Demo 实战指南从环境配置到 Qwen / DeepSeek 模型场景【免费下载链接】ascend-transformer-boost本项目是CANN提供的是一款高效、可靠的Transformer加速库基于华为Ascend AI处理器提供Transformer定制化场景的高性能融合算子。项目地址: https://gitcode.com/cann/ascend-transformer-boost本篇技术指南以 CANN ascend-transformer-boost 仓库中 rms_norm 示例目录 为骨架完整讲解 RmsNormOperationRMS 归一化算子的 C 调用方式包括 CANN 与 NNAL 双环境变量配置、build.sh编译运行流程、RmsNormParam参数结构逐字段解析以及面向 Llama、Qwen、DeepSeek 等主流模型场景的 5 个可直接运行的 demo 规格。读完本文你将能够独立配置环境、编译并运行 rms_norm 系列示例并具备依据模型隐藏层维度自行修改 demo 的能力。RMSNorm 与 RmsNormOperation 简介RMSNormRoot Mean Square Layer Normalization是 Llama、Qwen、DeepSeek 等主流 Transformer 模型中广泛使用的归一化层相比 LayerNorm 省去了均值中心化步骤只基于均方根对输入进行缩放计算开销更低。在 CANN ascend-transformer-boost 加速库中该能力由RmsNormOperation提供其参数结构体atb::infer::RmsNormParam定义在 include/atb/infer_op_params.h。从定义可以看出RmsNormOperation 是一个能力相当完整的融合算子三种归一化模式layerTypeRMS_NORM_NORM标准 NORM、RMS_NORM_PRENORM前置归一化、RMS_NORM_POSTNORM后置归一化精度模式precisionModeHIGH_PRECISION_MODE中间计算使用 float与HIGH_PERFORMANCE_MODE中间计算使用 float16模型公式选择modelTypeLLAMA_MODELLlama 系 RMSNorm 公式默认与GEMMA_MODELGemma 系公式量化支持quantType当前支持QUANT_UNQUANT与QUANT_INT8前置/后置归一化还支持偏置叠加hasBias与各自的 epsilon 配置。环境准备source 双环境变量在编译运行 demo 之前需要先加载 CANN 与 NNALAscend Transformer Boost 加速库两个包的运行环境README 给出了两条 source 命令加载 CANN 工具包环境source /usr/local/Ascend/ascend-toolkit/set_env.sh加载 NNAL 加速库环境source /usr/local/Ascend/nnal/atb/set_env.sh特别说明如果是从加速库源码自行编译构建而非安装预编译包则应 source 源码编译产物的环境脚本例如source ./ascend-transformer-boost/output/atb/set_env.sh环境脚本还会顺带设置ATB_HOME_PATH与ASCEND_HOME_PATH两个关键环境变量它们正是后面编译脚本中定位头文件与库文件路径的依据见下文 build.sh 分析。编译与运行build.sh 全流程解读环境就绪后在示例目录下执行一条命令即可完成编译并运行bash build.sh以 example/op_demo/rms_norm/build.sh 为例脚本内部做了两件事第一步探测 cxx_abi 并编译。脚本通过 Python 探测当前 torch 是否以 C11 ABI 编译有 torch 时按其返回值无 torch 时默认输出 1随后调用 g 完成编译g -D_GLIBCXX_USE_CXX11_ABI${cxx_abi} \ -I ${ATB_HOME_PATH}/include -I ${ASCEND_HOME_PATH}/include \ -L ${ATB_HOME_PATH}/lib -L ${ASCEND_HOME_PATH}/lib64 \ rms_norm_demo.cpp ../demo_util.h -l atb -l ascendcl -o rms_norm_demo第二步运行生成的二进制./rms_norm_demo。编译脚本默认编译并运行rms_norm_demo.cpp。如需编译其他 demo例如rms_norm_qwen_demo_0.cpp需要将编译命令中的源文件替换为对应的.cpp文件名。cxx_abi 与 D_GLIBCXX_USE_CXX11_ABI 的匹配_GLIBCXX_USE_CXX11_ABI宏决定 C 标准库字符串等类型采用 ABI 0旧版std::string还是 ABI 1C11std::string必须与加速库链接时使用的 ABI 保持一致否则链接或运行时会报符号不匹配错误。README 给出了两种显式用法使用cxx_abi0默认时g -D_GLIBCXX_USE_CXX11_ABI0 -I ...使用cxx_abi1时g -D_GLIBCXX_USE_CXX11_ABI1 -I ...build.sh中的自动探测逻辑会在没有 torch 的环境里回退为 1因此当出现 ABI 相关链接错误时可通过显式指定宏并调整编译选项排查。核心代码走读rms_norm_demo.cpp 调用全流程example/op_demo/rms_norm/rms_norm_demo.cpp 是标准 NORM 场景的默认示例其调用流程完整展示了 ATB 算子 C 编程的五步法对编写其他 ATB 算子调用代码具有通用参考价值初始化 ACL 与设备aclInit(nullptr)初始化 ACL 运行环境aclrtSetDevice(DEVICE_ID)指定使用 0 号设备atb::CreateContext(context)创建 ATB 上下文aclrtCreateStream创建 stream最后通过context-SetExecuteStream(stream)将执行流绑定到上下文。创建算子填充atb::infer::RmsNormParam后调用atb::CreateOperation(param, rmsnormOp)生成算子实例atb::infer::RmsNormParam param; param.layerType atb::infer::RmsNormParam::RmsNormType::RMS_NORM_NORM; param.normParam.quantType atb::infer::QuantType::QUANT_UNQUANT; atb::CreateOperation(param, rmsNormOp);准备输入输出 Tensor通过公共工具头文件 example/op_demo/demo_util.h 中的CreateTensorFromVector在设备侧分配内存并把 host 数据搬入随后组装atb::VariantPack将输入{x, gamma}与输出{tensorOut}分别放入inTensors/outTensors。Setup 获取 workspace 大小并执行先调用rmsnormOp-Setup(variantPack, workspaceSize, context)完成输入输出校验并计算工作空间大小再用aclrtMalloc分配 workspace随后调用rmsnormOp-Execute(variantPack, workspacePtr, workspaceSize, context)真正下发计算最后aclrtSynchronizeStream(stream)等待设备侧任务完成。资源释放依次释放输入输出 Tensor 的 device 内存与 workspace、atb::DestroyOperation销毁算子、销毁 stream 与 context、aclFinalize()收尾。注意代码注释强调的顺序operation 对象先释放context 全局资源后释放。demo_util.h还封装了CHECK_STATUS错误处理宏区分 ACL 错误码与 ATB 错误码并打印排查指引、CreateTensor依据 shape 计算数据大小并分配设备内存、CastOp调用 Elewise 的ELEWISE_CAST完成数据类型转换与TransdataOp调用ND_TO_FRACTAL_NZ完成 ND 到 NZ 格式转换等通用工具其他算子 demo 均复用了这套工具可作为统一参考。RmsNormParam 参数详解字段、取值范围与默认值以下字段来自 include/atb/infer_op_params.h 的源码定义是理解与调整 demo 参数的基础参数类型默认值说明layerTypeRmsNormTypeRMS_NORM_UNDEFINED归一化类型RMS_NORM_NORM标准 NORM、RMS_NORM_PRENORMPRENORM、RMS_NORM_POSTNORMPOSTNORMnormParam.quantTypeQuantTypeQUANT_UNQUANTNORM 场景量化类型当前支持QUANT_UNQUANT不量化与QUANT_INT8int8 量化normParam.epsilonfloat1e-5归一化时加在分母上防止除零的小量normParam.rstdboolfalse置 true 时使用训练侧 rmsnormforward 算子仅 Atlas 800I A2 推理产品支持不可与precisionMode、modelType同时设置量化场景不支持normParam.precisionModePrecisionModeHIGH_PRECISION_MODE中间计算精度默认 floatHIGH_PERFORMANCE_MODE使用 float16输入仅支持 float16不可与rstd、modelType同时设置量化场景配置该参数将返回ERROR_INVALID_PARAMnormParam.modelTypeModelTypeLLAMA_MODEL计算公式Llama 系 RMSNorm 公式默认或 Gemma 系公式不可与rstd、precisionMode同时启用量化场景不支持preNormParam/postNormParamPreNormParam/PostNormParam—PRENORM / POSTNORM 场景参数含quantType、epsilon默认1e-5、hasBias是否叠加偏置默认 falseQuantType枚举定义在同文件第 45~57 行QUANT_UNDEFINED QUANT_UNQUANT 0不量化、QUANT_INT4 1暂不支持、QUANT_INT8 2int8 量化、QUANT_INT16 / QUANT_FLOAT8 / QUANT_FLOAT16均暂不支持。需要特别留意算子实现侧的校验规则见 src/ops/ops_infer/rms_norm/rms_norm_operation.cpplayerType与quantType的组合存在约束例如RMS_NORM_PRENORM/RMS_NORM_POSTNORM与QUANT_INT8组合非法时会返回带明确提示的报错另外所有输入输出 Tensor 的最后一维大小必须相等且Atlas 推理系列产品不支持 bf16 类型数据。五个 Demo 场景参数与输入输出规格全表示例目录共提供 5 个 demo分别对应不同模型与隐藏层维度的典型场景。除默认的rms_norm_demo.cpp外其余 demo 编译时需在 build.sh 中把源文件替换为对应.cpp文件名并且仅适用于Atlas A2/A3 训练系列产品、Atlas 800I A2 推理产品、Atlas A3 推理系列产品。rms_norm_demo.cpp通用基础场景默认编译脚本可直接编译运行。参数设置参数值layerTypeatb::infer::RmsNormParam::RmsNormType::RMS_NORM_NORMnormParam.quantTypeatb::infer::QuantType::QUANT_UNQUANTepsilon1e-5输入Tensor数据类型数据格式Shapexfloat16nd[4, 1024, 5120]gammafloat16nd[5120]输出Tensor数据类型数据格式Shapeoutputfloat16nd[4, 1024, 5120]该场景对应代码中DIM_0 4、DIM_1 1024、DIM_2 5120的常量定义输入数据全部以 2.0 填充gamma为一维 [5120] 的逐通道缩放参数输出与输入x形状一致。rms_norm_qwen_demo_0.cppQwen 批量场景编译时替换源文件为rms_norm_qwen_demo_0.cpp。参数设置参数值layerTypeatb::infer::RmsNormParam::RmsNormType::RMS_NORM_NORMnormParam.quantTypeatb::infer::QuantType::QUANT_UNQUANTepsilon1e-6输入Tensor数据类型数据格式Shapexbf16nd[1024, 5120]gammabf16nd[5120]输出Tensor数据类型数据格式Shapeoutputbf16nd[1024, 5120]rms_norm_qwen_demo_1.cppQwen 单 token 场景编译时替换源文件为rms_norm_qwen_demo_1.cpp。参数设置参数值layerTypeatb::infer::RmsNormParam::RmsNormType::RMS_NORM_NORMnormParam.quantTypeatb::infer::QuantType::QUANT_UNQUANTepsilon1e-6输入Tensor数据类型数据格式Shapexbf16nd[1, 5120]gammabf16nd[5120]输出Tensor数据类型数据格式Shapeoutputbf16nd[1, 5120]rms_norm_qwen_demo_2.cppQwen 小批量场景编译时替换源文件为rms_norm_qwen_demo_2.cpp。参数设置参数值layerTypeatb::infer::RmsNormParam::RmsNormType::RMS_NORM_NORMnormParam.quantTypeatb::infer::QuantType::QUANT_UNQUANTepsilon1e-6输入Tensor数据类型数据格式Shapexbf16nd[5, 5120]gammabf16nd[5120]输出Tensor数据类型数据格式Shapeoutputbf16nd[5, 5120]rms_norm_deepseek_demo_0.cppDeepSeek 大 batch 场景编译时替换源文件为rms_norm_deepseek_demo_0.cpp。参数设置参数值layerTypeatb::infer::RmsNormParam::RmsNormType::RMS_NORM_NORMnormParam.quantTypeatb::infer::QuantType::QUANT_UNQUANTepsilon1e-6输入Tensor数据类型数据格式Shapexfloat16nd[512, 7168]gammafloat16nd[7168]输出Tensor数据类型数据格式Shapeoutputfloat16nd[512, 7168]rms_norm_deepseek_demo_1.cppDeepSeek 小 batch 场景编译时替换源文件为rms_norm_deepseek_demo_1.cpp。参数设置参数值layerTypeatb::infer::RmsNormParam::RmsNormType::RMS_NORM_NORMnormParam.quantTypeatb::infer::QuantType::QUANT_UNQUANTepsilon1e-6输入Tensor数据类型数据格式Shapexfloat16nd[32, 7168]gammafloat16nd[7168]输出Tensor数据类型数据格式Shapeoutputfloat16nd[32, 7168]场景对比与改造要点从上述规格可以总结出规律隐藏层维度最后一维与模型强相关——Qwen 系列为 5120DeepSeek 系列为 7168二者均与对应模型的 hidden_size 对齐gamma的形状始终等于隐藏层维度输出形状与输入x完全一致。因此当需要适配其他模型时只需同步修改x的 shape、gamma的 shape及DIM_*常量即可无需改动算子创建与执行逻辑。同时注意 Qwen 系列 demo 使用 bf16DeepSeek 与基础 demo 使用 float16须与产品对 bf16 的支持情况Atlas 推理系列不支持 bf16核对后再选用。数据生成与结果验证说明README 明确提醒示例中生成的数据如以常量 2.0 填充的输入不代表实际场景仅用于验证调用流程与算子可运行性。若需要贴近真实分布的数据生成与精度对比参考请查看根目录下的 Python 用例目录tests/apitest/opstest/python/operations/rms_norm/该目录位于 tests/apitest/opstest/python/operations/rms_norm/属于仓库 opstest 高精度测试体系其中包含 rms_norm 算子的 Python 侧数据构造与预期输出生成逻辑可作为自造数据、核对数值精度的权威参考。常见问题与排障建议链接报std::string相关符号错误多为_GLIBCXX_USE_CXX11_ABI与加速库不一致按 README 显式指定-D_GLIBCXX_USE_CXX11_ABI0/1并匹配 build.sh 探测值。ATB_HOME_PATH/ASCEND_HOME_PATH为空导致找不到头文件确认已正确 source NNAL 与 CANN 的 set_env.sh源码编译场景务必 sourceoutput/atb/set_env.sh。运行报参数校验错误检查layerType与quantType组合是否合法、量化场景是否误配precisionMode/modelType/rstd、所有 Tensor 最后一维是否一致以及设备型号对 bf16 的支持限制。执行结果不符合预期demo 输入为随机填充不要将其当作真实推理结果如需验证正确性改用tests/apitest/opstest/python/operations/rms_norm/下的 Python 用例数据或参考 example/op_demo/demo_util.h 中的CastOp/TransdataOp工具完成数据类型与 ND/NZ 格式的转换后再对拍。通过本文你已经掌握 RmsNormOperation 在 ascend-transformer-boost 中的完整 C 调用链路从双环境变量配置、build.sh 编译运行到RmsNormParam参数体系与 5 个模型场景规格再到源码级校验规则与数据验证手段。这套方法同样适用于仓库中其他算子 demo如 rms_norm_backward、layer_norm、rope 等可作为 ATB 算子 C 开发的上手范式。【免费下载链接】ascend-transformer-boost本项目是CANN提供的是一款高效、可靠的Transformer加速库基于华为Ascend AI处理器提供Transformer定制化场景的高性能融合算子。项目地址: https://gitcode.com/cann/ascend-transformer-boost创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门