资讯详情

资讯详情

ESPnet 实战指南:多 GPU 训练、run.sh 阶段控制与 CTC/Attention 解码模式切换

人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载本篇技术指南以 ESPnet 官方文档 doc/tutorial.md 为骨架系统讲解 ESPnet 日常使用中最核心的三类操作多 GPU 训练配置与排障、run.sh流水线的阶段控制以及 CTC / 纯 Attention / 混合 CTC-Attention 三种声学模型的训练与解码切换。读完本文你将掌握两代框架ESPnet1 / ESPnet2在这些场景下的参数差异并能在实际 recipe 中直接套用可运行的命令与配置。一、两代框架的入口与适用范围ESPnet 项目同时维护着 ESPnet1 与 ESPnet2 两条技术路线二者的教程分别位于ESPnet1 入门doc/espnet1_tutorial.mdESPnet2 入门doc/espnet2_tutorial.mdESPnet2 是当前主要演进方向当前仓库版本见 version.txt大部分新增任务与模型如 espnet2/asr、espnet2/tts 等模块都在 ESPnet2 生态中实现。本文涉及的多 GPU 分布式训练与混合 CTC/Attention 模式在 ESPnet2 中有更完整的支持文中将同时给出两代框架的对应写法以便对照。二、多 GPU 训练实践与排障2.1 前置条件NCCL使用多 GPU 训练前必须在环境搭建阶段完成 NCCL 的安装脚本体系中也有对应体现。2.2 单节点与多节点的支持差异ESPnet1仅支持单节点内的多 GPU 训练ESPnet2支持跨节点分布式训练配置方式详见 doc/espnet2_distributed.md。ESPnet2 分布式训练的选项矩阵如下出自 doc/espnet2_distributed.md模式并行方式单/多节点关键选项单节点多进程DistributedDataParallel单--ngpu N --multiprocessing_distributed true单节点多线程DataParallel单--ngpu N --multiprocessing_distributed falseN 主机 × N GPU多进程DistributedDataParallel多--dist_world_size N --ngpu N --multiprocessing_distributed trueN 主机 × N GPU多线程DistributedDataParallel多--dist_world_size N --ngpu N --multiprocessing_distributed falseN 节点 × 1 GPUDistributedDataParallel单/多--dist_world_size N --ngpu 1典型用法示例# 单节点 4 GPU 分布式模式 python -m espnet2.bin.asr_train --ngpu 4 --multiprocessing_distributed true # 退回线程级 DataParallel遇到分布式模式报错时可先尝试 python -m espnet2.bin.asr_train --ngpu 4 --multiprocessing_distributed false # 多节点host1 为 rank0 (host1) python -m espnet2.bin.asr_train \ --multiprocessing_distributed true --ngpu 2 \ --dist_rank 0 --dist_world_size 2 \ --dist_master_addr host1 --dist_master_port 任意空闲端口 (host2) python -m espnet2.bin.asr_train \ --multiprocessing_distributed true --ngpu 2 \ --dist_rank 1 --dist_world_size 2 \ --dist_master_addr host1 --dist_master_port 任意空闲端口--dist_rank与--dist_world_size分别对应 MPI 语义中的RANK进程编号与WORLD_SIZE进程总数也可以直接用环境变量${RANK}、${WORLD_SIZE}指定。多节点场景下推荐使用共享文件系统初始化--dist_init_method file://...避免因端口未知导致连接失败。2.3 关键差异ESPnet2 的 batch size 不随 GPU 数缩放这是多 GPU 使用中最容易踩坑的一点在 ESPnet2 中无论使用多少块 GPU总 batch size 都不会自动放大ESPnet1 则会按 GPU 数量倍增。详细说明见 doc/espnet2_training_option.mdESPnet1--batch_size 10 --ngpu 2→ 实际 batch size 为 20每卡 10ESPnet2--batch_size 10 --ngpu 2→ 实际 batch size 仍为 10每卡仅 5。因此ESPnet2 用户增加 GPU 数量时必须手动调大 batch size否则相当于每卡的有效 batch 变小。此外 ESPnet2 还支持按特征长度动态调整 batch 的--batch_type folded/length/numel等可变 batch 模式doc/espnet2_training_option.md 中有完整对照表可根据显存利用率需求选择。2.4 推理阶段不支持多 GPU请拆分任务ESPnet 官方明确不支持多 GPU 推理。推荐的替代方案是把识别任务拆成多个子任务例如按语音段切分再分配到多块 GPU 上并行执行。2.5 性能瓶颈排查nvidia-smi 与数据预取当多 GPU 训练加速不明显时应先用nvidia-smi观察 GPU 利用率若GPU-Util百分比偏低瓶颈通常来自磁盘读取I/O缓解手段是在run.sh中开启数据预取--n-iter-processes 2注意数据预取会显著消耗 CPU 内存增加进程数时务必评估内存余量。从源码结构看该参数对应训练器中数据加载阶段的多进程预取能力训练入口位于 espnet2/bin/asr_train.py实际加载与迭代逻辑在 espnet2/train 目录内实现它通过提前加载后续批次来掩盖磁盘延迟代价是内存占用上升。三、run.sh 阶段控制从指定阶段开始、到指定阶段停止run.sh是 ESPnet 各 recipe 的总入口如 egs2/TEMPLATE/asr1/asr.shrun.sh最终调用它内部按流水线划分为多个 stage覆盖数据准备、特征提取、统计量计算、语言模型、声学模型训练、解码评分、打包发布等步骤。当某一步失败后无需重跑全部流程可以只从指定阶段开始# 从第 3 个 stage 开始执行到第 5 个 stage 停止 ./run.sh --stage 3 --stop-stage 5实现上asr.sh中每个 stage 都由形如if [ ${stage} -le N ] [ ${stop_stage} -ge N ]的条件守卫egs2/TEMPLATE/asr1/asr.sh--stage与--stop-stage分别对应脚本顶部的stage默认 1与stop_stage默认 10000即默认跑完全程两个变量egs2/TEMPLATE/asr1/asr.sh。此外脚本还提供了--skip_stages用于跳过特定阶段、--skip_data_prep/--skip_train/--skip_eval等快捷开关可按需组合使用。各阶段运行时还会在输出目录下生成run.sh例如统计量目录、语言模型目录、声学模型实验目录中都会生成对应 stage 的可续跑脚本源码见 egs2/TEMPLATE/asr1/asr.sh 等方便从中间阶段断点续跑。四、训练模式切换CTC、纯 Attention 与混合 CTC/AttentionESPnet 可以非常方便地在 CTC、纯 Attention 与混合 CTC/Attention 三种训练/解码模式间切换核心就是一个权重参数ESPnet1mtlalphamulti-task learning alphaESPnet2ctc_weight配置在model_conf下。4.1 训练侧配置# ---------- ESPnet1 ---------- # 混合 CTC/Attention默认 mtlalpha: 0.3 # 纯 CTC mtlalpha: 1.0 # 纯 Attention mtlalpha: 0.0 # ---------- ESPnet2 ---------- # 混合 CTC/Attention默认 model_conf: ctc_weight: 0.3 # 纯 CTC model_conf: ctc_weight: 1.0 # 纯 Attention model_conf: ctc_weight: 0.0在 ESPnet2 的模型实现中ctc_weight的真实语义可以从源码确认espnet2/asr/espnet_model.py 声明了默认值ctc_weight: float 0.5注意模型层的默认值与 recipe 中惯用的 0.3 不同recipe 通常会显式覆盖并带有取值范围断言0.0 ctc_weight 1.0espnet2/asr/espnet_model.py。前向计算时损失按如下规则组合espnet2/asr/espnet_model.pyif self.ctc_weight 0.0: loss loss_att elif self.ctc_weight 1.0: loss loss_ctc else: loss self.ctc_weight * loss_ctc (1 - self.ctc_weight) * loss_att即ctc_weight0.0时只计算 Attention 损失ctc_weight1.0时只计算 CTC 损失中间值则是加权求和。训练中还会据此自动裁剪计算分支例如ctc_weight1.0时会跳过 Attention 解码器训练并输出警告Set decoder to none as ctc_weight1.0espnet2/asr/espnet_model.py。4.2 三种模式的特点与适用场景混合 CTC/Attention默认推荐模式训练与识别均对解码长度启发式不敏感详见本文第五节鲁棒性最好纯 CTC解码速度快但不计算验证集准确率模型选择依据的是损失值纯 Attention需要精细设置最大/最小假设长度对长度比输入帧数 vs 输出 token 数敏感。关于混合模式的详细机理可参考原文档引用的文献 [2] 与 [3]ESPnet 系列论文中对 CTC/Attention 混合训练的论述。五、解码配置beam search、长度比与模型选择5.1 三种模式的解码参数# ---------- ESPnet1 ---------- # 混合 CTC/Attention默认 ctc-weight: 0.3 beam-size: 10 # 纯 CTC ctc-weight: 1.0 ## 最佳路径解码默认可省略 api 设置 api: v1 ## 带 beam search 的前缀搜索解码 api: v2 beam-size: 10 # 纯 Attention ctc-weight: 0.0 beam-size: 10 maxlenratio: 0.8 minlenratio: 0.3 # ---------- ESPnet2 ---------- # 混合 CTC/Attention默认 ctc_weight: 0.3 beam_size: 10 # 纯 CTC ctc_weight: 1.0 beam_size: 10 # 纯 Attention ctc_weight: 0.0 beam_size: 10 maxlenratio: 0.8 minlenratio: 0.3ESPnet2 的识别入口espnet2/bin/asr_inference.py对这些参数的默认值定义如下--beam_size默认 20recipe 中常显式设为 10 或更小以换取速度--maxlenratio默认 0.0此时启用末端检测end-detect功能自动确定最大假设长度若为负值则取其绝对值作为恒定的最大输出长度--minlenratio默认 0.0用于确定最小输出长度--penalty插入惩罚默认 0.0--nbest输出 N-best 假设数默认 1。5.2 maxlenratio / minlenratio 的调优经验长度比参数直接决定假设长度与输入帧数的关系调优原则如下插入错误多输出了多余词多→ 降低maxlenratio删除错误漏词多→ 提高minlenratio。需要特别说明最优取值取决于输入帧数与输出 label 长度的比值而该比值会随**语言和 BPE 单元subword 切分**的变化而改变因此跨语言、跨词表迁移时需重新标定不能照搬其他 recipe 的值。5.3 负 maxlenratio恒定长度解码与话语分类将maxlenratio设为负值可让解码停止条件与输入帧数无关直接使用固定最大长度当maxlenratio-1时解码在输出第一个 token 后立即停止这一特性可用于模拟话语级分类utterance classification任务非常适合口语理解SLU和说话人识别speaker identification等只需输出一个类别标签的场景。这也与 espnet2/bin/lm_inference.py 中的用法maxlenratio-self.maxlen负值表示恒定最大长度在语义上保持一致。5.4 纯 CTC 模式下的最佳模型选择由于纯 CTC 模式不计算验证准确率模型选择必须改用损失值作为准则# ESPnet1配置在训练 yaml 中 best_model_criterion: - - valid - cer_ctc - min # ESPnet2在 run.sh 中直接指定识别用权重 ./run.sh --recog_model model.loss.bestESPnet2 的--recog_model接受model.loss.best按验证损失最小选择等命名该机制在 egs2/TEMPLATE/asr1/asr.sh 的解码 stage 中体现可灵活指定具体权重文件。六、小结一张表对照两代框架操作ESPnet1ESPnet2混合 CTC/Attention 训练权重mtlalpha: 0.3model_conf.ctc_weight: 0.3纯 CTC 训练mtlalpha: 1.0ctc_weight: 1.0纯 Attention 训练mtlalpha: 0.0ctc_weight: 0.0解码模式权重ctc-weightctc_weight纯 CTC 前缀搜索api: v2beam-sizebeam_size模型选择CTC 模式cer_ctc最小化--recog_model model.loss.best多节点分布式不支持支持见 doc/espnet2_distributed.md实践要点回顾多 GPU 训练前装好 NCCLESPnet2 下记得按 GPU 数手动放大 batch size训练效率不升先查nvidia-smiI/O 瓶颈用--n-iter-processes 2缓解run.sh --stage N --stop-stage M实现流水线断点续跑CTC 用ctc_weight1.0并切换模型选择准则纯 Attention 务必调好maxlenratio/minlenratio需要定长输出如分类任务时直接使用负maxlenratio。赞分享人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐SpeechBrain 实战Switchboard ASR 端到端 seq2seq 训练CTC Attention Beam Search 解码SpeechBrain 实战Switchboard ASR 端到端 seq2seq 训练CTC Attention Beam Search 解码人工智能深度学习语音音频NLP预训练PaddleSpeech 训练可视化扩展解析Attention/CTC 报告绘制模块实战与源码剖析PaddleSpeech 训练可视化扩展解析Attention/CTC 报告绘制模块实战与源码剖析 导读 本文围绕 PaddleSpeech 语音工具包中 p人工智能语音音频NLP媒体生成Jukebox训练实战多GPU分布式训练配置与监控指南Jukebox训练实战多GPU分布式训练配置与监控指南 在音乐生成领域Jukebox作为前沿的生成模型项目描述Code for the paper J人工智能大模型音乐生成音频预训练上一篇CVPR 2019论文复现Meta-Transfer Learning小样本学习代码实现深度剖析下一篇微服务架构实战指南从零搭建Spring Cloud分布式系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →