Kaldi学习笔记(一)

工欲善其事,必先利其器,机器、数据、算法对深度学习都非常重要。 

1 机器

我先后尝试两台机器以及虚拟机,处理速度差距还是很大的。当前配置:i7 6700+gtx1060+16G+240G SSD。至少现在的实验流程可以在一天之内完成,用旧机器可能3天都不一定能完成。cpu对于大部分的计算都是至关重要的,尤其是解码步骤,最为耗时,如果能用上可以超频的cpu,速度会快不少吧。gpu主要可以加速dnn训练,据说与cpu相比速度能快10倍。内存建议至少16G,内存太小则不得不减少线程或者使用交换分区,这些都会降低效率。

2 系统与软件

不建议使用虚拟机,据说在虚拟机中无法真正使用gpu的计算功能,安装双系统还是有必要的,建议使用easyBCD安装ubuntu16.04。

2.1 更新数据源

cd /etc/apt
cp sources.list sources.list.bak   #备份旧源
sudo gedit  sources.list

粘贴阿里源

# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

然后运行sudo apt-get update

2.2 安装cuda

将具体步骤略。安装好以后运行nvidia-smi我有两个gpu,得到的结果如下:

Fri May  5 10:57:27 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.39                 Driver Version: 375.39                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 650     Off  | 0000:01:00.0     N/A |                  N/A |
| 30%   34C    P8    N/A /  N/A |    341MiB /  1997MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 106...  Off  | 0000:07:00.0     Off |                  N/A |
| 43%   31C    P8     6W / 130W |      1MiB /  6072MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0                  Not Supported                                         |
+-----------------------------------------------------------------------------+

注意processes项的not supported,出现这个是因为gpu太老或者太弱,不支持显示它正在运行的进程。上例中gpu0是gtx650,gpu1是gtx1060,在进行dnn训练任务时,processes项会显示gpu1运行的进程名,以及占用的显存。
顺便一提,在kaldi的运行日志中,可以见到这样一个警告

Suggestion: use 'nvidia-smi -c 3' to set compute exclusive mode

查阅smi的文档可知,-c 3是把gpu设置为进程独占,如果你只有一块显卡,又接上了显示器,请不要设置这个,否则会导致无可用gpu。其他的模式如下:-c 0是默认模式,每个设备都可以被多个任务使用;-c 1是将每个设备都设置为线程独占,但是这个已经过时了,会自动改成进程独占;-c 2是将所有设备都设置为禁止计算。且这个设置会在重启后恢复为默认。
如果有多个gpu可以指定设置计算模式的gpu:

sudo nvidia-smi -i 1 -c 3

2.3 安装kaldi

一、安装依赖

sudo apt-get install autoconf libtool wget perl subversion build-essential gfortran libatlas-dev libatlas-base-dev zlib1g-dev gawk

二、其它步骤略。
三、可能遇到的问题。
(1)如果在make时遇到类似recipe for target 'lattice-prune' failed的错误,重新编译OpenBLAS可以解决。步骤如下:
1)删除tools目录下的OpenBLAS文件夹
2)在tools路径下运行make -j 8 openblas,修改src目录下的configure文件,
找到:

## Default locations for FST and linear algebra libraries.
MATHLIB='ATLAS'
ATLASROOT=`rel2abs ../tools/ATLAS/`
FSTROOT=`rel2abs ../tools/openfst`

修改为:

MATHLIB='OPENBLAS'
OPENBLASROOT=`rel2abs ../tools/OpenBLAS/install`
FSTROOT=`rel2abs ../tools/openfst`

再次运行

./configure
make depend 
make -j 8

(2)如果在steps/nnet/make_denlats.sh这一步出错:awk: line 3: function gensub never defined,是因为没有安装gawk。

2.4 安装htop

htop是一个非常好用的cpu监测工具,可以实时看到cpu状态、内存状态和进程状态。运行sudo apt-get install htop,即可安装。使用也很简单,直接运行htop

3 数据

本文采用的数据集都来自王东老师开源的thchs30,这个数据集包含的内容如下:

数据集 音频时长 句子数 词数
train(训练) 25 10000 198252
dev(开发) 2:14 893 17743
test(测试) 6:15 2495 49085

还有训练好的语言模型word.3gram.lm和phone.3gram.lm以及相应的词典lexicon.txt。
thchs30的使用示例在kaldi-trunk/egs/thchs30/s5/run.sh中,需要注意的是将下载的data_thchs30.tgz、resource.tgz和test-noise.tgz分别解压到kaldi-trunk/egs/thchs30/thchs30-openslr下各自文件夹中,修改run.sh中thchs=/home/lx/kaldi-trunk/egs/thchs30/thchs30-openslr即可。

kaldi准备工作完成,下一篇介绍thchs30的run.sh。

你可能感兴趣的:(语音识别)