飞桨x昇腾生态适配方案:05_算子适配流程

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本内容主要介绍Paddle针对非CPU和Nvidia GPU硬件(如NPU)的适配流程与方法。适配代码存于PaddleCustomDevice仓库,路径为`PaddleCustomDevice/backends/npu`,包含kernels(算子适配)和tests(单元测试)两个核心目录。适配流程分为算子注册、适配函数入参与主体实现三步,重点对齐Paddle与CANN算子参数。

适配代码仓介绍

  • Paddle 针对除 CPU 和 Nvidia GPU 之外的其他硬件的适配代码,均存于PaddleCustomDevice代码仓
  • 以 NPU 适配代码为例,其路径为PaddleCustomDevice/backends/npu。在此路径下,有两个目录值得重点关注,分别是 kernels 目录(主要用于算子适配)和 tests 目录(主要用于单元测试)。
    01_适配代码仓介绍.png

确认算子原型

CANN包中有的算子才可以适配,根据Paddle的API确认与算子的对应关系是适配的第一步,下边是一些必须的参考资料地址。

  • Paddle API地址:API 文档-API文档-PaddlePaddle深度学习平台
  • aclnn算子地址(优先使用)
  • aclop算子地址.rar)(实在找不到aclnn时使用,可直接下载)
  • op-plugin适配参考(torch适配代码,可供参考)

    适配流程

    适配主要分为以下几个步骤:

    算子注册

    PaddleCustomDevice/backends/npu/kernels路径下,每个 .cc 文件均包含一个或多个算子的适配代码。
    首先,需要查找待适配的算子是否已经完成注册。若未注册,则需添加注册步骤;若已注册,则要检查该算子所支持的数据类型,此过程可参考 Paddle-cpu或 Paddle GPU 的实现方式。
    下面以简单的 abs_kernel 为例,该代码文件的最下方为算子注册部分。

02_算子注册.png

上图注册代码的前四个入参位置固定,具体含义如下:

  • "abs":API 名称
  • "npu":硬件名称
  • "ALL_LAYOUT":支持的数据布局(Layout)类型,默认传入 ALL_LAYOUT 即可
  • "AbsKernel":适配函数名称

注意:

  • 后续入参为该 API 支持的数据类型,顺序不限。数据类型的传递应主要依据 API 的需求来确定。若算子不支持某些数据类型,可选择在内部算子前后添加类型转换(CAST)操作。
  • 注册代码的主体部分主要用于设置输入张量第一个值的数据类型。通常情况下,此部分无需过多关注,可将其置空。

    适配函数入参

    适配函数部分,其命名通常为 “Kernel 名(首字母大写)+ Kernel”。入参需与 Paddle CPU 保持一致,但 NPU 自定义算子除外,此类算子代码位于/npu/custom_op 目录下,不在本文介绍范围内。
    仍以 abs_kernel 为例,代码中上方为 CPU 实现写法,下方为 NPU 实现写法。需注意,入参的作用域可能存在差异,必要时需添加 phi::前缀进行对应修改。
    CPU:
    03_cpu.png
    NPU:
    04_npu.png

适配函数主体

适配函数的底层逻辑在于使 Paddle 的 API 参数与 CANN 中算子的参数达成一致。
常见的无法对的齐情况主要有以下几种:

  • Paddle 存在参数缺失或参数无法直接对应;
  • CANN 存在参数缺失;
  • 部分输入数据类型不被支持;
  • CANN 中的算子仅支持 NCHW 布局;
  • 需要借助多个 CANN 算子拼接来实现 Paddle 算子的功能等。
    适配主体中针对参数差异的处理方式,将在aclnn 算子适配举例章节展开讨论。

本章节主要聚焦于介绍适配框架,以及部分算子在 Paddle 和 CANN 中的参数、语义、数据类型等情况。
部分算子在 Paddle 和 CANN 中的参数及语义、数据类型完全相同,在进行 aclnn 算子适配时,仅需完成基本的三个步骤。
下面以 abs_kernel 为例,对 aclnn 算子和 aclop 算子进行说明:

aclnn算子适配主体

如果适配的算子为aclnn,则一般包含三个部分:
05_abs.png

算子检查宏

DO_COMPATIBILITY 宏用于进行算子检查。
由于 aclnn 算子是逐步增加的,在不同的 CANN 版本中支持情况存在差异,因此若没有对应的 aclnn 算子,则使用 aclop 算子。添加该宏的目的在于让 Paddle - NPU 能够兼容更多的 CANN 版本。

适配主体

