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
- 要抑制由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)也可以工作。