Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

train det model时卡住 #14304

Closed
3 tasks done
zx4java opened this issue Dec 1, 2024 · 7 comments
Closed
3 tasks done

train det model时卡住 #14304

zx4java opened this issue Dec 1, 2024 · 7 comments

Comments

@zx4java
Copy link

zx4java commented Dec 1, 2024

🔎 Search before asking

  • I have searched the PaddleOCR Docs and found no similar bug report.
  • I have searched the PaddleOCR Issues and found no similar bug report.
  • I have searched the PaddleOCR Discussions and found no similar bug report.

🐛 Bug (问题描述)

我在训练det model时每次在eval之后得第一个save model阶段卡住,必现,调整了batch_size和num_workers也是一样,数据集也调整到少数得35张也是一样得情况,请问是什么原因,使用得是det_mv3_db.yml来训练得。在训练rec模型得时候没有这个问题
Global:
use_gpu: true
use_xpu: false
use_mlu: false
epoch_num: 1200
log_smooth_window: 20
print_batch_step: 10
save_model_dir: ./output/db_mv3/
save_epoch_step: 500

evaluation is run every 2000 iterations

eval_batch_step: [0, 500]
cal_metric_during_train: False
pretrained_model: ./pretrain_models/MobileNetV3_large_x0_5_pretrained
checkpoints:
save_inference_dir:
use_visualdl: False
infer_img: doc/imgs_en/img_10.jpg
save_res_path: ./output/det_db/predicts_db.txt

Architecture:
model_type: det
algorithm: DB
Transform:
Backbone:
name: MobileNetV3
scale: 0.5
model_name: large
Neck:
name: DBFPN
out_channels: 256
Head:
name: DBHead
k: 50

Loss:
name: DBLoss
balance_loss: true
main_loss_type: DiceLoss
alpha: 5
beta: 10
ohem_ratio: 3

Optimizer:
name: Adam
beta1: 0.9
beta2: 0.999
lr:
learning_rate: 0.0005
regularizer:
name: 'L2'
factor: 0

PostProcess:
name: DBPostProcess
thresh: 0.3
box_thresh: 0.6
max_candidates: 1000
unclip_ratio: 1.5

Metric:
name: DetMetric
main_indicator: hmean
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
label_file_list:
- ./train_data/det/train.txt
ratio_list: [1.0]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- DetLabelEncode: # Class handling label
- IaaAugment:
augmenter_args:
- { 'type': Fliplr, 'args': { 'p': 0.5 } }
- { 'type': Affine, 'args': { 'rotate': [-10, 10] } }
- { 'type': Resize, 'args': { 'size': [0.5, 3] } }
- EastRandomCropData:
size: [640, 640]
max_tries: 50
keep_ratio: true
- MakeBorderMap:
shrink_ratio: 0.4
thresh_min: 0.3
thresh_max: 0.7
- MakeShrinkMap:
shrink_ratio: 0.4
min_text_size: 8
- NormalizeImage:
scale: 1./255.
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: 'hwc'
- ToCHWImage:
- KeepKeys:
keep_keys: ['image', 'threshold_map', 'threshold_mask', 'shrink_map', 'shrink_mask'] # the order of the dataloader list
loader:
shuffle: True
drop_last: False
batch_size_per_card: 16
num_workers: 8
use_shared_memory: True
pin_memory: True
Eval:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
label_file_list:
- ./train_data/det/val.txt
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- DetLabelEncode: # Class handling label
- DetResizeForTest:
image_shape: [736, 1280]
- NormalizeImage:
scale: 1./255.
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: 'hwc'
- ToCHWImage:
- KeepKeys:
keep_keys: ['image', 'shape', 'polys', 'ignore_tags']
loader:
shuffle: False
drop_last: False
batch_size_per_card: 1 # must be 1
num_workers: 8
use_shared_memory: True
pin_memory: True

🏃‍♂️ Environment (运行环境)

centos7.9, cuda 11.8, cudnn 8.6
image
A10显存24g单卡

🌰 Minimal Reproducible Example (最小可复现问题的Demo)

nohup python tools/train.py -c pretrain_models/det_mv3_db.yml > /dev/null 2>&1 &

@zx4java
Copy link
Author

zx4java commented Dec 1, 2024

image
就一直卡在这save model, gpu使用率为0, 显存没有释放

@GreatV
Copy link
Collaborator

GreatV commented Dec 2, 2024

根据问题描述和配置文件分析,你在训练 det_mv3_db 模型时遇到的问题主要集中在模型在保存 (save model) 阶段卡住的现象。以下是可能的原因分析及解决方案:


1. 文件系统性能问题

保存模型需要将大量参数写入磁盘,可能因为文件系统性能瓶颈(如硬盘速度过慢或 I/O 竞争)而导致卡住。

