飞桨x昇腾生态适配方案:03_模型训练迁移

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本案例以PaddleOCRv4模型为例,详细介绍了将模型迁移到NPU的完整流程。迁移过程中需确保模型功能在新硬件上无误,重点关注偶发性错误及长时间运行时可能出现的问题,并通过日志辅助定位问题。文档涵盖环境搭建、数据集准备、模型配置、训练启动及常见问题排查等内容。例如,通过设置环境变量排查缺失算子,处理Paddle版本兼容性问题,以及解决进程残留等。适合希望将OCR模型部署到NPU的开发者参考。

本次案例以PaddleOCRv4的模型为例,介绍将模型迁移到NPU上的流程。
迁移过程要保证原模型的功能在新的硬件上不会出现错误,可以借助各种日志辅助定位,此处尤其需要注意的是偶发性错误与长跑时才会出现的错误。

安装PaddleOCR套件

# 下载 PaddleOCR 套件源码
git clone https://github.com/PaddlePaddle/PaddleOCR
# 进入 PaddleOCR 源码目录
cd PaddleOCR
# 安装 Python 依赖库
pip install -r requirements.txt
# 编译安装 PaddleOCR
python setup.py install

准备数据集

PaddleOCR 支持两种数据格式:

  • ‘lmdb’用于训练以lmdb格式存储的数据集(LMDBDataSet);
  • ‘通用数据’用于训练以文本文件存储的数据集(SimpleDataSet);
    下面以通用数据集为例,介绍如何准备数据集。

    自定义数据集

    自定义数据集情景较少,若需使用自定义数据集,请参考:自定义数据集

    官方数据集下载

    若本地没有数据集,可以在官网下载 [ICDAR2015]数据,用于快速验证。数据集下载地址:官方数据集

    模型配置文件说明

    以 PP-OCRv4_server_rec_ic15_data.yaml 为例(文件名后缀.yml和yaml均可):
Global:
# 识别空格
  use_space_char: True
Optimizer:
  # 添加学习率衰减策略
  lr:
    name: Cosine
    learning_rate: 0.001
Train:
  dataset:
    # 数据集格式,支持LMDBDataSet以及SimpleDataSet
    name: SimpleDataSet
    # 数据集路径
    data_dir: ./train_data/
    # 训练集标签文件
    label_file_list: ["./train_data/train_list.txt"]
    transforms:
           - RecResizeImg:
          # 修改 image_shape 以适应长文本
          image_shape: [3, 48, 320]
       loader:
      # 单卡训练的batch_size
    batch_size_per_card: 256
Eval:
  dataset:
    # 数据集格式,支持LMDBDataSet以及SimpleDataSet
    name: SimpleDataSet
    # 数据集路径
    data_dir: ./train_data
    # 验证集标签文件
    label_file_list: ["./train_data/val_list.txt"]
    transforms:
            - RecResizeImg:
          # 修改 image_shape 以适应长文本
          image_shape: [3, 48, 320]
       loader:
    # 单卡验证的batch_size
    batch_size_per_card: 256

注意:预测/评估时的配置文件请务必与训练一致。

启动训练

单卡训练

单卡训练训练周期长,不推荐,可通过环境变量ASCEND_RT_VISIBLE_DEVICES 来指定卡号:

export ASCEND_RT_VISIBLE_DEVICES=7

启动训练:

python tools/train.py -c PP-OCRv4_server_rec_ic15_data.yaml -o Global.use_gpu=False Global.use_npu=True

多卡训练

通过 --gpus 或者 --devices 参数指定卡号

python -m paddle.distributed.launch --devices 0,1,2,3,4,5,6,7
tools/train.py -c PP-OCRv4_server_rec_ic15_data.yaml -o Global.use_gpu=False Global.use_npu=True

参数说明:
-c:指定训练配置文件路径(如config/rec/rec_icdar15_train.yml)
-o:覆盖配置文件中的参数(如预训练模型路径、输出目录等)
-m:paddle.distributed.launch:调用PaddlePaddle分布式训练功能

