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

举报
RaceSnail 发表于 2025/05/15 00:46:33 2025/05/15
【摘要】 本次案例以PaddleOCRv4的模型为例,介绍将模型迁移到NPU上的流程。迁移过程要保证原模型的功能在新的硬件上不会出现错误,可以借助各种日志辅助定位,此处尤其需要注意的是偶发性错误与长跑时才会出现的错误。 安装PaddleOCR套件# 下载 PaddleOCR 套件源码git clone https://github.com/PaddlePaddle/PaddleOCR# 进入 Padd...

本次案例以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);
    下面以通用数据集为例,介绍如何准备数据集。

自定义数据集

自定义数据集情景较少,若需使用自定义数据集,请参考:
[自定义数据集](https://github.com/PaddlePaddle/PaddleOCR/blob/a210ae481fff1d0f6df827f131bb3efd1a69583b/docs/ppocr/model_train/recognition.md?plain=1#L86)

官方数据集下载

若本地没有数据集,可以在官网下载 [ICDAR2015]数据,用于快速验证。数据集下载地址:
[官方数据集](https://rrc.cvc.uab.es/?ch=4&com=downloads)

模型配置文件说明

以 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输出:

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

常见问题

Paddle版本老旧造成算子报错

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

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

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

export CUSTOM_DEVICE_BLACK_LIST="adam,adam_"

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

进程残留

04_进程残留

这是进程主动调用了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算子)再适配。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。