레이블이 SRILM인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SRILM인 게시물을 표시합니다. 모든 게시물 표시

2019년 10월 10일 목요일

SRILM을 IBM POWER (ppc64le) 아키텍처의 Redhat에서 build하기


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