资讯动态

PaddleOCR 训练 Benchmark 实战:用 DB/EAST/PSE 检测模型量化训练 IPS 性能

发布时间:2026/9/10 15:57:03 来源:尧图企业网站定制
PaddleOCR 训练 Benchmark 实战用 DB/EAST/PSE 检测模型量化训练 IPS 性能【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCRPaddleOCR 仓库在benchmark/目录下内置了一套完整、可复现的训练性能基准测试方案以 ICDAR2015 数据集为固定测试条件对 DB、EAST、PSE 三类文本检测算法在单卡/多卡、batch_size8/16 的 4 种组合下执行短时训练并从训练日志中自动解析出 IPSImages/samples per Second吞吐指标。读完本文你将掌握如何运行benchmark/run_det.sh一键完成“装依赖、下数据、跑训练、析日志”全流程理解run_benchmark_det.sh中单卡/多卡训练命令的构造方式以及analysis.py从日志文本中提取性能数据的底层原理与参数含义。Benchmark 目录定位与测试条件benchmark/readme.md明确了该目录的用途用于获取并分析训练日志衡量不同检测算法在标准环境下的训练性能为后续模型优化混合精度、通信优化等提供可对比的基线数据。其固定测试条件如下项目取值说明数据集ICDAR2015text_localization1000 张训练图像 500 张测试图像通过脚本自动下载BackboneResNet18_vdDB 模型EAST/PSE 使用 ResNet50_vd 配置Batch size8 和 16两种批量组合便于观察吞吐随 bs 的变化运行方式单卡sp 单机多卡mp默认单卡使用 0 号 GPU精度fp32脚本预留了 fp16 扩展位fp_item_list(fp32)参考环境paddlepaddle/paddle:latest-gpu-cuda10.1-cudnn7Paddle 2.1.2Python 3.7见 run_det.sh 头部注释目录内还有独立的 PaddleOCR_DBNet/ 子目录那是 DB 算法的参考实现与配套配置/工具本文聚焦根目录下的通用 benchmark 流程。一键运行benchmark/run_det.sh全流程在 PaddleOCR 仓库根目录下执行bash benchmark/run_det.sh按 readme 描述该脚本包含以下过程安装依赖python -m pip install -r requirements.txt下载数据与预训练模型将 ICDAR2015 数据集icdar2015.tar下载到./train_data/并解压同时拉取ResNet18_vd_pretrained.pdparams、ResNet50_vd_pretrained.pdparams等预训练权重到./pretrain_models/批量执行训练遍历模型列表与 batch size 组合先单机单卡、后单机多卡日志分析获取 IPS训练日志交由 analysis.py 解析出吞吐指标。从 run_det.sh 源码可以看到批量执行的矩阵结构model_mode_list(det_res18_db_v2.0 det_r50_vd_east det_r50_vd_pse) fp_item_list(fp32) for model_mode in ${model_mode_list[]}; do for fp_item in ${fp_item_list[]}; do if [ ${model_mode} det_r50_vd_east ]; then bs_list(16) # EAST 只测 bs16 else bs_list(8 16) # DB / PSE 测 bs8 和 16 fi ...每个组合执行两种模式# 单卡sp默认 0 号卡 CUDA_VISIBLE_DEVICES0 bash benchmark/run_benchmark_det.sh ${run_mode} ${bs_item} ${fp_item} 1 ${model_mode} | tee ${log_path}/${log_name}_speed_1gpus 21 # 单机 8 卡多进程mp CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 bash benchmark/run_benchmark_det.sh ${run_mode} ${bs_item} ${fp_item} 2 ${model_mode} | tee ${log_path}/${log_name}_speed_8gpus8p 21也就是说每个模型每种 batch size 都会跑 sp 和 mp 各一次。以 DBdet_res18_db_v2.0为例最终得到 4 个训练日志文件命名来自run_benchmark_det.sh中的日志命名规则det_res18_db_v2.0_sp_bs16_fp32_1 det_res18_db_v2.0_sp_bs8_fp32_1 det_res18_db_v2.0_mp_bs16_fp32_1 det_res18_db_v2.0_mp_bs8_fp32_1命名格式为{模型配置名}_{sp|mp}_bs{批量}_{精度}_{GPU 数}其中 GPU 数由CUDA_VISIBLE_DEVICES中逗号分隔的数量自动算出。训练入口解析run_benchmark_det.sh如何构造训练命令run_benchmark_det.sh 接收 5 个位置参数并在_set_params函数中完成参数解析参数含义默认值$1run_modesp单卡/mp多卡sp$2batch_size每卡 batch size64$3fp_itemfp32/fp16fp32$4max_epoch用于控制训练提前结束10$5model_item对应configs/det/下的 yml 文件名—同时它设置了日志解析所需的固定参数keywordips:日志中筛选性能行的关键字、skip_steps2跳过前 2 个 step规避初期数据加载/预热造成的耗时偏大、ips_unitimages/sec。核心训练命令在_train函数中拼装train_cmd-c configs/det/${model_item}.yml \ -o Train.loader.batch_size_per_card${batch_size} \ Global.epoch_num${max_epoch} \ Global.eval_batch_step[0,20000] \ Global.print_batch_step2-c configs/det/${model_item}.yml指定算法配置例如det_res18_db_v2.0.yml-o覆盖配置项benchmark 只关心性能而非收敛因此把epoch_num压到很小、eval_batch_step设为[0, 20000]几乎不触发评估、并把print_batch_step提到 2让日志更密集、便于解析单卡直接python tools/train.py ...多卡走 Paddle 分布式启动器python -m paddle.distributed.launch --log_dir./mylog --gpus$CUDA_VISIBLE_DEVICES tools/train.py ${train_cmd}多卡模式下分布式启动器会把各 worker 日志写到./mylog/脚本训练结束后用workerlog.0覆盖主日志文件保证 4 个日志文件命名统一。整个训练被timeout 15m包裹只跑约 15 分钟benchmark 的目标是拿到稳定的吞吐采样而非训练出可用模型。训练失败时脚本会导出job_fail_flag1供后续解析环节识别失败任务。日志分析analysis.py如何从文本日志算出 IPSanalysis.py 是通用的“训练日志 → 性能指标”解析器核心是TimeAnalyzer类_distil()逐行读取日志文件按--keyword此处为ips:筛选命中行再按--separator分词、按--position定位字段、按--range截取数字子串最终解析成float序列存入records。这一步把非结构化的日志行变成了数值数组analysis()对records计算均值并支持skip_steps跳过开头的异常样本对应脚本里的skip_steps2同时给出跳过区间内的 Min/Max 便于判断稳定性_get_fps()按model_mode把原始量纲换算为吞吐指标。_get_fps()支持的模式与换算关系analysis.py 中_get_fps实现model_mode日志量纲输出量纲换算0s/stepsamples/s(batch_size * gpu_num) / avg1steps/ssteps/s直接取均值2s/stepsteps/s1 / avg3steps/ssamples/sbatch_size * gpu_num * avg4s/epochs/epoch直接取均值-1自定义由--ips_unit指定gpu_num * avg命令行参数中还有几个值得注意的选项--index表示分析维度1: speed, 2: mem, 3: profiler, 6: max_batch_size--index3时会切换到 profiler 分析分支提取Framework overhead、Computation time、GpuMemcpy等计时项--run_modesp/mp和--gpu_num参与吞吐换算。脚本最终把FINAL_RESULT、单位、模型名、任务名等信息以 JSON 打印便于接入数据库或前端展示。IPS 指标在训练日志中的来源被解析的ips:字段并非 benchmark 脚本自己打印的而是训练主循环的输出。在 tools/program.py 中每当global_step % print_batch_step 0时会输出一行形如epoch: [0/10], global_step: 100, ..., avg_batch_cost: 0.12345 s, avg_samples: 800.00000, ips: 6480.12345 samples/s, eta: ...其中ips的计算是total_samples / train_batch_cost即每print_batch_step个 step 累计的样本数除以耗时单位为 samples/s。由于run_benchmark_det.sh把Global.print_batch_step覆盖为 2日志中大约每 2 个 step 就有一行可解析记录样本量充足解析结果稳定。这也是 readme 中“日志分析获取 IPS”这一步的完整链路tools/train.py 训练 → program.py 按 print_batch_step 打印 ips: x samples/s → 日志文件落盘命名 {model}_{sp|mp}_bs{bs}_{fp}_{gpu数} → analysis.py 按关键字 ips: 提取数值 → 跳过前 N 步 → 输出平均 IPS模型配置侧DB 检测的训练配置细节benchmark 测试的 DB 模型使用 configs/det/det_res18_db_v2.0.yml几个与性能测试直接相关的配置Architecture: model_type: det algorithm: DB Backbone: name: ResNet_vd layers: 18 # 对应 readme 中 resnet18_vd Neck: name: DBFPN Head: name: DBHead k: 50 ... Train: dataset: data_dir: ./train_data/icdar2015/text_localization/ label_file_list: - ./train_data/icdar2015/text_localization/train_icdar2015_label.txt loader: batch_size_per_card: 8 # 会被 benchmark 脚本 -o 覆盖为 8/16 num_workers: 4 Global: print_batch_step: 2 # 默认即为 2与 benchmark 覆盖值一致 pretrained_model: ./pretrain_models/ResNet18_vd_pretrained可以看到配置中batch_size_per_card默认 8EAST/PSE 则分别使用 det_r50_vd_east.yml、det_r50_vd_pse.ymlResNet50_vd backbone参数量更大因此脚本对 EAST 只测 bs16 一种组合控制实验时长。数据加载侧使用了EastRandomCropData960×960 随机裁剪、IaaAugment等增强这些 CPU 密集算子是否成为 dataloader 瓶颈也是从日志中avg_reader_cost与avg_batch_cost对比可以观察到的内容。复现与扩展 benchmark 的建议最小复现只需单卡即可运行run_benchmark_det.sh的 sp 分支得到det_res18_db_v2.0_sp_bs8_fp32_1这类日志后用analysis.py --filename 日志 --keyword ips: --base_batch_size 8 --skip_steps 2 --index 1 --model_mode 0得到 samples/s 指标扩展模型向model_mode_list追加新的configs/det/*.yml名称即可纳入同一套流程前提是配置遵循相同的Global/Train字段结构使-o覆盖项生效扩展精度把fp_item_list增加fp16需要同时在 yml 或-o参数中开启 AMP 相关开关脚本目前只预留了参数位结果解读注意benchmark 训练受timeout 15m和max_epoch双限制且skip_steps2会丢弃开头两个 step 的样本因此得到的 IPS 是“稳定阶段的训练吞吐”与最终模型精度无关不能据此比较模型效果。小结PaddleOCR 的 benchmark 目录提供了一条标准化的训练性能测量流水线run_det.sh负责环境与数据准备、run_benchmark_det.sh负责在 sp/mp × bs8/bs16 矩阵下短时训练并统一命名日志、analysis.py负责按关键字解析日志中的ips:记录并换算为 samples/s。整套方案以 ICDAR2015 数据集和固定配置为控制变量使不同算法、不同硬件、不同优化策略下的训练吞吐具备可比性是开展 PaddleOCR 检测模型训练优化时值得直接复用的基线工具。【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价