SRILM은 음성인식 등에 쓰이는 statistical language model(LM)들을 쉽게 구축하고 적용할 수 있는 toolkit입니다. 이것을 IBM POWER 서버에 설치된 Redhat이나 Ubuntu 등 linux OS에서도 build해서 사용할 수 있느냐에 대한 답변은 "Yes, 된다" 입니다.
SRILM의 현재 최신버전인 1.7.3 버전에서는 ppc64 (big-endian) 만 지원하는 것처럼 되어 있습니다만, 이는 그냥 ppc64le가 template에 아직 update가 안되었을 뿐이며, template만 약간 수정하면 ppc64le (little-endian)에서도 쉽게 build 하실 수 있습니다.
먼저, 필요 OS fileset들을 설치합니다. 여기서는 Redhat 7.5를 기준으로 했습니다.
[user612@p612-met1 ~]$ sudo yum install -y gawk tcl-devel libticonv-devel bzip2
SRILM의 최신 버전 1.7.3을 아래 URL에서 download 받고, POWER 서버에 upload 합니다.
http://www.speech.sri.com/projects/srilm/download.html
압축을 해제합니다.
[user612@p612-met1 ~]$ mkdir srilm
[user612@p612-met1 ~]$ cd srilm
[user612@p612-met1 srilm]$ tar -xvf ../srilm-1.7.3.tar.gz
먼저 source에 포함된 machine-type 이라는 shell script를 수행해보면 MACHINE_TYPE을 못 찾겠다는 error가 납니다. 이는 아래와 같이 shell script를 약간만 수정하면 해결됩니다.
[user612@p612-met1 srilm]$ ./sbin/machine-type
could not determine MACHINE_TYPE
[user612@p612-met1 srilm]$ vi ./sbin/machine-type
...
*)
case "`uname -m`" in
ppc64) MACHINE_TYPE=ppc64
;;
ppc64le) MACHINE_TYPE=ppc64le # Newly added
;; # Newly added
i686) MACHINE_TYPE=i686
;;
이제 잘 됩니다.
[user612@p612-met1 srilm]$ ./sbin/machine-type
ppc64le
이어서 Makefile에서 SRILM home directory를 update 합니다. 사실 이건 ppc64le 아키텍처에서만 수정해야 하는 것이 아니라 x86 등 모든 아키텍처에서 다 환경에 맞게 수정해야 하는 부분입니다.
[user612@p612-met1 srilm]$ vi Makefile
...
# SRILM = /home/speech/stolcke/project/srilm/devel
SRILM = /home/user612/srilm # Update per environment
ppc64le 아키텍처가 지원 안되는 것처럼 보이는 것은 아래의 common/Makefile.machine.* 파일들에 ppc64만 있고 ppc64le가 없기 때문입니다. 그냥 기존의 ppc64를 ppc64le로 copy해줍니다.
[user612@p612-met1 srilm]$ cp common/Makefile.machine.ppc64 common/Makefile.machine.ppc64le
그리고 여기서 LINK할 library에 pthread를 추가해줍니다. (이를 안 해주면 어떤 error가 나는지는 맨 아래에 적었습니다.)
[user612@p612-met1 srilm]$ vi common/Makefile.machine.ppc64le
...
# ADDITIONAL_LIBRARIES = -lm -ldl
ADDITIONAL_LIBRARIES = -lm -ldl -lpthread # Added -lpthread
...
이제 그냥 make를 수행하시면 됩니다. 아무 error 없이 잘 build 됩니다.
[user612@p612-met1 srilm]$ make -j16
이제 PATH를 잡아주고 ngram 명령을 수행해봅니다. 아래와 같이 잘 수행되는 것을 보실 수 있습니다.
[user612@p612-met1 srilm]$ pwd
/home/user612/srilm
[user612@p612-met1 srilm]$ export PATH=$PATH:/home/user612/srilm/bin/ppc64le
[user612@p612-met1 srilm]$ ngram -help
Usage of command "ngram"
-version: print version information
-order: max ngram order
Default value: 3
-debug: debugging level for lm
Default value: 0
-skipoovs: skip n-gram contexts containing OOVs
...
** 만약 위에서 common/Makefile.machine.ppc64le 속의 "ADDITIONAL_LIBRARIES = -lm -ldl -lpthread" 부분을 고치지 않는다면 다음과 같은 error를 겪게 되실 것입니다. 이 error가 나는 이유는 /usr/lib64/libpthread.so.0 가 참조되지 않기 때문이니, 위와 같이 common/Makefile.machine.ppc64le을 수정하시면 해결됩니다.
...
g++ -Wreturn-type -Wimplicit -DINSTANTIATE_TEMPLATES -I. -I../../include -u matherr -L../../lib/ppc64le -g -O3 -o ../bin/ppc64le/ngram-merge ../obj/ppc64le/ngram-merge.o ../obj/ppc64le/liboolm.a -lm -ldl ../../lib/ppc64le/libflm.a ../../lib/ppc64le/libdstruct.a ../../lib/ppc64le/libmisc.a ../../lib/ppc64le/libz.a -ltcl -lm 2>&1 | c++filt
/usr/bin/ld: ../obj/ppc64le/liboolm.a(Vocab.o): undefined reference to symbol 'pthread_getspecific@@GLIBC_2.17'
//usr/lib64/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
test -f ../bin/ppc64le/ngram-merge
make[2]: *** [../bin/ppc64le/ngram-merge] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory `/home/user612/srilm/lm/src'
make[1]: *** [release-programs] Error 1
make[1]: Leaving directory `/home/user612/srilm'
make: *** [World] Error 2
댓글 없음:
댓글 쓰기