TencentGameMate / chinese_speech_pretrain

chinese speech pretrained models
997 stars 84 forks source link

请问还传ESPnet的训练代码吗? #8

Closed qixing-ai closed 1 year ago

pengchengguo commented 2 years ago

你好,稍作整理后会上传上去。ESPnet 中已支持将预训练模型作为 frontend 进行特征提取,然后输入 Conformer ASR 模型的训练。可以在 Aishell Conformer 配置文件中添加

freeze_param: [
"frontend.upstream"
]

frontend: s3prl
frontend_conf:
    frontend_conf:
        upstream: hubert_local
        upstream_model_config:
        upstream_ckpt: ${YOUR_PATH}/checkpoint_best.pt
    download_dir: ./hub
    multilayer_feature: true

preencoder: linear
preencoder_conf:
    input_size: 1024  # Note: If the upstream is changed, please change this value accordingly.
    output_size: 80

然后修改 encoder_conf.input_layerconv2d2,如

encoder_conf:
    input_layer: conv2d2 # encoder architecture type

进行训练。

user-ZJ commented 2 years ago

请问上传了吗?在哪个目录下呢?

pengchengguo commented 2 years ago

你好,训练配置文件已上传至 espnet 目录下。

abcdbosh commented 2 years ago

没有上游面对huggingface的配置文件吗

pengchengguo commented 2 years ago

请问你的意思是,使用 huggingface 对 wav2vec2 模型进行 CTC finetune 的配置文件么? 我们下游任务都是基于 espnet 跑的,没有用 fairseq 或 huggingface 进行 CTC finetune。

boshs commented 2 years ago

您好: 根据配置文件在终端运行 CUDA_VISIBLE_DEVICES=2 ./run_ssl.sh --ngpu 1 2022-07-22T16:12:42 (asr.sh:252:main) ./asr.sh --ngpu 4 --stage 1 --stop_stage 13 --expdir exp/hubert-base --lang zh --audio_format wav --feats_type raw --token_type char --use_lm true --use_word_lm false --lm_config conf/train_lm_transformer.yaml --asr_config conf/train_asr_conformer_hubert-base.yaml --inference_config conf/decode_asr_rnn.yaml --gpu_inference true --train_set train --valid_set dev --test_sets dev test --speed_perturb_factors 0.9 1.0 1.1 --asr_speech_fold_length 512 --asr_text_fold_length 150 --lm_fold_length 150 --lm_train_text data/train/text --ngpu 1 2022-07-22T16:12:42 (asr.sh:443:main) Stage 1: Data preparation for data/train, data/dev, etc. 2022-07-22T16:12:42 (data.sh:27:main) local/data.sh 2022-07-22T16:12:42 (data.sh:68:main) Data Preparation 2022-07-22T16:12:43 (data.sh:93:main) Preparing data/local/train transcriptions 2022-07-22T16:12:44 (data.sh:93:main) Preparing data/local/dev transcriptions 2022-07-22T16:12:45 (data.sh:93:main) Preparing data/local/test transcriptions 2022-07-22T16:12:45 (data.sh:121:main) Successfully finished. [elapsed=3s] 2022-07-22T16:12:45 (asr.sh:450:main) Stage 2: Speed perturbation: data/train -> data/train_sp text utt2lang scripts/utils/perturb_data_dir_speed.sh: generated speed-perturbed version of data in data/train, in data/train_sp0.9 fix_data_dir.sh: kept all 120098 utterances. fix_data_dir.sh: old files are kept in data/train_sp0.9/.backup utils/validate_data_dir.sh: Successfully validated data-directory data/train_sp0.9 text utt2lang scripts/utils/perturb_data_dir_speed.sh: generated speed-perturbed version of data in data/train, in data/train_sp1.1 fix_data_dir.sh: kept all 120098 utterances. fix_data_dir.sh: old files are kept in data/train_sp1.1/.backup utils/validate_data_dir.sh: Successfully validated data-directory data/train_sp1.1 utils/combine_data.sh data/train_sp data/train_sp0.9 data/train data/train_sp1.1 utils/combine_data.sh: combined utt2uniq utils/combine_data.sh [info]: not combining segments as it does not exist utils/combine_data.sh: combined utt2spk utils/combine_data.sh [info]: not combining utt2lang as it does not exist utils/combine_data.sh [info]: not combining utt2dur as it does not exist utils/combine_data.sh [info]: not combining utt2num_frames as it does not exist utils/combine_data.sh [info]: not combining reco2dur as it does not exist utils/combine_data.sh [info]: not combining feats.scp as it does not exist utils/combine_data.sh: combined text utils/combine_data.sh [info]: not combining cmvn.scp as it does not exist utils/combine_data.sh [info]: not combining vad.scp as it does not exist utils/combine_data.sh [info]: not combining reco2file_and_channel as it does not exist utils/combine_data.sh: combined wav.scp utils/combine_data.sh [info]: not combining spk2gender as it does not exist fix_data_dir.sh: kept all 360294 utterances. fix_data_dir.sh: old files are kept in data/train_sp/.backup 2022-07-22T16:13:07 (asr.sh:472:main) Stage 3: Format wav.scp: data/ -> dump/raw utils/copy_data_dir.sh: copied data from data/train_sp to dump/raw/org/train_sp utils/validate_data_dir.sh: Successfully validated data-directory dump/raw/org/train_sp 2022-07-22T16:13:15 (format_wav_scp.sh:42:main) scripts/audio/format_wav_scp.sh --nj 10 --cmd run.pl --audio-format wav --fs 16k data/train_sp/wav.scp dump/raw/org/train_sp 2022-07-22T16:13:15 (format_wav_scp.sh:110:main) [info]: without segments

