OfficialKaldi(七)| Kaldi编译过程(翻译注解)

该页面以一般术语描述了Kaldi构建过程的工作方式。

另请参见外部矩阵库,以获取有关矩阵代码如何使用外部库以及由此产生的链接错误的说明;下载和安装Kaldi可能也很有趣。

Windows上的构建过程

Windows的构建过程与类似UNIX的系统的构建过程是分开的,并且在Windows / INSTALL中进行了描述(在一段时间之前使用Windows 7和Microsoft Visual Studio 2013进行了测试)。我们使用脚本来创建Visual Studio 10.0解决方案文件。Windows上的数学库有两个选项:Intel MKL或使用Cygwin编译ATLAS。提供了详细说明。但是,请注意,Windows安装程序已过时且未经定期测试,并且并非所有编译程序都可以编译。

我们的配置脚本如何工作(对于UNIX变体)

位于src /中的“配置”脚本应通过键入./configure来运行。该脚本采用各种选项。例如,您可以运行

   ./configure-共享

如果要使用共享库而不是静态库来构建安装程序(这可以使二进制文件更小),并且还需要使用各种选项来指定不同的Mat库,例如使用OpenBlas。查看脚本顶部以查看一些示例命令行。目前支持的配置脚本是Cygwin,Darwin(这是Apple的BSD UNIX版本)和Linux。配置脚本生成一个名为kaldi.mk的文件。该文件将以文本形式包含在子目录的Makefile中(请参见下文)。

编辑kaldi.mk

在运行“配置”之后,可能要对kaldi.mk进行以下更改:

  • 更改调试级别:
    • 默认值为“ -O1”
    • 通过取消注释选项“ -O0 -DKALDI_PARANOID”,可以启用易于调试的二进制文件。
    • 为了获得最大速度且不进行检查,可以将“ -O0 -DKALDI_PARANOID”选项替换为“ -O2 -DNDEBUG”或“ -O3 -DNDEBUG”
  • 更改默认精度
    • 要以双精度测试算法(例如,如果您怀疑舍入会影响结果),则可以在选项-DKALDI_DOUBLEPRECISION = 0中将0更改为1。
  • 禁止警告
    • 要抑制由OpenFst代码中的有符号无符号比较引起的警告,可以向CXXFLAGS添加-Wno-sign-compare

也可以修改kaldi.mk以使用不同的数学库(例如,使用CLAPACK代替ATLAS版本的LAPACK函数),并动态而不是静态地链接到数学库,但这很复杂,我们无法给出任何信息。使您能够执行此操作的通用说明(请参阅外部矩阵库以了解我们数学代码的编译过程)。使用选项来配置脚本可能会更容易。

由Makefiles定义的目标

Makefile定义的目标是:

  • “使依赖”将重建依赖关系。在构建工具箱之前运行此程序是一个好主意。如果.depend文件过期(因为尚未运行“ makedepend”),则可能会出现如下错误:
    make [1]:***没有规则来建立目标`/ usr / include / foo / bar',这是`baz.o'所需要的。停止。
    
  • “全部制作”(或仅“制作”)将编译所有代码,包括测试代码。
  • “ make test”将运行测试代码(用于确保构建可以在您的系统上正常工作,并且没有引入错误)
  • “ make clean”将删除所有已编译的二进制文件,.o(目标)文件和.a(归档)文件。
  • “ make valgrind”将在valgrind下运行测试程序以检查内存泄漏。
  • “ make cudavalgrind”将运行测试程序(在cudamatrix中),以检查具有GPU卡的计算机的内存泄漏,该计算机支持NVIDIA CUDA和安装CUDA的OS。

编译后的二进制文件在哪里?

当前,Makefiles不会将已编译的二进制文件放在特殊位置。他们只是将它们保留在相应代码所在的目录中。目前,二进制文件存在于目录“ bin /”,“ gmmbin /”,featbin /”,“ fstbin /”和“ lm /”中,它们都是“ src /”的子目录。将来,我们可能会指定一个放置所有二进制文件的单个位置。

我们的Makefile如何工作

当前,文件src / Makefile仅在所有源子目录(src / base,src / matrix等)中调用Makefile。这些目录具有自己的Makefile,所有文件都具有相同的结构。它们都包括以下行:

包括../kaldi.mk

这就像C中的#include行(其中包含kaldi.mk的文本)。读取kaldi.mk时,请记住要从实际位于其下的一个目录(位于src /中)调用它。kaldi.mk文件的外观示例如下。这是针对Linux系统的;我们删除了一些与valgrind相关的规则,这些规则不是很重要。

ATLASLIBS = /usr/local/lib/liblapack.a /usr/local/lib/libcblas.a 
          /usr/local/lib/libatlas.a /usr/local/lib/libf77blas.a
CXXFLAGS = -msse -Wall -I .. 
      -DKALDI_DOUBLEPRECISION = 0 -msse2 -DHAVE_POSIX_MEMALIGN 
     -DHAVE_EXECINFO_H = 1 -rdynamic -DHAVE_CXXABI_H 
      -DHAVE_ATLAS -I ../../tools/ATLAS/include 
       -I ../../tools/openfst/include 
      -g -O0 -DKALDI_PARANOID
LDFLAGS = -rdynamic
LDLIBS = ../../tools/openfst/lib/libfst.a -ldl $(ATLASLIBS)-lm
CC = g ++
CXX = g ++
AR = ar
AS = as
RANLIB = ranlib

因此,kaldi.mk负责设置包含路径,定义预处理程序变量,设置编译选项,与库链接等。

Kaldi在哪些平台上进行了编译?

我们已经在Windows,Cygwin,各种Linux(包括Ubuntu,CentOS,Debian,Red Hat和SUSE)和Darwin上编译了Kaldi。我们建议您使用g ++ 4.7或更高版本,尽管已知其他编译器(如llvm和Intel的icc)也可以工作。

原文地址:https://www.cnblogs.com/AIBigTruth/p/14127036.html