ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleSpeech Parallel WaveGAN 基准测试:从数据准备到单卡/多卡性能评测的完整实战指南

PaddleSpeech Parallel WaveGAN 基准测试:从数据准备到单卡/多卡性能评测的完整实战指南 人工智能语音音频【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSpeech点击查看免费下载本篇技术文章围绕 tests/benchmark/pwgan/README.md 展开详解 PaddleSpeech 中 Parallel WaveGANPWG声码器的官方 benchmark 评测方案。读完本文你将掌握如何用一条./run_all.sh命令跑通从依赖安装、数据集下载、数据预处理到训练性能测试的完整流水线如何理解run_benchmark.sh中每个参数的含义与日志解析规则以及如何结合训练入口 train.py 与配置文件 default.yaml 复现单卡/多卡、不同 batch size 下的训练吞吐sequences/sec测试。Benchmark 定位与总体流程PaddleSpeech 在tests/benchmark/目录下为代表性模型提供了标准化的性能评测脚本其中 PWG 目录包含 README.md、run_all.sh 与 run_benchmark.sh 三个文件。原始 README 给出的核心操作只有一行./run_all.sh即可运行。README 同时概括了run_all.sh的执行逻辑共 5 个步骤cd到仓库根目录README 写作时的历史称呼为 Deepspeech 目录对应当前仓库根目录安装paddlespeech/t2s所需的依赖从 BOS对象存储下载数据集并解压缩预处理数据集为训练 PWG 所需格式保存到dump文件夹下按照不同参数执行run_benchmark.sh脚本。对照 run_all.sh 的源码可以发现其通过stage/stop_stage变量把这 5 步划分成了 0~3 共四个可独立执行的阶段这种 stage 化设计意味着如果数据已经准备好可以调整stage直接跳到批量运行阶段而不必重复下载数据。脚本开头还有一处值得注意的细节sed -i /set\ -xe/d run_benchmark.sh它在执行前会删除run_benchmark.sh中的set -xe这是为了保证 benchmark 环境下任何单条命令的失败不会中断整个评测流程set -x还会产生大量追踪日志影响性能测试。此外run_all.sh的注释明确给出了可稳定复现性能的基准环境标准 Docker 镜像paddlepaddle/paddle:latest-gpu-cuda10.1-cudnn7Python 3.7PaddlePaddle 2.1.2。做性能对比时环境不一致会导致数据不可比这是复现结果时需要首先对齐的前提。Stage 0环境准备与依赖安装stage 0阶段执行三条命令sudo apt-get install libsndfile1 pip install -e . pushd examples/csmsc/voc1 source path.sh popdlibsndfile1音频 I/O 所需的系统库pip install -e .以可编辑模式安装当前仓库的 PaddleSpeech 包source examples/csmsc/voc1/path.sh加载 PWG 示例CSMSC voc1的环境激活脚本把训练所需的 Python 依赖装入当前环境。选择examples/csmsc/voc1作为环境载体并非偶然——后文会看到benchmark 使用的模型配置文件正是 examples/csmsc/voc1/conf/default.yaml。该配置注释说明其为 Parallel WaveGAN 的超参数配置需要 12 GB 显存在 RTX TITAN 上约需 3 天训练。注意这里存在一个适用性说明该配置是为 CSMSC 数据集调定的若换用其他数据集本 benchmark 实际用的是 BZNSYP部分参数可能需要调整。Stage 1数据集下载与解压缩stage 1阶段负责拉取数据wget https://weixinxcxdb.oss-cn-beijing.aliyuncs.com/gwYinPinKu/BZNSYP.rar mkdir BZNSYP unrar x BZNSYP.rar BZNSYP wget https://paddlespeech.cdn.bcebos.com/Parakeet/benchmark/durations.txt即从 OSS 下载 BZNSYP爱尚中文语音数据集压缩包并解压到BZNSYP目录同时下载配套的durations.txt文件。后者包含每条音频的音素级时长标注是后续预处理的必要输入。需要说明两处与 README 原文的差异以当前仓库源码为准README 第 3 步笼统写从 bos 下载数据集实际run_all.sh注释与代码均明确数据集为 BZNSYP注释中残留了早期 baker 的字样解压需要系统安装unrar这是脚本隐含但未写明的前提。Stage 2数据预处理的三步流水线stage 2阶段把原始语音加工成 PWG 训练可直接消费的格式全部产物落在仓库根目录的dump/下依次执行 5 条命令# 1) 特征提取与切分 python paddlespeech/t2s/exps/gan_vocoder/preprocess.py \ --rootdirBZNSYP/ --dumpdirdump --num-cpu20 \ --cut-silTrue --dur-filedurations.txt \ --configexamples/csmsc/voc1/conf/default.yaml # 2) 计算训练集 mel 特征统计量均值/方差 python utils/compute_statistics.py \ --metadatadump/train/raw/metadata.jsonl --field-namefeats # 3)~5) 用训练集统计量分别归一化 train/dev/test python paddlespeech/t2s/exps/gan_vocoder/normalize.py \ --metadatadump/train/raw/metadata.jsonl --dumpdirdump/train/norm \ --statsdump/train/feats_stats.npy python paddlespeech/t2s/exps/gan_vocoder/normalize.py \ --metadatadump/dev/raw/metadata.jsonl --dumpdirdump/dev/norm \ --statsdump/train/feats_stats.npy python paddlespeech/t2s/exps/gan_vocoder/normalize.py \ --metadatadump/test/raw/metadata.jsonl --dumpdirdump/test/norm \ --statsdump/train/feats_stats.npy第一步preprocess.py——提取 mel 特征并切分数据集preprocess.py 的核心处理链路是读取durations.txt通过get_phn_dur解析音素与时长并merge_silence合并相邻静音按数据集规则把 wav 文件划分为 train/dev/test 三段源码中 BZNSYP 走的是与 baker 相同的--dataset默认分支取前 9800 条为训练集、100 条为验证集、其余为测试集用librosa.load按配置中的采样率default.yaml中fs: 24000重采样若峰值超过 1.0 则做缩放归一--cut-silTrue会裁掉首尾的sil音素对应区段通过LogMelFBank参数来自配置文件n_fft: 2048、n_shift: 300、win_length: 1200、n_mels: 80、fmin: 80、fmax: 7600提取对数 mel 频谱将波形与特征分别存为utt_id_wave.npy和utt_id_feats.npy并写入metadata.jsonl每行含utt_id、num_samples、num_frames、feats、wave五个字段。--num-cpu20对应process_sentences中的ThreadPoolExecutor即以 20 线程并发处理所有句子加速特征提取。第二步compute_statistics.py——统计训练集特征分布compute_statistics.py 基于StandardScaler计算--metadata指定 jsonl 中--field-name这里是feats即 mel 特征字段的均值与方差。若不显式指定--output统计量会保存到 metadata 同级的feats_stats.npy——这正是上一步中 normalize 阶段引用的dump/train/feats_stats.npy的来源dump/train/是dump/train/raw/metadata.jsonl的上一级目录。第三步normalize.py——用训练集统计量归一化全部三个划分normalize.py 用scaler.transform对每条 mel 特征做标准化注意scaler.mean_和scaler.scale_直接由--stats文件恢复从而保证 dev/test 与 train 使用完全一致的分布参数避免数据泄漏输出utt_id_feats.npyfloat32与重写的metadata.jsonl落到dump/{train,dev,test}/norm/目录。最终dump/目录结构与后续训练脚本的引用关系为目录内容被谁引用dump/{train,dev,test}/raw/原始波形与 mel 特征.npy、raw metadata统计量计算dump/train/feats_stats.npy训练集特征均值/方差normalizedump/{train,dev,test}/norm/归一化特征、norm metadatarun_benchmark.sh的--train-metadata/--dev-metadataStage 3批量执行 run_benchmark.shrun_all.sh的 stage 3 是一个三重循环遍历三组参数并分别落盘日志model_mode_list(pwgan) # 模型模式仅 pwgan fp_item_list(fp32) # 精度仅 fp32 bs_item_list(6) # batch size注释说明满 bs 是 26对每组参数依次跑两种硬件配置# 单卡spsingle process CUDA_VISIBLE_DEVICES0 bash tests/benchmark/pwgan/run_benchmark.sh sp 6 fp32 100 pwgan \ | tee ${log_path}/speech_pwgan_bs6_fp32_speed_1gpus 21 # 8 卡多进程mpmulti process CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 bash tests/benchmark/pwgan/run_benchmark.sh sp ... \ # 实际为 CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 bash tests/benchmark/pwgan/run_benchmark.sh mp 6 fp32 100 pwgan \ | tee ${log_path}/speech_pwgan_bs6_fp32_speed_8gpus8p 21两次运行之间sleep 60冷却避免温度/功耗波动影响吞吐数据。日志文件名遵循speech_${model_mode}_bs${bs}_${fp}_speed_{1gpus|8gpus8p}的规范便于后续统一解析LOG_PATH_INDEX_DIR环境变量可指定日志输出目录默认落在当前工作目录。这里还有一个值得留意的参数max_iter传入的是100即 benchmark 只训练 100 步就结束——性能测试关心的是稳定状态下的吞吐而非训练收敛因此用极小的迭代数换取快速、可重复的测量脚本注释也提示了约 5 分钟量级的运行时长。run_benchmark.sh参数定义、训练命令与日志解析规则run_benchmark.sh 是实际执行训练并产出可解析日志的核心脚本。它按位置参数接收 5 个输入_set_params函数给出了完整定义与默认值位置参数变量默认值含义$1run_modespsp单卡 /mp多卡$2batch_size8批大小$3fp_itemfp32数值精度fp32/fp16$4max_iter500最大训练步数可提前中断$5model_itemmodel_item模型标识用于日志命名脚本同时为日志解析预置了一组benchmark 规范参数skip_steps10前几个 step 耗时较长含编译、预热解析时跳过keywordavg_ips:从训练日志中筛选吞吐数据行的关键字index1取匹配行中的第 1 个字段作为数值ips_unitsequences/sec吞吐单位model_name${model_item}_bs${batch_size}_${fp_item}num_gpu_devices从CUDA_VISIBLE_DEVICES解析得出。_train函数拼装最终训练命令train_cmd--batch-size${batch_size} \ --max-iter${max_iter} \ --train-metadatadump/train/norm/metadata.jsonl \ --dev-metadatadump/dev/norm/metadata.jsonl \ --configexamples/csmsc/voc1/conf/default.yaml \ --output-direxp/default \ --run-benchmarktrue # sp 模式单进程 train_cmdpython paddlespeech/t2s/exps/gan_vocoder/parallelwave_gan/train.py --ngpu1 ${train_cmd} # mp 模式8 进程另设 log_parse_filemylog/workerlog.0 train_cmdpython paddlespeech/t2s/exps/gan_vocoder/parallelwave_gan/train.py --ngpu8 ${train_cmd}执行前会先调用 tests/test_tipc/barrier.sh 做多节点同步当PADDLE_TRAINERS_NUM 1时循环执行paddle.distributed.launch run_check直至通过保证多机训练各节点就绪后再起跑避免起点时间差污染性能数据随后用timeout 15m兜底防止挂死最后根据退出码打印SUCCESS/FAIL。脚本末尾的source ${BENCHMARK_ROOT}/scripts/run_model.sh是 PaddlePaddle benchmark 体系的标准接入点run_model.sh中的_run函数会调用本地_train并在训练结束后用配套的 analysis 脚本按上述keyword/skip_steps/index规则解析日志、产出性能数据。注释也给出了降级用法——如果只想产出训练日志而不联调解析可以注掉source与_run改为直接调用_train。训练入口的 benchmark 专用参数与吞吐日志来源parallelwave_gan/train.py 除了常规的--config、--train-metadata、--dev-metadata、--output-dir、--ngpu参数外专门提供了一个 benchmark 参数组benchmark_group.add_argument(--batch-size, typeint, default8) benchmark_group.add_argument(--max-iter, typeint, default400000) benchmark_group.add_argument(--run-benchmark, typestr2bool, defaultFalse)main()中的处理逻辑是当--run-benchmarktrue时命令行传入的--batch-size和--max-iter会覆盖YAML 配置中的batch_size与train_max_steps后者即Trainer的stop_trigger这正是run_benchmark.sh能以同一份default.yaml跑任意 batch size / 迭代数的机制。分布式路径上args.ngpu 1时通过dist.spawn(train_sp, ..., nprocsargs.ngpu)派生 8 个进程每个进程内DistributedBatchSampler负责按 rank 切分数据world_size 1时生成器/判别器会包一层DataParallel。模型与训练组件的组装PWGGenerator、PWGDiscriminator、MultiResolutionSTFTLoss、AdamStepDecay 梯度裁剪、PWGUpdater/PWGEvaluator/Trainer全部由default.yaml驱动关键结构参数包括生成器30 层残差块、3 个 dilation cycle、上采样序列[4, 5, 3, 5]乘积 300 恰等于 hop sizen_shift: 300判别器10 层卷积、conv_channels: 64、LeakyReLU(0.2)损失多分辨率 STFT 损失fft_sizes: [1024, 2048, 512] MSE对抗损失系数lambda_adv: 4.0数据batch_max_steps: 25500约 1.06 秒 24kHz 音频需能被n_shift整除、num_workers: 2。而 benchmark 解析所依赖的avg_ips:日志行来自 trainer.py 训练循环中对每个 batch 耗时与 batch size 的换算输出avg_ips: {:.5f} sequences/sec。也就是说run_benchmark.sh中keywordavg_ips:并非任意约定而是与 PaddleSpeech 训练框架的日志格式严格对应的契约理解这一点对自定义 benchmark 脚本例如为 HiFi-GAN 或 MBMELGAN 新增评测非常关键——只要复用同一套Trainer吞吐日志格式天然一致。实操要点与复现注意事项结合 README 与脚本源码完整复现一次 PWG benchmark 时建议注意以下几点执行位置run_all.sh开头会cd ../../../因此必须在 tests/benchmark/pwgan/ 目录下执行后续所有相对路径dump/、examples/csmsc/voc1/都以仓库根目录为基准环境对齐性能数据可比的前提是对齐 README 注释给出的基准环境Dockerpaddlepaddle/paddle:latest-gpu-cuda10.1-cudnn7、Paddle 2.1.2、Py3.7并对齐batch_size、max_iter、卡数三个自变量阶段裁剪数据下载与预处理stage 1~2成本最高二次运行时应调整stage跳过只跑 stage 3 的批量评测日志产物单卡/8 卡日志分别以_speed_1gpus、_speed_8gpus8p后缀写入LOG_PATH_INDEX_DIR默认当前目录mp 模式下真实训练日志取自mylog/workerlog.08 进程 spawn 后仅解析 rank 0 的日志显存与 bsdefault.yaml注释要求约 12 GB 显存run_all.sh中注释标明 PWG 在该数据配置下满 bs 是 26官方评测点选择的是bs6实际评测时可按显存余量在两者之间取点。小结PaddleSpeech 的 PWG benchmark 用一套 stage 化的 shell 脚本run_all.sh run_benchmark.sh 通用训练入口的--run-benchmark钩子train.py实现了数据流水线标准化 训练命令参数化 日志解析契约化三层解耦数据侧固定 BZNSYP 与统一 mel/统计量归一化流程训练侧只暴露 batch size 与迭代数两个可变量解析侧通过avg_ips:关键字与skip_steps跳过预热步。理解了这条链路后你既能按 README 一键复现官方评测也能将其作为模板扩展到其他声码器模型的吞吐基准测试。赞分享人工智能语音音频【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSpeech点击查看免费下载相关推荐PaddleDetection 通用检测 Benchmark 测试脚本详解从单卡到多卡的性能基准评估实践PaddleDetection 通用检测 Benchmark 测试脚本详解从单卡到多卡的性能基准评估实践 导读 本文以 PaddleDetection 仓库人工智能深度学习计算机视觉JuiceFS 性能评估指南从单机基准测试到多机压测的完整实践JuiceFS 性能评估指南从单机基准测试到多机压测的完整实践 导读 本文基于 JuiceFS 仓库中的官方性能评估指南系统讲解如何对 JuiceFS 文件存储分布式文件系统云原生大数据MiniCPM 基于 LLaMA-Factory 微调实战从数据准备到多卡训练完整指南MiniCPM 基于 LLaMA Factory 微调实战从数据准备到多卡训练完整指南 导读 本文以 OpenBMB/MiniCPM 仓库中 finetune大模型本地部署模型量化微调LoRA工具调用openBMBAscend上一篇终结GraphQL错误混沌用Whoops构建优雅的API异常处理系统下一篇CocoaLumberjack日志等级自动化基于用户角色的动态调整创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表