到stage 3 就类似没响应,也不会报错。且服务器会变得异常卡顿 在../espnet/egs2/aishell/asr1/dump/raw/org/train_sp/logs:会显示 sox WARN wav: Length in output .wav header will be wrong since can't seek to fix it 请问这是什么问题呢

pengchengguo commented 2 years ago

你好,一般 ESPnet 第三步涉及根据 wav.scp 文件,对 wav 进行处理,比如变速、切分,处理后会存在 dump 目录下。一般情况下,根据数据量大小,这步比较耗时。sox WARN 这个不用管他,不影响训练。

sst0715 commented 1 year ago

你好,一般 ESPnet 第三步涉及根据 wav.scp 文件,对 wav 进行处理,比如变速、切分,处理后会存在 dump 目录下。一般情况下,根据数据量大小,这步比较耗时。sox WARN 这个不用管他,不影响训练。

您好,我想请问一下我的代码运行到这一步之后报错是怎么回事?刚开始以为是因为nj太大了,所以把asr.sh里的nj调成了8。但还是报错如下: image 查看log文件夹里的文件有部分未报错,另一部分报错显示:

pyscripts/audio/format_wav_scp.py --fs 16k --audio-format wav dump/raw/org/train_sp/logs/wav.5.scp dump/raw/org/train_sp/data/format.5

Started at Fri Jul 7 14:49:01 CST 2023

# 2023-07-07 14:49:02,318 (format_wav_scp:68) INFO: /opt/conda/envs/espnet/bin/python3 pyscripts/audio/format_wav_scp.py --fs 16k --audio-format wav dump/raw/org/train_sp/logs/wav.5.scp dump/raw/org/train_sp/data/format.5

0it [00:00, ?it/s]sox WARN wav: Length in output .wav header will be wrong since can't seek to fix it