解决方案:

  • 检查磁盘性能:
    • 使用 iostatiotop 等工具检查磁盘 I/O 是否有瓶颈。
    • 确保目标保存路径 (save_model_dir) 所在的磁盘有足够的空间和写入速度。
  • 调整保存频率:
    • 在配置文件中增加 Global.save_epoch_step 的值,例如:
      save_epoch_step: 1000
      这样会减少保存模型的频率。
  • 切换保存路径:
    • save_model_dir 指向性能更好的磁盘或 SSD,例如:
      save_model_dir: /tmp/output/db_mv3/

2. 数据加载器 (DataLoader) 卡住

num_workersuse_shared_memory 参数配置不当可能导致数据加载线程死锁。

解决方案:

  • 减少 DataLoader 的并行线程数:
    • Train.loader.num_workersEval.loader.num_workers 设置为较小值(如 24),尝试避免死锁问题:
      num_workers: 2
  • 关闭共享内存:
    • use_shared_memory 设置为 False
      use_shared_memory: False
      这在内存较小或共享内存不足的系统中可能有效。

3. CUDA 或 GPU 占用问题

尽管显存充足,但 CUDA 线程可能因未释放资源而被阻塞,尤其是保存模型时可能涉及 GPU 到 CPU 的数据传输。

解决方案:

  • 检查显存和 GPU 使用情况:
    • 使用 nvidia-smi 检查是否有其他进程占用 GPU。
  • 强制同步 CUDA 操作:
    • 在训练脚本中,在保存模型前强制同步 GPU:
      import paddle
      paddle.device.cuda.synchronize()
  • 降低显存占用:
    • 减少 Train.loader.batch_size_per_card 值,例如:
      batch_size_per_card: 8
    • 或尝试关闭混合精度:
      Global.auto_cast: null

4. PaddlePaddle 版本兼容性问题

你的环境中使用的是 paddlepaddle-gpu 2.6.1paddleocr 2.8.1,某些版本可能存在已知 Bug。

解决方案:

  • 升级 PaddlePaddle 和 PaddleOCR:
    • 确保使用最新稳定版本:
      pip install paddlepaddle-gpu==2.6.2.post118 -i https://mirror.baidu.com/pypi/simple
      pip install paddleocr==2.8.2
  • 检查 PaddleOCR 的 Issue 和 Discussion:

5. 数据加载或数据集问题

数据集可能存在异常,例如损坏的图像或标签,导致在保存模型时触发相关操作卡住。

解决方案:

  • 验证数据集完整性:
    • 确保所有图像路径和标签文件有效,使用如下脚本检查数据:
      import os
      from PIL import Image
      
      with open('./train_data/det/train.txt') as f:
          for line in f:
              img_path, label = line.strip().split('\t')
              if not os.path.exists(img_path):
                  print(f"Missing file: {img_path}")
              try:
                  Image.open(img_path).verify()
              except Exception as e:
                  print(f"Corrupted file: {img_path}, Error: {e}")
  • 减少数据集规模测试:
    • 暂时使用更小的数据集(如 10 张图像)验证训练流程是否正常。

6. 多卡分布式训练问题

如果开启分布式训练,某些参数(如 GPU device ID 或 NCCL 配置)可能不正确导致卡住。

解决方案:

  • 单卡测试:
    • 暂时改为单卡训练,验证问题是否与多卡配置有关:
      python tools/train.py -c configs/det/det_mv3_db.yml
  • 设置 NCCL 环境变量:
    • 增加以下环境变量,避免 NCCL 死锁:
      export FLAGS_cudnn_deterministic=True
      export NCCL_P2P_DISABLE=1

总结

建议按以下步骤逐步排查:

  1. 优化保存路径和频率,检查磁盘性能。
  2. 调整 num_workersuse_shared_memory 参数。
  3. 检查 GPU 问题,尝试同步 CUDA 操作。
  4. 升级 PaddlePaddle 和 PaddleOCR。
  5. 验证数据集完整性,减少数据规模测试。
  6. 如果使用多卡,尝试单卡运行并设置 NCCL 环境变量。

Response generated by 🤖 feifei-bot | chatgpt-4o-latest

@zx4java
Copy link
Author

zx4java commented Dec 3, 2024

