Wednesday, March 06, 2019

Mencoba Kaldi di Ubuntu 18.04, cuda9.0

Ini adalah catatan saya saat mencoba Kaldi (speech recognition toolkit) pada Ubuntu 18.04. Spesifikasi PC yang saya gunakan adalah CPU i9-7900X dan GPU GTX 1060. Hasil percobaan ini membuahkan satu paper yang saya submit pada ASJ spring meeting 2019.

Instalasi

Instalasi kaldi adalah proses pertama, dan bisa jadi, tersulit. Jika anda "SUCCESS" menginstall Kaldi, proses selanjutnya akan mudah. Jika tidak, akan terhenti. Berikut adalah dasar alur kerja setelah meng-clone Kaldi.

Pertama clone Kaldi ke direktori PC kita.

git clone https:/github.com/kaldi-asr/kaldi
Alur dasar instalasi:
1. Pada direktori tools
less INSTALL
./extras/check_dependencies.sh
make
Jika tidak ada masalah saat `check_dependencies` anda bisa melanjutkan ke `make`, jika tidak, selesaikan apa kekuarang dari persyaratan instalasi tersebut (bisa berupa library atlas, blas, dll). Kemudian, `make` lagi. Bisa juga make ditambahkan opsi `-j` jika running pada multicore CPU (umumnya), dan menspesifikasi compiler CXX (C++) jika tidak ingine menggunakan default ubuntu, misal `CXX=g++-5.0 make`. Saya menggunakan `CXX=g++-6.0` karena CUDA yang saya pakai (9.0) tidak komptaibel dengan GCC-7, bawaan default Ubuntu. 2. Pada direktori SRC
less INSSTALL
./configure --share
make depend -j 8
make -j
Banyak argument yang ditambahkan pada saat `configure`, misalnya direktori CUDA, libatlas dll. Contoh:
./configure --shared --use-gpu=no
Namun umumnya Kaldi sudah mengenali jika PC kita menggunakan GPU/tidak, dimana letak library dll. Jadi, gunakan alur dasar di atas dahulu, jika error, coba gunakan argumen yang sesuai. Saya sendiri tidak langsung berhasil saat instalasi Kaldi, butuh beberapa hari (plus luck!) untuk berhasil menginstallnya. Silahkan baca pertanyaan saya di grup Kaldi ini. Jika telah berhasil terinstall (tidak ada error), check instalasi anda dengan:
make test
Pastikan semua output textnya menampilkan kata "SUCCESS" untuk tiap library Kaldi, contoh:
$ make test
Running matrix-lib-test ... 2s... SUCCESS matrix-lib-test
Running sparse-matrix-test ... 0s... SUCCESS sparse-matrix-test
...
Inilah kenapa saya menyatakan harus "SUCCESS" menginstal Kaldi sebelum menggunakannya.

Troubleshooting

Diantara beberapa error yang saya hadapai, error-error berikut adalah yang paling vital. Saya copy-pastekan beserta solusinya dalama bahasa Inggris agar searchable di Google.

1. Error when "make test" on src/matrix.
Error message:
... FAIL matrix-lib-test
Dig more to find what actually broke. Use valgrind: "valgrind matrix-lib-test"
Output:
./matrix-lib-test: symbol lookup error: libkaldi-matrix.so: undefined symbol: clapack_sgetrf
==4035== 
==4035== HEAP SUMMARY:
==4035==     in use at exit: 16,256 bytes in 46 blocks
==4035==   total heap usage: 58,566 allocs, 58,520 frees, 8,833,488 bytes allocated
==4035== 
==4035== LEAK SUMMARY:
==4035==    definitely lost: 0 bytes in 0 blocks
==4035==    indirectly lost: 0 bytes in 0 blocks
==4035==      possibly lost: 5,472 bytes in 19 blocks
==4035==    still reachable: 10,784 bytes in 27 blocks
==4035==         suppressed: 0 bytes in 0 blocks
==4035== Rerun with --leak-check=full to see details of leaked memory
==4035== 
==4035== For counts of detected and suppressed errors, rerun with: -v
==4035== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

So the culprit is LAPACK.
Solution: Reinstall again liblapack via libatlas and libopenblas using apt-get or other method.

2. Error: Iteration stops on run_tdnn.sh no memory
Solution:
You shouldn't really be running multiple jobs on a single GPU. If you want to run that script on a machine that has just one GPU, one way to do it is to set exclusive mode via:
sudo nvidia-smi -c 3

and to the train.py script, change the option "--use-gpu=yes" to "--use-gpu=wait" which will cause it to run the GPU jobs sequentially, as each waits till it can get exclusive use of the GPU.

3.Errror: "Refusing to split data for number of speakers"
Solution:
You didn't provide enough info, but in general, you cannot split the directory in more parts than the number of speakers is. So if you called the decoding with -nj 30 and you have 25 speakers (you can count lines of the spk2utt file) this is the error you receive. So try to change number of speaker: value of argument "-nj" (30 in that example).

TDNN

Kaldi menggunakan TDNN sebagai classifier. TDNN merupakan kependekan dari "time delay neural network". Idenya adalah untuk mengurangi waktu komputasi pada feed forward network atau RNN yang cukup menguras sumber daya komputasi. Alih-alih memasukkan input pada jaringan secara bersamaan, input pada tiap layer dapat dimasukkan secara serial atau sekuensial.

Contoh riilnya jika kita punya input gambar dengan ukuran 28 x 28 piksel. Jika menggukanan DNN kovensional (misal MLP, multilayer perceptron), maka pada input layer kita memiliki 784 nodes (hasil kali 28 dengan 28). Dengan time delay neural network, citra piksel yang kita masukkan pada input layer hanya 28 piksel (baris pertama) pada satu waktu, 28 piksel pada waktu selanjutnya dan seterusnya sampai selesai. Sehingga, pada kasus tersebut kita hanya punya 28 node.

Pada pengenalan sinyal suara, maka inputnya berupa MFCC. Dalam hal ini ukuran datanya adalah 39 (jumlah fitur) dikali dengan panjang segment. Maka pada tiap satu waktu, TDNN memasukkan memasukkan fitur tersebut per waktu, jika tanpa subsampling. Jika dengan menggunakan subsampling, maka fitur pada konteks tersebut saja yang diambil, misal {-1, 1}. Pada contoh tersebut, hanya waktu t+1 dan t-1 saja fitur diambil. Penjelasan lebih lanjut tentang cara kerja TDNN ini bisa dibaca di paper saya yang juga disertakan di repo Github saya untuk uji coba kaldi dengan dataset bahasa Indonesia ini.

Pada gambar di bawah ini gambar warna merah adalah arsitektur TDNN menggunakan sampling {-1, 1} untuk semua layer. Jika tidak menggunakan subsampling, yang dipakai adalah gambar hitam dan merah.

Arsitektur TDNN dengan 6 layer: warna merah menunjukkan subsampling {-1, 1}

Hasil

Percobaan menggunakan Kaldi pada Ubuntu 18.04 ini membuahkan sebuah paper. Sebelumnya saya telah mencoba pada Ubuntu 14.04 dan 16.04 tapi tidak ada paper yang dihasilkan, hehe. Paper tersebut bisa dibaca di researchgate berikut (termasuk hasil WERnya, word error rate), untuk repository github (dataset tidak disertakan) bisa lacak di sini.
Related Posts Plugin for WordPress, Blogger...