适配主体部分主要负责参数对齐。其中,必须包含的代码是为输出张量申请内存,即dev_ctx.template Alloc<T>(out);

算子执行宏

EXEC_NPU_CMD是用于执行 aclnn 算子的宏。
其前两个参数默认为 aclnn 算子名称和设备上下文,后续参数为 aclnn 算子的输入参数,使用时需严格保证参数顺序对齐。

aclop算子适配主体

部分 API 不存在对应的 aclnn 算子,此时可查阅 aclop 文档进行适配。在 Paddle 中,aclop 算子的覆盖范围更广,而 aclnn 算子的覆盖范围相对较窄。因此,当找不到 aclnn 算子时,可调用 aclop 算子进行计算。
需要注意的是,aclnn 算子和 aclop 算子的适配方式存在一定差异。在执行 aclop 算子时,需使用类似如下的语句:
06_aclop.png

NpuOpRunner 的入参通常分为四个部分:

  • "Abs":算子名称,标识相关操作。
  • "{x}":输入,按顺序排列的输入数据。
  • "{*out}":输出,按顺序排列的输出数据。
  • "{}":属性,按顺序排列的属性,需以键值对形式书写。

07_aclop1.png

aclop还有一种入参方式,与上述方式等价,但更为直观:
08_aclop2.png

单元测试

完成适配后,需执行重新编译操作,指令为:

bash tools/compile.sh

编译完成后,进行单元精度验证。此环节主要使用 /npu/tests/unittests 目录下的单元测试。若为新适配的算子,还需增加相应单元测试。

注意:
由于 bf16 数据类型在 numpy 中不存在,无法作为精度验证的标杆。因此,针对 bf16 数据类型,采用前后修改数据类型的方式,相关代码另行编写在*_eager.py文件中。
单元测试本身相对简单,重点在于尽可能覆盖更多的应用场景。
09_test.png

运行单元测试时,将以下两个 Python 路径添加至环境变量中,其中{codepath}代表代码路径:

export PYTHONPATH=/{codepath}/PaddleCustomDevice/python:$PYTHONPATH
export PYTHONPATH=/ {codepath} /PaddleCustomDevice/python/tests:$PYTHONPATH

其余注意事项

  • 在实际的算子适配工作中,常常会遭遇 CANN 包中算子不支持的问题。针对这一情况,最常用的解决方法是利用小算子进行拼接。在极个别场景下,对于某些算子,可将部分功能置于 CPU 上实现,尤其是与随机数相关的功能。然而,不可忽视的是,这些应对方法均会不可避免地导致性能损失。
  • 算子适配,本质上是一项对齐工作,涵盖功能对齐、精度对齐以及性能提升。在算子适配过程中,可以借助单元测试(单测)进行跟踪。一旦出现问题,通过打印 CANN 日志的方式,能够有效地定位问题所在 。
export ASCEND_SLOG_PRINT_TO_STDOUT=1
export ASCEND_GLOBAL_LOG_LEVEL=0
python xxx.py > xxx.log

使用上述方式可以把CANN的日志重定向到xxx.log中,通过搜索ERROR查看错误信息是定位问题的一个关键手段。