感谢大佬的解答,我等会去试下。还有个我非常疑惑的问题,想您帮忙解答下,我训练识别模型的时候看acc精度都还可以能到0.96,然后我使用infer_rec推理的结果是非常好也很准确的,但是切换到使用predict_rec的时候就结果完全不一样了,请问这是什么原因导致的...附上使用命令和模型训练的日志:
python tools/infer_rec.py -c pretrain_models/ch_PP-OCRv3_rec.yml -o Global.pretrained_model=output/rec_ppocr_v3/best_model/model.pdparams Global.infer_img=testimg.png
导出模型使用:python tools/export_model.py -c output/rec_ppocr_v3/config.yml -o Global.checkpoints=output/rec_ppocr_v3/best_model/ -o Global.save_inference_dir=./train_model/rec
使用导出的模型推理命令:
python ./tools/infer/predict_rec.py --image_dir="testimg.png" --rec_model_dir="/usr/local/ocr/PaddleOCR-main/train_model/rec/" --rec_image_shape="3,48,320"
以下是训练结尾日志:
image
部分日志太长截图不全我换行之后的截图
image
恳请大佬帮忙解答下...我是准备再跑一遍文档demo的icdar数据集试试了,换了各种配置和配置文件训练都是这样,不知道是哪里的原因

@GreatV
Copy link
Collaborator

GreatV commented Dec 3, 2024

检查一下字典是不是一样的吧

@zx4java
Copy link
Author

zx4java commented Dec 3, 2024

字典用的就是配置文件中默认的中文字典,没有进行修改过,应该不会.训练配置是这样的
image
然后再调用推理的时候好像也没有办法指定字典吧

@GreatV
Copy link
Collaborator

GreatV commented Dec 3, 2024

这种情况通常是由于 训练和推理阶段的配置参数或模型文件不一致 导致的。以下是可能的原因和解决方案:

1. 模型文件不一致

  • 模型路径:确保在 predict_rec.py 中使用的模型文件是正确导出的模型。

    • 您的推理命令中使用了:
      --rec_model_dir="/usr/local/ocr/PaddleOCR-main/train_model/rec/"
      请确认该目录下存在以下三个文件:
      • inference.pdmodel
      • inference.pdiparams
      • inference.pdiparams.info
  • 导出模型:导出模型时,要使用与训练时相同的配置文件和模型检查点。

    • 您的导出命令是:
      python tools/export_model.py \
        -c output/rec_ppocr_v3/config.yml \
        -o Global.checkpoints=output/rec_ppocr_v3/best_model/ \
        -o Global.save_inference_dir=./train_model/rec
      请确保 config.yml 与训练时使用的配置文件一致,或者包含相同的模型结构和参数。

2. 配置文件和参数不一致

  • 图像形状(rec_image_shape)

    • 您在推理时使用了:

      --rec_image_shape="3,48,320"

      请确认在训练和导出模型时,也使用了相同的图像形状。

    • 在训练配置文件中,通常有如下设置:

      Global:
        image_shape: [3, 48, 320]

      请确保它与推理时一致。

  • 字符字典(Character Dictionary)

    • 识别模型依赖于字符字典文件。如果您在训练时使用了自定义的字典文件,那么在推理时也需要指定相同的字典文件。

    • predict_rec.py 中,可以通过参数指定字典文件路径:

      --rec_char_dict_path="path/to/your/dict.txt"

      如果未指定,可能会使用默认的字典,导致识别结果不正确。

3. 预处理和后处理步骤不一致

  • 数据预处理

    • 确保在训练和推理时,对输入图像进行了相同的预处理操作,包括缩放、归一化等。
  • 后处理参数

    • 某些模型在推理时需要指定解码方式或其他后处理参数,确保这些参数与训练时的设置一致。

4. 版本兼容性问题

  • PaddleOCR 和 PaddlePaddle 版本

    • 确保在训练、导出和推理时,使用的 PaddleOCR 和 PaddlePaddle 框架版本一致。

5. 检查模型是否正确导出

  • 导出日志

    • 查看模型导出时的日志,确保没有报错或者警告信息。
  • 模型可视化

    • 可以使用 Paddle 的工具检查导出的模型,确保模型结构正确。

建议的解决步骤

  1. 确保配置文件的一致性

    • 在训练、导出和推理的每个阶段,使用相同的配置文件或确保配置参数一致。

    • 如果您在训练时使用了 pretrain_models/ch_PP-OCRv3_rec.yml,建议在导出和推理时也使用该配置文件。

  2. 明确指定字符字典文件

    • 在推理命令中添加字符字典路径参数:
      --rec_char_dict_path="ppocr/utils/ppocr_keys_v1.txt"
      或者您的自定义字典文件路径。
  3. 验证图像形状参数

    • 确认 --rec_image_shape 参数在训练、导出和推理时一致。
  4. 使用官方示例进行验证

    • 为了排除环境或流程问题,建议您尝试使用官方提供的示例数据和配置文件进行训练、导出和推理,确保流程正确。
  5. 检查模型文件

    • 确认导出的模型文件完整且未损坏。

    • 确认模型目录下存在正确的模型文件格式。

  6. 更新或重装 PaddleOCR

    • 如果可能,更新 PaddleOCR 到最新版本,或者重新安装,确保没有文件缺失。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants