From 982abe8817ce12ce4b63b3a72cc487faf2eb82d5 Mon Sep 17 00:00:00 2001 From: FishQ Date: Wed, 3 Sep 2025 03:04:04 +0000 Subject: [PATCH] update README.md. Signed-off-by: FishQ --- README.md | 124 +++++++++++++++++++++++++++---------------- docs/media/image.png | Bin 0 -> 45127 bytes 2 files changed, 78 insertions(+), 46 deletions(-) create mode 100644 docs/media/image.png diff --git a/README.md b/README.md index ad2fc889..760e342e 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,38 @@ # Ascend Transformer Boost ## 介绍 -Ascend Transformer Boost加速库(下文简称为ATB加速库)是一款高效、可靠的加速库,基于华为Ascend AI处理器,专门为Transformer模型的训练和推理而设计。 +Ascend Transformer Boost加速库(下文简称为ATB加速库)是一款基于华为Ascend AI处理器,专门为Transformer模型的训练和推理而设计的加速库。主要包含一系列Transformer模型算子和运行时优化措施, 提高模型性能。 -ATB加速库采用了一系列优化策略,包括算法优化、硬件优化和软件优化,能够显著提升Transformer模型的训练和推理速度,同时降低能耗和成本。具体来说,ATB加速库通过优化矩阵乘法等核心算子和注意力机制的实现方式,实现了对Transformer模型的高效加速。此外,ATB加速库还充分利用了Ascend AI处理器的硬件特性,如算力、存储带宽和内存带宽,通过硬件加速和数据重用等技术,进一步提升了性能和效率。ATB加速库目前提供了底层基础的高性能算子以及高效的算子组合技术(Graph图算子),同时上层支持对接多种模型框架如PyTorch、MindSpore、Paddle。 - -总而言之,ATB加速库中包含了各类Transformer类模型的高度优化模块,在各种应用场景中发挥重要作用,为模型的训练和推理提供了强有力的支持。 +- 高性能算子:针对昇腾系列芯片, 提供高度优化的Transformer算子, 包括Linear/softmax/PageAttention/RingAttention等。 +- 组图能力: 支持通过手动构图方式将上述算子或用户自定义算子构建成图算子,用于表征Layer或Model。 +- 运行时优化: 通过算子间内存复用和算子下发顺序优化, 提升整体模型性能。 +- Plugin: 提供Plugin能力, 支持用户使用第三方算子组图。 ## 软件架构 -加速库接口功能主要分成三部分: -- 提供基础原生的算子(Operation),用户可以根据需求使用对应的算子完成计算功能。 -- 提供图算子机制,用户根据模型设计对应的图算子,使用加速库提供的原生算子和创建的自定义算子创建图算子,完成相应的计算。 -- 提供插件(Plugin)机制,用户可以根据自己的需求创建自定义的算子。 -## 环境构建 - - [安装CANN环境](https://www.hiascend.com/document/detail/zh/canncommercial/80RC22/softwareinst/instg/instg_0001.html?Mode=PmIns&OS=Ubuntu&Software=cannToolKit) - - 设置cann环境变量 - ```sh - source [cann安装路径](默认为/usr/local/Ascend/ascend-toolkit)/set_env.sh - ``` +![输入图片说明](docs/media/image.png) -## 使用教程 - - - 加速库编译
+ +ATB的架构大致可以分成3层: +1. 接口层: 提供单算子接口、组图接口、PlugIn算子接入接口三类 +2. 功能实现层:包括算子实现、运行时优化、Context管理等 +3. 算子运行时:主要提供算子分包、下发等功能。 + +## 编译安装 + 用户可以选择从源码编译安装,也可以通过官网下载版本包安装。 下面的安装方式2选1. + 前置条件:已经在环境上安装了对应的CANN ToolKit包。 安装步骤见:https://www.hiascend.com/document/detail/zh/canncommercial/82RC1/softwareinst/instg/instg_quick.html?Mode=PmIns&InstallType=local&OS=Debian&Software=cannToolKit + + - 源码编译并安装
+ 注意: ATB是CANN的标准组件, 提供标准的安装包供用户使用。如果希望使用已经编译好的标准包, 可以跳过这一步骤。 编译加速库,设置加速库环境变量: ```sh > cd ascend-transformer-boost - > bash scripts/build.sh - > source output/atb/set_env.sh + > bash scripts/build.sh # 编译 + > source output/atb/set_env.sh #安装 ``` - - 无法获取ascend-op-common-lib代码仓时,可通过安装nnal软件包获取对应so文件
- - 安装步骤可参考 `run包使用` - - 代码及软件包版本对应关系:
- nnal软件包需保持和toolkit及kernels软件包版本一致 - |CANN|代码分支| - |-|-| - |CANN 8.1.RC1|br_feature_cann_8.2.RC1_0515POC_20250630| - - 执行 - ```sh - source {install path}/nnal/atb/set_env.sh - export ATB_BUILD_DEPENDENCY_PATH=${ATB_HOME_PATH} - ``` - - run包使用
+ - ATN安装使用
- run包获取 1. 进入网址:https://www.hiascend.com/developer/download/commercial 2. 产品系列选择服务器,产品型号根据设备型号选择,选择所需解决方案版本,随后在CANN区域选择软件包跟随指引即可获取相关run包 @@ -51,25 +40,68 @@ ATB加速库采用了一系列优化策略,包括算法优化、硬件优化 其中,{version}表示软件版本号,{arch}表示CPU架构。 - 安装run包(需要依赖cann环境) ```sh - chmod +x 软件包名.run # 增加对软件包的可执行权限 - ./软件包名.run --check # 校验软件包安装文件的一致性和完整性 - ./软件包名.run --install # 安装软件,可使用--help查询相关安装选项 + chmod +x Ascend-cann-nnal__linux-.run # 增加对软件包的可执行权限 + ./Ascend-cann-nnal__linux-.run --check # 校验软件包安装文件的一致性和完整性 + ./Ascend-cann-nnal__linux-.run --install --whitelist=atb # 安装软件,可使用--help查询相关安装选项 ``` 出现提示`xxx install success!`则安装成功 ## 使用说明 -- 加速库算子单元测试 - - c++ - ```sh - bash scripts/build.sh unittest +- 单算子调用 ``` - - python - ```sh - bash scripts/build.sh pythontest - ``` - - csv - ```sh - bash scripts/build.sh csvopstest + #include + #include + + int deviceId = 0; + aclError status = aclrtSetDevice(deviceId); + // 以elewise大类中的Add算子为例,可通过以下方式构造对应参数: + atb::infer::ElewiseParam param; + param.elewiseType = atb::infer::ElewiseParam::ELEWISE_ADD; + // 创建算子对象实例 + atb::Operation *op = nullptr; + atb::Status st = atb::CreateOperation(param, &op); + + // Tensor构造方法 + atb::Tensor a; + a.desc.dtype = ACL_FLOAT16; // 配置Tensor数据类型 + a.desc.format = ACL_FORMAT_ND; // 配置Tensor格式 + a.desc.shape.dimNum = 2; // 配置Tensor维度数 + a.desc.shape.dims[0] = 3; // 配置Tensor第0维大小 + a.desc.shape.dims[1] = 3; // 配置Tensor第1维大小 + a.dataSize = Utils::GetTensorSize(a); // 获取Tensor内存大小 + status = aclrtMalloc(&a.deviceData, a.dataSize, ACL_MEM_MALLOC_HUGE_FIRST); // 申请device内存 + // 按上述方法构造所有输入和输出tensor,存入VariantPack + atb::VariantPack variantPack; + variantPack.inTensors = { a, ... }; + variantPack.outTensors = { output, ... }; + + atb::Context *context = nullptr; + st = atb::CreateContext(&context); + aclrtStream stream = nullptr; + status = aclrtCreateStream(&stream); + context->SetExecuteStream(stream); + + // 调用Setup接口,计算workspace大小。 + uint64_t workspaceSize = 0; + st = op->Setup(variantPack, workspaceSize, context); + + // 根据workspace大小申请NPU内存。 + void *workspace = nullptr; + status = aclrtMalloc(&workspace, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); + + // 调用Execute接口,执行算子。 + st = op->Execute(variantPack, (uint8_t *)workspace, workspaceSize, context); + + // 销毁创建的对象,释放内存。 + status = aclrtDestroyStream(stream); // 销毁stream + status = aclrtFree(workspace); // 销毁workspace + st = atb::DestroyOperation(op); // 销毁op对象 + st = atb::DestroyContext(context); // 销毁context + // 下面代码为释放Tensor的示例代码,实际使用时需释放VariantPack中的所有Tensor + status = aclrtFree(tensor.deviceData); + tensor.deviceData = nullptr; + tensor.dataSize = 0; + ``` ## 参与贡献 diff --git a/docs/media/image.png b/docs/media/image.png new file mode 100644 index 0000000000000000000000000000000000000000..952ded40a4ce749c37b3a175b8836c948e1c13e3 GIT binary patch literal 45127 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