简介

使用Kaldi最理想的环境是配备集群任务分发工具,如Sun GridEngine。如果同时使用多个服务器组成的集群,还需要能同时访问的共享文件系统,如NFS。即便没有这些,你也可以在单个一台服务器上方便地安装Kaldi。

在主示例脚本中,如egs/wsj/s5/run.sh,可以看到如下的命令

steps/train_sat.sh --cmd "$train_cmd" \ 4200 40000 data/train_si284 data/lang exp/tri3b_ali_ai284 exp/tri4a

在run.sh的最上面,可以看到脚本引用了一个叫做cmd.sh的文件

. ./cmd.sh

在cmd.sh里面,可以看到如下的变量赋值语句

export train_cmd="queue/pl -l arch=*64"

如果你没有配置GridEngine,或者你的任务队列设置与约翰霍普金斯大学的CLSP实验室(译者注:Daniel Povey所在的实验室,下文中简称CSLP@JHU)不同,那么你需要更改这个变量的值。如果在一台本地服务器上运行,则要设置export train_cmd=run.pl

在steps/train_sat.sh中,变量cmd被传给了--cmd选项,也就是说在这个示例中,--cmd选项的值被设为queue/pl -l arch=*64。在任务脚本中,可以看到如下的命令

$cmd JOB=1:$nj $dir/log/fmllr.$x.JOB.log \ ali-to-post "ark:gunzip -c $dir/ali.JOB.gz|" ark:- | \ weight-silence-post $silence_weight $silphonelist $dir/$x.mdl ark:- ark:- | \ gmm-est-fmllr --fmllr-update-type=$fmllr_update_type \ --spk2utt=ark:$sdata/JOB/spk2utt $dir/$x.mdl \ "$feats" ark:- ark:$dir/tmp_trans.JOB || exit 1;

这条命令的意思是执行$cmd(如queue.pl或者run.pl)指令。它负责产生任务,然后等待它们结束,最后如果中间出现什么差错的话返回一个非零的状态标记。这些指令(除此之外还有其他的如slurm.sh和ssh.sh等)的基本使用方法是

queue.pl <options> <log-file> <command>

最简单的一个例子是

run.pl foo.log echo hellow world

(举这个run.pl的例子是因为它可以在任何系统上运行,不依赖于GridEngine)。也可以尝试创建一个任务队列,如

run.pl JOB=1:10 foo.JOB.log echo hello world number JOB

这样,被执行的指令就会将所有JOB字符替代为给定范围的数字。所以,需要确认你的工作目录中不包含JOB,否则无法正常工作。借助引用符和输出符,你也可以用pipe或者redirection提交任务

run.pl JOB=1:10 foo.JOB.log echo "hello world number JOB" | head -n 1 \> output.JOB

这种情况下,实际被执行的指令是

echo "hello world number JOB" | head -n 1 > output.JOB

如果想查看实际执行的指令,可以打开foo.1.log文件,其内容如下

echo "hello world number 1" | head -n 1 output.1 # Started at Sat Jan 3 17:44:20 PST 2015 # # Accounting: time=0 threads=1 # Ended (code 0) at Sat Jan 3 17:44:20 PST 2015, elapsed time 0 seconds

results matching ""

    No results matching ""