FunASR/examples/industrial_data_pretraining/paraformer/README_zh.md
2024-03-21 16:38:24 +08:00

9.6 KiB
Raw Blame History

(简体中文|English)

FunASR开源了大量在工业数据上预训练模型您可以在 模型许可协议下自由使用、复制、修改和分享FunASR模型下面列举代表性的模型更多模型请参考 模型仓库

推理

快速使用

Paraformer 模型

from funasr import AutoModel

model = AutoModel(model="paraformer-zh")

res = model.generate(input="https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/vad_example.wav")
print(res)

详细用法介绍

model = AutoModel(model=[str], device=[str], ncpu=[int], output_dir=[str], batch_size=[int], **kwargs)

AutoModel 定义

  • model(str): 模型仓库 中的模型名称,或本地磁盘中的模型路径
  • device(str): cuda:0默认gpu0使用 GPU 进行推理,指定。如果为cpu,则使用 CPU 进行推理
  • ncpu(int): 4 (默认),设置用于 CPU 内部操作并行性的线程数
  • output_dir(str): None (默认),如果设置,输出结果的输出路径
  • batch_size(int): 1 (默认),解码时的批处理大小
  • **kwargs(dict): 所有在config.yaml中参数均可以直接在此处指定例如vad模型中最大切割长度 max_single_segment_time=6000 (毫秒)。

AutoModel 推理

res = model.generate(input=[str], output_dir=[str])
  • input: 要解码的输入,可以是:
    • wav文件路径, 例如: asr_example.wav
    • pcm文件路径, 例如: asr_example.pcm此时需要指定音频采样率fs默认为16000
    • 音频字节数流,例如:麦克风的字节数数据
    • wav.scpkaldi 样式的 wav 列表 (wav_id \t wav_path), 例如:
    asr_example1  ./audios/asr_example1.wav
    asr_example2  ./audios/asr_example2.wav
    
    在这种输入 wav.scp 的情况下,必须设置 output_dir 以保存输出结果
    • 音频采样点,例如:audio, rate = soundfile.read("asr_example_zh.wav"), 数据类型为 numpy.ndarray。支持batch输入类型为list [audio_sample1, audio_sample2, ..., audio_sampleN]
    • fbank输入支持组batch。shape为[batch, frames, dim]类型为torch.Tensor例如
  • output_dir: None (默认),如果设置,输出结果的输出路径
  • **kwargs(dict): 与模型相关的推理参数,例如,beam_size=10decoding_ctc_weight=0.1

onnx与libtorch导出

res = model.export(type="onnx", quantize=True)
  • type(str)onnx(默认)导出onnx格式。torch导出libtorch格式。
  • quantize(bool)False(默认),是否做量化。

微调

快速开始

cd examples/industrial_data_pretraining/paraformer
bash finetune.sh
# "log_file: ./outputs/log.txt"

详细完整的脚本参考 finetune.sh

详细参数介绍

funasr/bin/train.py \
++model="${model_name_or_model_dir}" \
++model_revision="${model_revision}" \
++train_data_set_list="${train_data}" \
++valid_data_set_list="${val_data}" \
++dataset_conf.batch_size=20000 \
++dataset_conf.batch_type="token" \
++dataset_conf.num_workers=4 \
++train_conf.max_epoch=50 \
++train_conf.log_interval=1 \
++train_conf.resume=false \
++train_conf.validate_interval=2000 \
++train_conf.save_checkpoint_interval=2000 \
++train_conf.keep_nbest_models=20 \
++optim_conf.lr=0.0002 \
++output_dir="${output_dir}" &> ${log_file}
  • modelstr模型名字模型仓库中的ID此时脚本会自动下载模型到本读或者本地已经下载好的模型路径。
  • model_revisionstrmodel 为模型名字时,下载指定版本的模型。
  • train_data_set_liststr训练数据路径默认为jsonl格式具体参考例子)。
  • valid_data_set_liststr验证数据路径默认为jsonl格式具体参考例子)。
  • dataset_conf.batch_typestrexample默认batch的类型。example表示按照固定数目batch_size个样本组batchlength or token 表示动态组batchbatch总长度或者token数为batch_size。
  • dataset_conf.batch_sizeintbatch_type 搭配使用,当 batch_type=example 时,表示样本个数;当 batch_type=length表示样本中长度单位为fbank帧数1帧10ms或者文字token个数。
  • train_conf.max_epochint训练总epoch数。
  • train_conf.log_intervalint打印日志间隔step数。
  • train_conf.resumeint是否开启断点重训。
  • train_conf.validate_intervalint训练中做验证测试的间隔step数。
  • train_conf.save_checkpoint_intervalint训练中模型保存间隔step数。
  • train_conf.keep_nbest_modelsint保留最大多少个模型参数按照验证集acc排序从高到底保留。
  • optim_conf.lrfloat学习率。
  • output_dirstr模型保存路径。
  • **kwargs(dict): 所有在config.yaml中参数均可以直接在此处指定例如过滤20s以上长音频dataset_conf.max_token_length=2000单位为音频fbank帧数1帧10ms或者文字token个数。

