工欲善其事,必先利其器,机器、数据、算法对深度学习都非常重要。
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,得到的结果如下:
注意processes项的not supported,出现这个是因为gpu太老或者太弱,不支持显示它正在运行的进程。上例中gpu0是gtx650,gpu1是gtx1060,在进行dnn训练任务时,processes项会显示gpu1运行的进程名,以及占用的显存。
顺便一提,在kaldi的运行日志中,可以见到这样一个警告
Suggestion: use 'nvidia-smi -c 3' to set compute exclusive mode
查阅smi的文档(http://developer.download.nvidia.com/compute/DCGM/docs/nvidia-smi-367.38.pdf)可知,-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,这个数据集包含的内容如下:
还有训练好的语言模型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准备工作完成。