写点什么

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

作者:小顺637
  • 2025-05-12
    北京
  • 本文字数:2074 字

    阅读完需:约 7 分钟

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

安装 PaddleOCR 套件

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

准备数据集

PaddleOCR 支持两种数据格式:


  • ‘lmdb’用于训练以 lmdb 格式存储的数据集(LMDBDataSet);

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

自定义数据集

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

官方数据集下载

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

模型配置文件说明

以 PP-OCRv4_server_rec_ic15_data.yaml 为例(文件名后缀.yml 和 yaml 均可):


Global:# 识别空格  use_space_char: TrueOptimizer:  # 添加学习率衰减策略  lr:    name: Cosine    learning_rate: 0.001Train:  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: 256Eval:  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,7tools/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 不匹配,报错如下:



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



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


export CUSTOM_DEVICE_BLACK_LIST="adam,adam_"
复制代码


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

进程残留


这是进程主动调用了 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.logsort -u ocr_tmp.log > ocr_missing_oplist.log
复制代码

算子缺失后续

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


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

  • 另一种是在 NPU 中不支持的算子。


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


用户头像

小顺637

关注

还未添加个人签名 2023-01-19 加入

还未添加个人简介

评论

发布
暂无评论
飞桨x昇腾生态适配方案:03_模型训练迁移_飞桨_小顺637_InfoQ写作社区