多gpu训练

单机多gpu训练
export CUDA_VISIBLE_DEVICES="0,1"
gpu_num=$(echo $CUDA_VISIBLE_DEVICES | awk -F "," '{print NF}')

torchrun --nnodes 1 --nproc_per_node ${gpu_num} \
../../../funasr/bin/train.py ${train_args}

--nnodes 表示参与的节点总数,--nproc_per_node 表示每个节点上运行的进程数

多机多gpu训练

在主节点上假设IP为192.168.1.1端口为12345使用的是2个GPU则运行如下命令

export CUDA_VISIBLE_DEVICES="0,1"
gpu_num=$(echo $CUDA_VISIBLE_DEVICES | awk -F "," '{print NF}')

torchrun --nnodes 2 --nproc_per_node ${gpu_num} --master_addr=192.168.1.1 --master_port=12345 \
../../../funasr/bin/train.py ${train_args}

在从节点上假设IP为192.168.1.2你需要确保MASTER_ADDR和MASTER_PORT环境变量与主节点设置的一致并运行同样的命令

export CUDA_VISIBLE_DEVICES="0,1"
gpu_num=$(echo $CUDA_VISIBLE_DEVICES | awk -F "," '{print NF}')

torchrun --nnodes 2 --nproc_per_node ${gpu_num} --master_addr=192.168.1.1 --master_port=12345 \
../../../funasr/bin/train.py ${train_args}

--nnodes 表示参与的节点总数,--nproc_per_node 表示每个节点上运行的进程数

准备数据

train_text.txt

左边为数据唯一ID需与train_wav.scp中的ID一一对应 右边为音频文件标注文本,格式如下:

ID0012W0013 当客户风险承受能力评估依据发生变化时
ID0012W0014 所有只要处理 data 不管你是做 machine learning 做 deep learning
ID0012W0015 he tried to think how it could be

train_wav.scp

左边为数据唯一ID需与train_text.txt中的ID一一对应 右边为音频文件的路径,格式如下

BAC009S0764W0121 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav
BAC009S0916W0489 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0916W0489.wav
ID0012W0015 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_cn_en.wav

查看训练日志

查看实验log
tail log.txt
[2024-03-21 15:55:52,137][root][INFO] - train, rank: 3, epoch: 0/50, step: 6990/1, total step: 6990, (loss_avg_rank: 0.327), (loss_avg_epoch: 0.409), (ppl_avg_epoch: 1.506), (acc_avg_epoch: 0.795), (lr: 1.165e-04), [('loss_att', 0.259), ('acc', 0.825), ('loss_pre', 0.04), ('loss', 0.299), ('batch_size', 40)], {'data_load': '0.000', 'forward_time': '0.315', 'backward_time': '0.555', 'optim_time': '0.076', 'total_time': '0.947'}, GPU, memory: usage: 3.830 GB, peak: 18.357 GB, cache: 20.910 GB, cache_peak: 20.910 GB
[2024-03-21 15:55:52,139][root][INFO] - train, rank: 1, epoch: 0/50, step: 6990/1, total step: 6990, (loss_avg_rank: 0.334), (loss_avg_epoch: 0.409), (ppl_avg_epoch: 1.506), (acc_avg_epoch: 0.795), (lr: 1.165e-04), [('loss_att', 0.285), ('acc', 0.823), ('loss_pre', 0.046), ('loss', 0.331), ('batch_size', 36)], {'data_load': '0.000', 'forward_time': '0.334', 'backward_time': '0.536', 'optim_time': '0.077', 'total_time': '0.948'}, GPU, memory: usage: 3.943 GB, peak: 18.291 GB, cache: 19.619 GB, cache_peak: 19.619 GB

指标解释:

  • rank表示gpu id。
  • epoch,step,total step表示当前epochstep总step。
  • loss_avg_rank表示当前step所有gpu平均loss。
  • loss/ppl/acc_avg_epoch表示当前epoch周期截止当前step数时总平均loss/ppl/acc。epoch结束时的最后一个step表示epoch总平均loss/ppl/acc推荐使用acc指标。
  • lr当前step的学习率。
  • [('loss_att', 0.259), ('acc', 0.825), ('loss_pre', 0.04), ('loss', 0.299), ('batch_size', 40)]表示当前gpu id的具体数据。
  • total_time表示单个step总耗时。
  • GPU, memory:分别表示,模型使用/峰值显存,模型+缓存使用/峰值显存。
tensorboard可视化
tensorboard --logdir /xxxx/FunASR/examples/industrial_data_pretraining/paraformer/outputs/log/tensorboard

浏览器中打开:http://localhost:6006/