目录
相关文章
|
文字识别 算法 API
飞桨x昇腾生态适配方案:04_模型精度对齐
本文详细介绍了模型在不同硬件(如GPU与NPU)间迁移时的精度对齐方法,包括前向和反向对齐的具体步骤。前向对齐通过模块化对比计算结果(如平均值、最大最小值等),确保误差在合理范围内;反向对齐则聚焦于梯度差异,利用二分法定位问题算子。同时,文章结合PPHGNet_small和MultiHead等具体模块代码,说明了如何打印输出并分析中间结果。此外,还探讨了私有格式、梯度异常及特殊shape等可能影响精度的因素,并提出相应解决策略。整体流程清晰,为跨硬件模型迁移提供了实用指导。
801 10
|
机器学习/深度学习 PyTorch 算法框架/工具
飞桨x昇腾生态适配方案:00_整体方案介绍
本文详细介绍PaddlePaddle与NPU的适配工作,涵盖训练与推理支持、性能优化及离线推理方案。PaddleCustomDevice作为适配层,支持主流模型(详见飞桨-昇腾模型列表),多数性能媲美V100,部分调优模型接近0.8*A800。硬件适配主要针对A2芯片,A1兼容但310系列建议离线推理。提供常用模型仓链接及整体方案导览,包括环境准备、算子适配、性能调优和Paddle转ONNX/OM等内容。
978 0
|
机器学习/深度学习 Docker 容器
飞桨x昇腾生态适配方案:01_基础环境准备
本指南详细介绍在ARM环境中准备CANN环境、安装Paddle深度学习框架及PaddleCustomDevice的过程。首先下载并加载CANN镜像,启动Docker容器;接着通过日构建包或源码编译安装PaddlePaddle和PaddleCustomDevice;可选更新CANN版本时需注意环境变量配置与路径设置。最后提供基础功能检查方法,包括硬件后端、版本验证及框架健康检查,确保环境搭建成功。
1179 0
|
JSON 数据格式 AI芯片
飞桨x昇腾生态适配方案:14_loop算子缺失(上):ONNX模型拆分
本文针对NPU不支持LOOP算子的问题,提出一种解决方案:将ONNX模型拆分为含LOOP算子和不含LOOP算子的子图,单独推理LOOP部分。通过构造包含LOOP算子的ONNX模型,将其转换为JSON格式提取子图,并对子图进行修改(如添加输入节点、删除无关节点)。最后,将JSON转回ONNX格式,完成模型切分与优化。此方法适用于关键路径上的LOOP算子,可有效解决离线推理中的兼容性问题。
942 26
|
存储 文字识别 文件存储
飞桨x昇腾生态适配方案:03_模型训练迁移
本案例以PaddleOCRv4模型为例,详细介绍了将模型迁移到NPU的完整流程。迁移过程中需确保模型功能在新硬件上无误,重点关注偶发性错误及长时间运行时可能出现的问题,并通过日志辅助定位问题。文档涵盖环境搭建、数据集准备、模型配置、训练启动及常见问题排查等内容。例如,通过设置环境变量排查缺失算子,处理Paddle版本兼容性问题,以及解决进程残留等。适合希望将OCR模型部署到NPU的开发者参考。
672 0
|
9月前
|
机器学习/深度学习 缓存 并行计算
90_推理优化:性能调优技术
随着大型语言模型(LLM)规模的不断扩大和应用场景的日益复杂,推理性能已成为制约模型实际部署和应用的关键因素。尽管大模型在各项任务上展现出了令人惊艳的能力,但其庞大的参数量和计算需求也带来了严峻的性能挑战。在资源受限的环境中,如何在保持模型效果的同时,最大化推理性能,成为了研究人员和工程师们亟待解决的核心问题。
630 0
|
API Python
飞桨x昇腾生态适配方案:13_API离线推理
ais_bench 提供了基于昇腾硬件的 Python API,用于离线模型(.om模型)推理。支持静态与动态API场景,如单个或多个OM模型推理。通过 `InferSession` 类加载模型并执行推理,可灵活处理输入输出形状转换。示例代码涵盖图片读取、形状调整、多模型串联推理及资源释放等操作,满足多样化推理需求。
948 26
|
11月前
|
人工智能 缓存 监控
大模型性能测试实战指南:从原理到落地的全链路解析
本文系统解析大模型性能测试的核心方法,涵盖流式响应原理、五大关键指标(首Token延迟、吐字率等)及测试策略,提供基于Locust的压测实战方案,并深入性能瓶颈分析与优化技巧。针对多模态新挑战,探讨混合输入测试与资源优化
|
机器学习/深度学习 存储 API
飞桨x昇腾生态适配方案:06_算子适配举例
本节详细解析了Paddle-API与CANN-Kernel之间的差异及适配策略,涵盖三种主要场景:参数缺失或不对应、数据类型不匹配以及layout转换。针对不同问题提出具体解决方案,如通过默认赋值或计算补充参数、使用`Cast`操作转换数据类型、借助`Transpose`调整数据布局等。同时,以ReluGrad和nll_loss算子为例,深入说明参数对齐、数据类型转换及转置操作的实现流程,为开发者提供清晰的适配指导。
438 0
|
缓存 AI芯片
飞桨x昇腾生态适配方案:02_常用环境变量
本节介绍训练前建议设置的常用环境变量,涵盖NPU私有格式、在线编译、性能优化参数(如`aclnn_scale`和`aclnn_split`)、算子黑名单配置、NPU卡号指定、Paddle内存分配策略及日志设置等内容。通过合理配置这些变量,可有效提升训练性能并解决潜在问题。例如,关闭`FLAGS_npu_storage_format`以禁用NPU私有格式,或调整`ASCEND_MAX_OP_CACHE_SIZE`优化Kernel缓存大小。同时,CANN和Paddle的日志环境变量也提供了调试支持。
651 0