训练日志

正常启动训练后,会看到以下log输出:
01_训练日志.png

log 中字段信息含义:
epoch:当前迭代轮次
iter:当前迭代次数
lr:当前学习率
loss:当前损失值
acc:当前batch的准确率
norm_edit_dis:当前 batch 的编辑距离
samples:当前 batch 内的样本数
ips:每秒处理图片的数量

常见问题

Paddle版本老旧造成算子报错

PaddleCustomDevice算子适配代码更新后,adam算子参数amsgrad不匹配,报错如下:
02_Paddle版本老旧造成算子报错.png

之后在算子适配代码里面设置amsgrad = false,依旧报错:
03_设置amsgrad为false后依旧报错.png

定位到adam算子依旧有问题,这是由于paddle框架与paddlecustomdeviece的算子入参不一致导致的。此处可以通过将adam算子放入黑名单的方式来规避报错:

export CUSTOM_DEVICE_BLACK_LIST="adam,adam_"

后续下载最新的paddlepaddle日构建包并安装后,发现不用拉黑算子,问题解决。

进程残留

04_进程残留.png

这是进程主动调用了abort()触发的强制终止信号,意味着代码中存在不可恢复的错误(例如内存越界、空指针访问等),PID 117360指向崩溃的进程编号,可通过ps -ef | grep 117360关联具体应用模块,并杀死相关的残余进程:

pkill -9 -f "python"

排查缺失算子

当前并非所有的飞桨算子都在NPU上有对应的实现,对NPU上缺失的算子飞桨框架会自动将其异构到CPU上执行,排查缺失算子的方法如下:

  • 通过环境变量设置输出日志级别
export GLOG_v=3
  • 启动模型训练
python tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml > ocr.log 2>&1
# grep日志的loss信息,保证并至少完成一次iter/step 的前向与反向
grep Loss ocr.log
  • 搜索缺失算子
cat ocr.log | grep -a “fallingback to CPU” |cut -d “ ” -f6 >ocr_tmp.log
sort -u ocr_tmp.log > ocr_missing_oplist.log

算子缺失后续

缺失算子一般分两种情况:

  • 一种是NPU已支持(即CANN包中有),但是飞桨侧未适配(可以在昇腾社区aclnn-API查找CANN包内是否有相应算子);
  • 另一种是在NPU中不支持的算子。

第一种情况可参考aclnn算子适配章节;第二种情况则需要先在CANN侧完成算子开发(ascendC算子)再适配。