0it [00:00, ?it/s] Traceback (most recent call last): File "pyscripts/audio/format_wav_scp.py", line 289, in main() File "pyscripts/audio/format_wav_scp.py", line 223, in main soundfile.write(owavpath, wave, rate) File "/opt/conda/envs/espnet/lib/python3.8/site-packages/soundfile.py", line 343, in write with SoundFile(file, 'w', samplerate, channels, File "/opt/conda/envs/espnet/lib/python3.8/site-packages/soundfile.py", line 658, in init self._file = self._open(file, mode_int, closefd) File "/opt/conda/envs/espnet/lib/python3.8/site-packages/soundfile.py", line 1216, in _open raise LibsndfileError(err, prefix="Error opening {0!r}: ".format(self.name)) soundfile.LibsndfileError: Error opening 'dump/raw/org/train_sp/data/format.5/data_wav/sp0.9-data/LibriMix/libri_mix_single_offset/Libri2Mix/wav16k/max/metadata/mixture_train-360_mix_both.csv:353-128309-0002_4071-39616-0023.wav': System error.

Accounting: time=1 threads=1

请问您知道这是怎么造成的吗?已经苦恼很久了。

pengchengguo commented 1 year ago

@sst0715 你好,你这个看起来跑的是 librimix 么?麻烦具体说下跑的是什么实验,是 espnet/egs2/librimix 么? 看日志报错中,“soundfile.LibsndfileError: Error opening 'dump/raw/org/train_sp/data/format.5/data_wav/sp0.9-data/LibriMix/libri_mix_single_offset/Libri2Mix/wav16k/max/metadata/mixture_train-360_mix_both.csv:353-128309-0002_4071-39616-0023.wav'”,wav 的路径不是一个合法的路径 “dump/raw/org/train_sp/data/format.5/data_wav/sp0.9-data/LibriMix/libri_mix_single_offset/Libri2Mix/wav16k/max/metadata/mixture_train-360_mix_both.csv:353-128309-0002_4071-39616-0023.wav”,所以 soundfile 无法打开。

sst0715 commented 1 year ago

@sst0715 你好,你这个看起来跑的是 librimix 么?麻烦具体说下跑的是什么实验,是 espnet/egs2/librimix 么? 看日志报错中,“soundfile.LibsndfileError: Error opening 'dump/raw/org/train_sp/data/format.5/data_wav/sp0.9-data/LibriMix/libri_mix_single_offset/Libri2Mix/wav16k/max/metadata/mixture_train-360_mix_both.csv:353-128309-0002_4071-39616-0023.wav'”,wav 的路径不是一个合法的路径 “dump/raw/org/train_sp/data/format.5/data_wav/sp0.9-data/LibriMix/libri_mix_single_offset/Libri2Mix/wav16k/max/metadata/mixture_train-360_mix_both.csv:353-128309-0002_4071-39616-0023.wav”,所以 soundfile 无法打开。

您好,是的。是espnet/egs2/librimix/sot_asr1。这个路径是有问题,去找的话找不到对应的文件,但我不知道要从哪里下手改😥

pengchengguo commented 1 year ago

okok。

  1. 首先,看下 data/{train, dev, text} 这些目录里的 {wav.scp, text} 文件格式,正常应该是 "uttid wavpath/transcript";
  2. 如果 uttid 是上面那种有问题的,可以去 local/data.sh 中,尝试改一下代码,如图所示
image

这里原因我理解的是不同 grep 版本或者不同 linux 系统,导致 grep 默认会输出搜索文件名。grep -h 除去文件名。

可以先试试可以么。

sst0715 commented 1 year ago

okok。

  1. 首先,看下 data 目录下生成的 train,dev,test 这些目录里的 wav.scp,text 文件格式,正常应该是 "uttid wavpath/transcript";
  2. 如果 uttid 是上面那种有问题的,可以去 local/data.sh 中,尝试改一下代码,如图所示
image

这里原因我理解的是不同 grep 版本或者不同 linux 系统,导致 grep 默认会输出搜索文件名。grep -h 除去文件名。

可以先试试可以么。

收到,感谢您!这就去试试!

sst0715 commented 1 year ago

okok。

  1. 首先,看下 data/{train, dev, text} 这些目录里的 {wav.scp, text} 文件格式,正常应该是 "uttid wavpath/transcript";
  2. 如果 uttid 是上面那种有问题的,可以去 local/data.sh 中,尝试改一下代码,如图所示
image

这里原因我理解的是不同 grep 版本或者不同 linux 系统,导致 grep 默认会输出搜索文件名。grep -h 除去文件名。

可以先试试可以么。

您好!我根据您上次提供的这个办法修改了代码,结果已经成功运行了stage5,非常感谢!在他继续运行的过程中出了一点别的小问题,我修改完成后现在已经运行到stage10了,显示如下。 image image 在文件夹中可以看见生成了log文件夹中内容如下。 image 我昨天运行过一次了,卡在log8的地方,等了一个晚上今天早上看还是没动,也没有用到GPU资源。于是我修改了asr.sh让它从stage5重新开始运行,但现在在这个地方等了大概6个小时也没有动,点开stats文件夹里train文件夹中的文件大小都为0。想请问您这是正常的吗?还是可能出现了一些问题?感谢您的回复。

pengchengguo commented 1 year ago

@sst0715 你好,

首先保证 stage 1 - stage 5(data preparation、speed perturbation、format data、remove long data、generate dict)没错。然后 stage10 是统计 cmvn,可以从两方面查找你的问题:

  1. 看看所有的 stats.*.log,看看输出什么日志,程序断掉的原因是不是因为网络问题,wavlm 下载不下来,或者 wavlm 只下载了一半,导致读取的 wavlm 模型有问题;
  2. 对于使用 wavlm 作为 frontend,其实不需要统计 cmvn。针对这种不需要统计 cmvn 的情况,ESPnet 最近更新了下,你可以在 run.sh 里面写明 --feats_normalize utterance_mvn 或者 --feats_normalize ""(怎么都行,只要说明不用 global cmvn就行),然后 train config 中加入如下 image

    表示在进行 stage 10 的时候,不需要统计 stats。

你可以先试试看。

sst0715 commented 1 year ago

@sst0715 你好,

首先保证 stage 1 - stage 5(data preparation、speed perturbation、format data、remove long data、generate dict)没错。然后 stage10 是统计 cmvn,可以从两方面查找你的问题:

  1. 看看所有的 stats.*.log,看看输出什么日志,程序断掉的原因是不是因为网络问题,wavlm 下载不下来,或者 wavlm 只下载了一半,导致读取的 wavlm 模型有问题;
  2. 对于使用 wavlm 作为 frontend,其实不需要统计 cmvn。针对这种不需要统计 cmvn 的情况,ESPnet 最近更新了下,你可以在 run.sh 里面写明 --feats_normalize utterance_mvn 或者 --feats_normalize ""(怎么都行,只要说明不用 global cmvn就行),然后 train config 中加入如下

image 表示在进行 stage 10 的时候,不需要统计 stats。 你可以先试试看。

收到,我去排查一下。谢谢您的回复!

sst0715 commented 1 year ago

@sst0715 你好,

首先保证 stage 1 - stage 5(data preparation、speed perturbation、format data、remove long data、generate dict)没错。然后 stage10 是统计 cmvn,可以从两方面查找你的问题:

  1. 看看所有的 stats.*.log,看看输出什么日志,程序断掉的原因是不是因为网络问题,wavlm 下载不下来,或者 wavlm 只下载了一半,导致读取的 wavlm 模型有问题;
  2. 对于使用 wavlm 作为 frontend,其实不需要统计 cmvn。针对这种不需要统计 cmvn 的情况,ESPnet 最近更新了下,你可以在 run.sh 里面写明 --feats_normalize utterance_mvn 或者 --feats_normalize ""(怎么都行,只要说明不用 global cmvn就行),然后 train config 中加入如下

image 表示在进行 stage 10 的时候,不需要统计 stats。 你可以先试试看。

抱歉再次打扰您。在您的帮助下我已经完成了stage11的训练,但现在又遇到了一些问题,我在espnet的issue中搜寻了关键字,只有一个相关问题,与我的问题不尽相同,chatGPT也不能很好地帮助我解决问题。如果您能指点一下的话感激不尽。 代码已经运行到stage12的阶段,以下是报错信息: image image 再次感谢。

pengchengguo commented 1 year ago

@sst0715 你好,

这个问题我没遇到过,我大部分都是 CPU 解码。通过截图可以看出来你是使用 GPU 解码,问题在于不同 tensor 有的是 CPU 类型有的是 CUDA 类型。我建议可以:

  1. 使用 CPU 解码看看,虽然 CPU 解码慢,但可以通过 inference_nj=32 多进程;
  2. 或者使用一个 job GPU 解码,通过 ./run.sh --gpu_inference=true --inference_nj=1;

我使用过 GPU 解码得到 1best 没有问题。如果你跑的是解码得到 nbest 而不 1 best,也有可能是代码本身存在 bug,没考虑 nbest 时 index 索引 device type 问题。

sst0715 commented 1 year ago

@sst0715 你好,

这个问题我没遇到过,我大部分都是 CPU 解码。通过截图可以看出来你是使用 GPU 解码,问题在于不同 tensor 有的是 CPU 类型有的是 CUDA 类型。我建议可以:

  1. 使用 CPU 解码看看,虽然 CPU 解码慢,但可以通过 inference_nj=32 多进程;
  2. 或者使用一个 job GPU 解码,通过 ./run.sh --gpu_inference=true --inference_nj=1;

我使用过 GPU 解码得到 1best 没有问题。如果你跑的是解码得到 nbest 而不 1 best,也有可能是代码本身存在 bug,没考虑 nbest 时 index 索引 device type 问题。

收到。我再调试一下,感谢您的回复。