ARTICLE DETAIL

资讯详情

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

使用 Transformers 微调 Wav2Vec2 完成音频分类:单卡与多卡实战指南(FlexGen 仓库示例解析)

使用 Transformers 微调 Wav2Vec2 完成音频分类:单卡与多卡实战指南(FlexGen 仓库示例解析) 推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载导读本文基于当前仓库中 Transformersv4.24.0示例代码系统讲解如何用 PyTorch 对 Wav2Vec2 系列预训练语音模型进行音频分类微调。文章覆盖单 GPUSUPERB 关键词识别与多 GPUCommon Language 语种识别两条完整命令、全部核心参数的源码级含义、数据预处理与训练流程的底层实现以及将微调模型推送至 Hugging Face Hub 的完整步骤。读完本文你将能直接复制命令跑通音频分类微调并理解每一步背后的源码逻辑。一、示例概览为什么预训练语音模型微调效率极高音频分类是语音领域的经典任务关键词唤醒、语种识别、情感识别、声学事件检测等。本示例展示的核心思路是使用在海量无标注音频上以无监督方式预训练的语音表征模型如 Wav2Vec2、HuBERT、XLSR-Wav2Vec2在下游分类数据集上用极少量标注数据即可获得良好效果这正是预训练语音模型的最大价值。本示例代码位于 audio-classification 示例目录核心文件为 run_audio_classification.py配套依赖见同目录 requirements.txtdatasets1.14.0 evaluate librosa torchaudio torch1.6需要注意的是当前仓库维护的是 Hugging Face Transformers v4.24.0 的 fork见 benchmark/README.md安装方式为在benchmark/third_party/transformers目录下执行pip3 install -e .并安装accelerate0.15.0。如果你在本仓库的基准测试环境中使用该示例请以此版本为准。二、单 GPU 微调SUPERB 关键词识别Keyword Spotting2.1 完整命令以下命令在单张 V10016GB上对facebook/wav2vec2-base进行关键词识别微调数据集使用 SUPERB 的 Keyword SpottingKS子集python run_audio_classification.py \ --model_name_or_path facebook/wav2vec2-base \ --dataset_name superb \ --dataset_config_name ks \ --output_dir wav2vec2-base-ft-keyword-spotting \ --overwrite_output_dir \ --remove_unused_columns False \ --do_train \ --do_eval \ --fp16 \ --learning_rate 3e-5 \ --max_length_seconds 1 \ --attention_mask False \ --warmup_ratio 0.1 \ --num_train_epochs 5 \ --per_device_train_batch_size 32 \ --gradient_accumulation_steps 4 \ --per_device_eval_batch_size 32 \ --dataloader_num_workers 4 \ --logging_strategy steps \ --logging_steps 10 \ --evaluation_strategy epoch \ --save_strategy epoch \ --load_best_model_at_end True \ --metric_for_best_model accuracy \ --save_total_limit 3 \ --seed 0 \ --push_to_hub运行参考指标在单张 V10016GB上该脚本约 14 分钟完成评估准确率约98.26%示例作者公开的微调结果仓库 README 中记录。提示如果预训练模型的分类头维度与数据集标签数不匹配可在命令中追加--ignore_mismatched_sizes脚本会自适应加载并随机初始化分类头。2.2 关键参数详解上表中的参数分为三类分别对应脚本中三个 dataclassModelArguments、DataTrainingArguments和TrainingArguments见 run_audio_classification.py。脚本通过HfArgumentParser将三者统一解析为命令行参数。模型与特征提取相关参数ModelArguments参数默认值说明--model_name_or_pathfacebook/wav2vec2-base预训练模型名或本地路径--config_nameNone若与模型名不同可单独指定预训练配置--feature_extractor_nameNone特征提取器名称或路径缺省时复用模型名--freeze_feature_encoderTrue是否冻结卷积波形编码器特征编码器--attention_maskTrue是否在特征提取器中生成 attention mask--ignore_mismatched_sizesFalse分类头尺寸与标签数不一致时是否自适应加载--use_auth_tokenFalse访问私有模型时使用的认证 token--cache_dirNone预训练模型下载缓存目录数据相关参数DataTrainingArguments参数默认值说明--dataset_nameNonedatasets 包中的数据集名称--dataset_config_nameNone数据集子配置如 SUPERB 的ks--train_split_nametrain训练集 split 名--eval_split_namevalidation验证集 split 名--audio_column_nameaudio音频数据所在列名--label_column_namelabel标签所在列名Common Language 数据集为language--max_length_seconds20训练时随机裁剪的音频时长上限秒--max_train_samples/--max_eval_samplesNone调试用截断训练/评估样本数训练参数TrainingArguments--do_train/--do_eval控制是否训练/评估--fp16开启混合精度--learning_rate 3e-5为学习率--num_train_epochs 5训练轮数--per_device_train_batch_size 32与--gradient_accumulation_steps 4组合得到等效批次 128--warmup_ratio 0.1表示前 10% 步数线性预热--evaluation_strategy epoch每个 epoch 评估一次--load_best_model_at_end True --metric_for_best_model accuracy训练结束时加载准确率最优 checkpoint--save_total_limit 3仅保留最近 3 个 checkpoint--seed 0固定随机种子保证可复现。参数取值关键点关键词识别音频极短约 1 秒因此--max_length_seconds 1会把长音频随机裁剪到 1 秒--attention_mask False表示特征提取器不生成 attention mask——源码注释指出设置return_attention_maskTrue可获得分类器中对 transformer 输出的正确掩码均值池化但并不总能带来更高准确率本示例在短音频场景选择关闭。三、多 GPU 微调Common Language 语种识别Language Identification第二个示例将同样的脚本用于语种识别任务数据集为 Common Language每段音频标注所属语言。与单卡命令的关键差异在于音频更长16 秒、批次更小、学习率更高、训练轮数更多并通过多卡并行摊薄计算。python run_audio_classification.py \ --model_name_or_path facebook/wav2vec2-base \ --dataset_name common_language \ --audio_column_name audio \ --label_column_name language \ --output_dir wav2vec2-base-lang-id \ --overwrite_output_dir \ --remove_unused_columns False \ --do_train \ --do_eval \ --fp16 \ --learning_rate 3e-4 \ --max_length_seconds 16 \ --attention_mask False \ --warmup_ratio 0.1 \ --num_train_epochs 10 \ --per_device_train_batch_size 8 \ --gradient_accumulation_steps 4 \ --per_device_eval_batch_size 1 \ --dataloader_num_workers 8 \ --logging_strategy steps \ --logging_steps 10 \ --evaluation_strategy epoch \ --save_strategy epoch \ --load_best_model_at_end True \ --metric_for_best_model accuracy \ --save_total_limit 3 \ --seed 0 \ --push_to_hub运行参考指标在 4 张 V10016GB上该脚本约 1 小时完成评估准确率约79.45%仓库 README 中记录。注意两点与单卡用例的差异列名映射--audio_column_name audio与--label_column_name language显式指定了 Common Language 数据集中的音频列与标签列。脚本加载数据后会对这两个列做存在性校验见 run_audio_classification.py若列名错误会直接报错并列出可用列名。评估批次--per_device_eval_batch_size 1因为 16 秒音频经特征提取后序列较长单卡评估批次需要调小以控制显存。四、源码级流程解析脚本内部到底做了什么阅读 run_audio_classification.py 的main()函数微调流程可分为以下步骤4.1 数据加载与音频重采样脚本通过load_dataset分别加载训练集与验证集再执行cast_column将音频列转换为目标采样率的datasets.features.Audio类型采样率取自特征提取器通常为 16000 Hz。datasets 库会自动完成音频解码与重采样用户无需手动处理raw_datasets raw_datasets.cast_column( data_args.audio_column_name, datasets.features.Audio(sampling_ratefeature_extractor.sampling_rate), )4.2 训练/评估数据变换随机子采样脚本定义了两个 batch 级变换函数训练时对每段音频执行random_subsample随机裁剪到--max_length_seconds指定时长短于目标长度的音频原样保留评估时则使用完整音频不进行裁剪def random_subsample(wav: np.ndarray, max_length: float, sample_rate: int 16000): Randomly sample chunks of max_length seconds from the input audio sample_length int(round(sample_rate * max_length)) if len(wav) sample_length: return wav random_offset randint(0, len(wav) - sample_length - 1) return wav[random_offset : random_offset sample_length]这种训练随机裁剪 评估整段的组合是一种轻量的数据增强策略可提升模型对任意位置语音的鲁棒性。4.3 标签映射与模型初始化脚本从训练集标签列提取全部类别名构建label2id/id2label映射并写入模型配置使推理 API 可以输出人类可读标签随后用AutoModelForAudioClassification加载预训练模型num_labels由数据集标签数自动确定。4.4 冻结特征编码器关键微调策略脚本默认冻结 Wav2Vec2 的卷积波形编码器仅微调 transformer 部分与新增分类头if model_args.freeze_feature_encoder: model.freeze_feature_encoder()freeze_feature_encoder的底层实现在 modeling_wav2vec2.py调用self.feature_extractor._freeze_parameters()关闭特征编码器参数的梯度计算。同文件中还保留了一个已废弃的freeze_feature_extractor方法并发出FutureWarning脚本的ModelArguments.__post_init__也会对两者的混用给出警告或报错——从源码结构看新代码应统一使用--freeze_feature_encoder。4.5 指标计算与 Trainer 训练脚本用evaluate.load(accuracy)加载准确率指标compute_metrics对预测结果取argmax后与真实标签比对。随后以标准Trainer驱动训练、评估、保存与断点续训自动检测--output_dir下的历史 checkpoint配合--overwrite_output_dir控制是否从零开始。4.6 模型卡与推送训练结束后脚本调用trainer.create_model_card或trainer.push_to_hub自动附带finetuned_from、tasks: audio-classification、dataset等元数据生成模型卡。五、将模型分享到 Hugging Face Hub5.1 前置准备注册一个 Hugging Face 账号安装并配置git-lfs模型权重以 LFS 方式存储apt install git-lfs使用huggingface-cli登录账号huggingface-cli login # ...follow the prompts5.2 运行脚本时指定推送参数在原有命令基础上追加--push_to_hub与--hub_model_idpython run_audio_classification.py \ --push_to_hub \ --hub_model_id username/model_id \ ...脚本会在训练结束后自动将模型、特征提取器配置与模型卡推送到指定仓库。如需访问私有数据集或私有模型可额外添加--use_auth_token True。六、演示运行结果一览仓库 README 给出了两组已验证可运行的微调对照实验覆盖不同预训练模型、层数与硬件规模数据来自当前仓库 README.md 记录数据集预训练模型Transformer 层数Eval 准确率GPU 配置训练时间Keyword Spottingntu-spml/distilhubert20.97061× V10011 minKeyword Spottingfacebook/wav2vec2-base120.98261× V10014 minKeyword Spottingfacebook/hubert-base-ls960120.98191× V10014 minKeyword Spottingasapp/sew-mid-100k240.97571× V10015 minCommon Languagefacebook/wav2vec2-base120.79454× V1001h10m从表中可以读出几点实用结论极小规模模型也能胜任关键词识别仅 2 层的 DistilHuBERT 即可达到 97% 准确率说明关键词识别任务的难度相对较低层数并非越多越好24 层 SEW 在 KS 上准确率反而略低于 12 层 Wav2Vec2-base选择预训练模型时应以任务适配为准语种识别更难16 秒长音频、多语种区分的任务在相同基座模型下准确率明显低于短音频关键词识别因此需要更大的学习率、更多训练轮数与多卡训练时长。七、适用前提与限制说明环境版本当前仓库托管的是 Transformers v4.24.0 fork见 benchmark/README.mdrun_audio_classification.py通过check_min_version(4.24.0)与require_version(datasets1.14.0)做版本校验运行前请确保依赖满足数据加载方式脚本main()主流程通过load_dataset从 Hub 加载数据集。DataTrainingArguments虽定义了--train_file/--eval_file本地音频路径与标签文件但当前版本主流程并未接入这两个参数如需自定义本地数据集需自行扩展数据加载逻辑--remove_unused_columns False必须保留数据列需保留给set_transform中的批量变换函数使用若使用默认值True会导致变换所需列被提前移除性能数据属示例参考上文准确率与训练时长均为仓库 README 记录的示例运行结果实际数值会因数据版本、硬件与随机种子而波动。通过本文的单卡与多卡两条命令配合对run_audio_classification.py源码流程的理解你可以快速复现关键词识别与语种识别微调并将该方法迁移到自定义音频分类任务中。进一步的实现细节可深入阅读 run_audio_classification.py 与 Wav2Vec2 模型实现 modeling_wav2vec2.py。赞分享推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载相关推荐BrewUI测试失败诊断截图自动记录机制全解BrewUI测试失败诊断截图自动记录机制全解 BrewUI 是 Homebrew 官方推出的 macOS GUI 应用它把 brew 命令行包管理变成了可视桌面应用开发工具FlexGen 仓库 transformers 图像分类微调实战Trainer 与 Accelerate 双方案详解FlexGen 仓库 transformers 图像分类微调实战Trainer 与 Accelerate 双方案详解 导读 本文基于 FlexGen 仓库中随推理引擎大模型Transformers 音频分类任务完全指南基于 Wav2Vec2 微调与推理实战Transformers 音频分类任务完全指南基于 Wav2Vec2 微调与推理实战 音频分类Audio Classification是 Trans人工智能深度学习机器学习预训练微调NLP计算机视觉语音多模态上一篇SpringAll高级特性自动装配原理与Bean生命周期深度剖析下一篇React-Three-Fiber测试策略使用Test Renderer进行单元测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表