目录
相关文章
|
4月前
|
存储 自然语言处理 机器人
OpenClaw 搭团队太折腾?这个 Skill一键搞定多智能体协作
OpenClaw是优雅的多智能体基座,各Agent独立运行、消息驱动。在此基础上,针对协作失序、配置复杂、过程黑盒等痛点,agentrun-team Skill提供一键组队能力:自动完成身份配置、注入协作规范、构建团队意识与闭环流程,10分钟即可交付可协同、可审计、高透明的智能体团队。
|
7月前
|
负载均衡 Docker Python
vLLM-Ascend 安装部署与环境配置指南
vLLM-Ascend 是 vLLM 项目专为华为昇腾 NPU 设计的硬件插件,支持主流大模型与多模态架构,提供高性能推理能力。项目结构清晰,涵盖核心算子、工具脚本与容器化部署方案,兼容单/多节点环境,助力高效构建昇腾上的 AI 推理服务。
3633 1
|
机器学习/深度学习 PyTorch 算法框架/工具
飞桨x昇腾生态适配方案:00_整体方案介绍
本文详细介绍PaddlePaddle与NPU的适配工作,涵盖训练与推理支持、性能优化及离线推理方案。PaddleCustomDevice作为适配层,支持主流模型(详见飞桨-昇腾模型列表),多数性能媲美V100,部分调优模型接近0.8*A800。硬件适配主要针对A2芯片,A1兼容但310系列建议离线推理。提供常用模型仓链接及整体方案导览,包括环境准备、算子适配、性能调优和Paddle转ONNX/OM等内容。
971 0
|
机器学习/深度学习 Docker 容器
飞桨x昇腾生态适配方案:01_基础环境准备
本指南详细介绍在ARM环境中准备CANN环境、安装Paddle深度学习框架及PaddleCustomDevice的过程。首先下载并加载CANN镜像,启动Docker容器;接着通过日构建包或源码编译安装PaddlePaddle和PaddleCustomDevice;可选更新CANN版本时需注意环境变量配置与路径设置。最后提供基础功能检查方法,包括硬件后端、版本验证及框架健康检查,确保环境搭建成功。
1177 0
vllm+vllm-ascend本地部署QwQ-32B
本指南介绍如何下载、安装和启动基于Ascend的vLLM模型。首先,可通过华为镜像或Hugging Face下载预训练模型;其次,安装vllm-ascend,支持通过基础镜像(如`quay.io/ascend/vllm-ascend:v0.7.3-dev`)或源码编译方式完成;最后,使用OpenAI兼容接口启动模型,例如运行`vllm serve`命令,设置模型路径、并行规模等参数。适用于大模型推理场景,需注意显存需求(如QwQ-32B需70G以上)。
5070 17
|
7月前
|
Linux Docker 容器
docker下部署 vLLM 启动Qwen3-VL-32B-Instruct模型
本文介绍在CentOS系统、A10 6×24G显卡环境下,通过Docker部署vLLM并启动Qwen3-VL-32B-Instruct大模型的完整流程,涵盖镜像拉取、容器配置、多卡并行与显存优化设置,支持32K上下文,附带启动脚本及调用验证示例。
8772 2
|
JSON 数据格式 AI芯片
飞桨x昇腾生态适配方案:14_loop算子缺失(上):ONNX模型拆分
本文针对NPU不支持LOOP算子的问题,提出一种解决方案:将ONNX模型拆分为含LOOP算子和不含LOOP算子的子图,单独推理LOOP部分。通过构造包含LOOP算子的ONNX模型,将其转换为JSON格式提取子图,并对子图进行修改(如添加输入节点、删除无关节点)。最后,将JSON转回ONNX格式,完成模型切分与优化。此方法适用于关键路径上的LOOP算子,可有效解决离线推理中的兼容性问题。
938 26
|
Python
飞桨x昇腾生态适配方案:15_loop算子缺失(下):for循环替换loop
本章节基于上一内容,将ONNX模型拆分为loop算子部分与非loop算子部分,分别转换为OM模型。通过使用for循环替换loop算子的计算逻辑,构造子图执行流程,并编写OM模型推理脚本进行验证。同时,编写ONNX模型推理脚本对比两者推理结果,确保一致性。实验结果表明,拆分后的OM模型与原始ONNX模型推理结果一致,证明方案可行。
565 27
|
API Python
飞桨x昇腾生态适配方案:13_API离线推理
ais_bench 提供了基于昇腾硬件的 Python API,用于离线模型(.om模型)推理。支持静态与动态API场景,如单个或多个OM模型推理。通过 `InferSession` 类加载模型并执行推理,可灵活处理输入输出形状转换。示例代码涵盖图片读取、形状调整、多模型串联推理及资源释放等操作,满足多样化推理需求。
947 26
|
文字识别 算法 API
飞桨x昇腾生态适配方案:04_模型精度对齐
本文详细介绍了模型在不同硬件(如GPU与NPU)间迁移时的精度对齐方法,包括前向和反向对齐的具体步骤。前向对齐通过模块化对比计算结果(如平均值、最大最小值等),确保误差在合理范围内;反向对齐则聚焦于梯度差异,利用二分法定位问题算子。同时,文章结合PPHGNet_small和MultiHead等具体模块代码,说明了如何打印输出并分析中间结果。此外,还探讨了私有格式、梯度异常及特殊shape等可能影响精度的因素,并提出相应解决策略。整体流程清晰,为跨硬件模型迁移提供了实用指导。
800 10