WeNet环境配置与aishell模型训练
1环境配置
踩坑记录: 系统使用win11,我根据wenet官方文档,使用conda虚拟环境安装了cuda12.1,安装wenet依赖库,其中deepspeed报错,根据报错信息查询github,发现缺少libaio库,它通常在Linux系统上使用,根据githubu找到解决办法,重新编译了deepspeed,成功安装依赖。分析和运行wenet时发现,仍然有很多报错。随后我尝试在本机VMware+ubuntu22.04,wenet在不进行跑数据的情况下没有问题,开始数据测试后,发现VMware基于主机的显卡虚拟映射出了一个供uhuntu系统使用的显卡,这个显卡没有合适的驱动。随后查询到一个解决办法,显卡直连,尝试好几种博主的方法,均失败告终。
解决方法: 已老实,求放过,使用带GPU的服务器,本文服务器使用ubuntu22.04。
1.1安装Miniconda
#下载
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py310_24.5.0-0-Linux-x86_64.sh
#安装:根据提示输入enter或yes
bash Miniconda3-py38_4.9.2-Linux-x86_64.sh
#验证:重启终端(必须),运行下方命令,显示版本号则安装成功
conda --version
1.2更换清华源
#在用户目录(/home/xxx)下新建.condarc文件
touch .condarc
#用vim打开.condarc文件,写入下方内容保存后退出
channels:
- defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
#清除索引缓存
conda clean -i
#配置完毕,执行以下命令查看是否已经换源,可以看到已经更换为清华源了
conda config --show
1.3在服务器中安装CUDA
踩坑记录:在此之前,我一直尝试的是在虚拟环境中使用conda install进行安装cudatoolkit,如果你使用的cuda版本过高,则无法使用清华源(最高11.8.0),初次尝试使用的cudatoolkit-11.3.1,安装完成后,使用nvcc -v不能显示cuda版本,使用conda list不能显示cudatoolkit,使用conda list cuda可以显示,查阅博客,没有找到答案。于是忽略此条继续配置,根绝conda search cudnn查看对应版本cudnn,随之conda install cudnn=8.2.1安装完成。随后使用conda install pytorch1.12.1 torchvision0.13.1 torchaudio==0.12.1 cudatoolkit=11.3 -c pytorch安装成功,随后进行相关python代码验证,均失败,conda list发现没有torch。于是忽略此条继续配置,随后根据requirements.txt进行pip,出现大量不兼容情况,主要是torch版本引起的,版本过高,因为官方文档使用的是cuda12.1对应的torch>=2.1.2。我降低torch版本,使其兼容。此时再次进行python代码验证均失败。
解决方法: 采用在base环境中安装cuda,配置环境变量,即可使用nvcc。在虚拟环境中继续后续的配置,我在base环境中安装了cuda11.3和cuda12.1,wenet代码均可运行。使用cuda11.3,安装conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit=11.3 -c pytorch,随后使用requirements.txt进行pip时,注意torch2.1.2和torchaudio==2.1.2版本即可(已老实,求放过,这个方法我个人认为不是很完美,但是它让我的代码成功运行了起来)
本文采用wenet官方文档推荐的CUDA12.1
其他版本的CUDA配置方法可查看:CUDA and cuDNN — k2 1.24.4 documentation (k2-fsa.github.io)
#下载CUDA12.1 官方地址:https://developer.nvidia.com/cuda-toolkit-archive
wget https://developer.download.nvidia.com/compute/cuda/12.2.1/local_installers/cuda_12.2.1_535.86.10_linux.run
#安装,此处采用静默模式安装,交互模式可参考:https://blog.youkuaiyun.com/qq_46699596/article/details/134552021
sh ./cuda_12.1.1_530.30.02_linux.run \
--silent \
--toolkit \
--installpath=/s6home/lnj524/module/cuda/cuda-12.1 \
--no-opengl-libs \
--no-drm \
--no-man-page
#./cuda_12.1.1_530.30.02_linux.run:CUDA 12.1.1 的安装程序文件。
#--silent:以静默模式安装,不需要用户交互。
#--toolkit:只安装 CUDA Toolkit,而不安装其他组件(如驱动程序等)。
#--installpath=/home/xxx/module/cuda/cuda-12.1:指定安装路径。
#--no-opengl-libs:不安装 OpenGL 库。
#--no-drm:不安装 Direct Rendering Manager(DRM)模块。DRM 模块用于图形硬件加速的直接渲染。
#--no-man-page:不安装手册页。
#添加环境变量
vim ~/.bashrc
#将下方内容写入.bashrc
export CUDA_HOME=/s6home/lnj524/module/cuda/cuda-12.1
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$CUDA_HOME/extras/CUPTI/lib64:$LD_LIBRARY_PATH
export CUDAToolkit_ROOT_DIR=$CUDA_HOME
export CUDAToolkit_ROOT=$CUDA_HOME
export CUDA_TOOLKIT_ROOT_DIR=$CUDA_HOME
export CUDA_TOOLKIT_ROOT=$CUDA_HOME
export CUDA_BIN_PATH=$CUDA_HOME
export CUDA_PATH=$CUDA_HOME
export CUDA_INC_PATH=$CUDA_HOME/targets/x86_64-linux
export CFLAGS=-I$CUDA_HOME/targets/x86_64-linux/include:$CFLAGS
export CUDAToolkit_TARGET_DIR=$CUDA_HOME/targets/x86_64-linux
#更新用户环境
source ~/.bashrc
#验证
nvcc -V
#到此cuda安装完成
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0
1.3创建虚拟环境
#创建虚拟环境
conda create -n wenet2.0 python=3.10
#启动虚拟环境
conda activate wenet2.0
1.4在虚拟环境中完成后续安装
#安装conda-forge::sox
conda install conda-forge::sox
#查看cuda对应的cudnn版本
conda search cudnn
#下载cudnn
conda install cudann=8.9.2.26
#配置pip清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
#查看pip源
pip config list
global.index-url='https://pypi.tuna.tsinghua.edu.cn/simple'
#安装torch和torchaudio,清华源中没有找个包,只能从官网下载,静静等待。
pip install torch==2.2.2+cu121 torchaudio==2.2.2+cu121 -f https://download.pytorch.org/whl/torch_stable.html
#根据requirements.txt安装其他其他依赖
pip install -r requirements.txt
#完成
1.5aishell
模型训练
cd /s6home/lnj524/module/wenet/examples/aishell/s0
chmod +x run.sh
./run.sh --stage -1 #采用默认配置从数据集下载到完成模型训练。
./run.sh --stage 4 --stop_stage 4 #执行模型训练
2Wenet文件分析
2.1run.sh
-
下载数据(阶段 -1)此步骤将AIShell-1数据集下载到本地路径。这可能需要几个小时。如果已经下载了数据,请在
run.sh
脚本中调整$data
变量,并从阶段0开始。请确保为$data
设置绝对路径,例如/home/username/asr-data/aishell/
。 -
准备训练数据(阶段 0)将原始的AIShell-1数据组织成两个文件:
-
wav.scp
:每行包含两列,分别是wav_id
和wav_path
。 -
text
:每行包含两列,分别是wav_id
和text_label
。
-
-
提取可选的CMVN特征(阶段 1)使用原始的WAV文件作为输入。标准化文本标签,去除空格。使用
tools/compute_cmvn_stats.py
提取全局倒谱均值和方差归一化(CMVN)统计信息。 -
生成标签令牌字典(阶段 2)创建标签令牌(AIShell-1中的字符)与整数索引之间的映射。字典包括特殊令牌,如
<blank>
(用于CTC)、<unk>
(未知令牌)和<sos/eos>
(开始/结束语音)。 -
准备数据的所需格式(阶段 3)将数据转换为模型训练所需的格式。对于小型数据集,使用原始格式raw;对于大型数据集,使用shard,将数据分片以提高读取和训练速度。
-
模型训练(阶段 4)配置并启动模型训练。根据配置,选择使用DeepSpeed或Torch DDP进行分布式训练。这一步包含了设置分布式训练的各种参数,如节点数、每个节点的进程数、训练配置文件等。
-
模型评估(阶段 5)使用训练好的模型进行推理和评估,计算WER(Word Error Rate)。如果启用了模型平均,会首先对多个检查点进行平均以得到最终的评估模型。
-
导出模型(阶段 6)导出训练好的模型,生成可用于推理的模型文件。这一步通常包括导出标准模型和量化模型,以便在不同的设备和环境中进行高效推理。
-
语言模型准备和解码(阶段 7)准备语言模型和解码工具,进行语言模型的训练和解码。这包括生成字典、训练语言模型、编译FST(Finite State Transducer)图并进行解码测试。
-
使用HLG图进行解码(阶段 8)使用HLG(HMM-Lexicon-Grammar)图进行解码,以进一步提升模型的解码性能。这一步需要预先准备HLG图并进行推理和评估。
-
使用LF-MMI进行训练(阶段 9)使用LF-MMI(Lattice-Free Maximum Mutual Information)进行模型训练,以进一步优化模型性能。这一步包括准备LF-MMI所需的FST图,并在之前的基础上进行进一步的模型训练和评估。
#!/bin/bash
# Copyright 2019 Mobvoi Inc. All Rights Reserved.
. ./path.sh || exit 1;
# 自动检测 GPU 的数量
if command -v