약 한달전, Google은 Research Blog를 통해 SyntaxNet이라는 자연어 처리 오픈소스를 공개하였습니다. 우연히 제가 그 포스트에 관심을 갖게되었고, 번역하여 저의 블로그에 포스팅하였는데 그것이 많이 공유되면서 상당히 많은 분들에게 전파된 것 같습니다. (나는프로그래머다, TensorFlow KR 등등의 분들 감사합니다.)


그래서 무언의 압박감이랄지 어떤 책임감이 들어서 SyntaxNet을 혼자 다방면으로 연구해보고 있습니다. 아직까지 많은 부분이 진행중이고, 갈 길이 멀지만 완료된 부분부터 하나하나씩 블로그를 통해 공개하려합니다.


우선, 시작이 반이다라는 속담이 있듯이, 이번 글은 설치 및 환경설정에 대한 내용입니다.


서버 엔지니어분들은 이러한 작업을 많이 해보셔서 잘 아실겁니다. 리눅스에서 무엇인가를 새롭게 설치하고, 구동시킨다는 것은 상당히 쉽지않고 불편합니다. 윈도우처럼 설치파일을 마우스 더블클릭만으로 뿅!하고 끝나지 않지요.. Mac은 말할 것도 없습니다. Mac을 일반 개발용 PC로 사용한다면 참 편리하지만, 괜히 Mac mini Server로 뭔가 해보려고 마음먹을 때마다 사서 고생하는 느낌이 들더군요..


Github에 나와있는 Installation 항목을 보면, 단순히 apt-get 명령어 몇번으로 다 될것처럼 간단해보입니다. 그걸 절대 믿으면.. 안됩니다.. -_ㅠ


서론은 여기까지하고, 한 단계씩 수행해보도록 하겠습니다.


1. Python 2.7

파이썬2가 설치되어 있어야 합니다. Ubuntu나 Mac은 기본적으로 파이썬이 내장되어있기 때문에 .. 설치방법은 생략하도록 하겠습니다. 다만, Python 3버전은 아직 SyntaxNet에서 공식 지원하지 않습니다.


2. JDK 8

JDK란 자바 언어로 작성된 응용프로그램이 실행되기 위한 환경(JRE)와, 개발에 필요한 패키지 등이 포함된 것입니다. SyntaxNet에서는 JDK 8 이상의 버전이 요구됩니다.

1) Ubuntu 14.04 LTS 에서 JDK 8 설치하기 : 
2) Mac OS X 에서 JDK 8 설치하기 : 

먼저 오라클 홈페이지에 접속하여 다운로드 탭으로 갑니다. 다운로드시에는 계정이 필요한데, 대충 이메일만 입력하여 가입이 끝납니다. 가입 후 jdk-8u91-macosx-x64.dmg 파일을 다운로드 하십시오. 그리고 더블클릭하여 설치를 진행하시면 됩니다.


3. bazel

bazel은 구글에서 공개한 오픈소스로, 개발자들이 손쉽게 다양한 플랫폼에서 코드를 빌드하고 테스팅할 수 있도록하는 패키지입니다. bazel 설치 공식 메뉴얼을 확인하실 수 습니다. SyntaxNet에서는 bazel의 버전을 0.2.0 - 0.2.2b를 권고하고, 0.2.3은 사용하지 말라고 되어있습니다. 그런데 제가 Mac에서 0.2.3으로 설치를 해보니 어쨌건 작동은 합니다. 무튼 찝찝하신 분들은 0.2.2b를 설치하시기 바랍니다.

1) Ubuntu 에서 bazel 설치하기
2) Mac에서 bazel 설치하기

우선 맥에서는 패키지 관리 프로그램인 brew를 사용하는 것을 권장합니다. 이 때 별다른 옵션을 주지 않으면 최신버전인 0.2.3이 깔립니다.


4. swig


5. protobuf

지금부터는 파이썬과 관련된 패키지들을 설치할 것입니다. 맥이나 리눅스에서 모두 pip 패키지 관리를 동일하게 이용합니다. 먼저 protobuf입니다. 우선 SyntaxNet 설치가이드에는 다음과 같이 딸랑 한줄 적혀있습니다. 

우선 제작사의 지시대로 해보시고, 오류가 나시는 경우 아래를 확인해주세요. 저는 여기에서 한시간정도 삽질을 했었기에 ㅠ ㅠ 저와 같은 증상이신 분들은 고생하지 않기를 바랍니다.

1) sudo 를 붙여본다. : sudo pip install -U protobuf==3.0.0b2

2) sudo에 -H옵션을 붙여본다. : sudo -H pip install -U protobuf==3.0.0b2

3) 이랬는데도 안되면, Mac OS X El capitan을 사용하고 계실 확률이 높습니다. (제가 그랬거든요 ㅠ) protobuf를 설치할 때 자동으로 six라는 패키지를 삭제했다가 다른 버전으로 재설치하는 과정이 포함되어 있습니다. 이때 운영체제가 six를 못지우게 막습니다. 그래서 설치중에 오류가나면서 종료됩니다. 이를 해결하기 위해서는 설치시에 six관련 내용은 건너뛰도록 지정합니다.


6. asciitree

아스키 트리는 트리 자료구조를 표현해주는 파이썬 패키지입니다. SyntaxNet을 통해 처리한 결과는 다음과 같은 트리구조로 표현됩니다.

다음 명령어를 통해 설치합니다.

(잘 안되면 sudo를 붙여서 다시 해주세요..)


7. Numpy 

수학관련 라이브러리인데, SyntaxNet을 구동하기 이전에 기본적으로 tensorflow를 작동시키기 위해서 필요합니다. Numpy 또한 pip로 간단히 설치할 수 있습니다. (이미 설치되어 있을 가능성이 큼)


8. SyntaxNet 설치 :

이제 준비작업이 끝났습니다. 본격적으로 SyntaxNet을 설치해봅니다. 우선 편의를 위해 전용 폴더를 만들어놓겠습니다. 저는 Mac을 기준으로 /Users/cpuu/Documents/에 mkdir 로 SyntaxNet 디렉토리를 만들었습니다. 그러므로 지금부터 언급하는 기본 경로는 /Users/cpuu/Documents/SyntaxNet 입니다. 해당 위치에서 아래의 명령어로 구글 git 저장소에서 SyntaxNet을 가져옵니다.

다운로드가 끝나면, 해당 디렉토리로 들어가서 tensorflow 관련 환경설정을 해야합니다.

환경설정시에 다음 3가지 항목을 물어봅니다.

  • 파이썬의 기본 경로는 어디인지? (default : /usr/bin/python)
  • TensorFlow 빌드할 때 구글 클라우드 플랜폼에서 가져올 것인지? (default : No) -> 저는 yes했습니다.
  • TensorFlow에서 GPU 옵션을 할 것인지? (default : N) -> N


9. bazel test

설정이 끝났으면 bazel을 사용해서 빌드 및 제대로 빌드가 되었는지 테스팅을 합니다.

1) Ubuntu 의 경우 :
2) Mac의 경우 :

먼저 which bazel 명령어를 사용해서 bazel 이 Path가 제대로 잡혀있는지를 봐야합니다. 위에서 분명히 설치했는데도 bazel 명령어를 사용했을 때 Command not found가 나온다면 Path가 안잡힌 것입니다. 어디에 설치되어있는지 볼까요?

저의 경우에는 0.2.3을 깔았더니 경로가 /usr/local/Cellar/bazel/0.2.3에 있다고 하네요.. 여기에 찾아들어가서 bazel을 사용하셔도 되고, 직접 절대경로를 입력하여 실행시키는 방법도 있습니다. 하지만 추후 사용의 편의를 위해 심볼릭 링크를 걸어보도록 하겠습니다. 

위의 코드와 같이 심볼릭 링크를 걸고, which bazel 을 입력했을 때 /usr/local/bin/bazel에 있다고 뜨면 성공적으로 된 것입니다. 쉽게말해 '바로가기' 링크를 걸어둔 것입니다. 이제 bazel 빌드 및 테스팅을 합니다.

이 부분은 컴퓨팅 환경에 따라 20~30분 정도 소요됩니다. 제가 테스트 완료된 화면을 캡쳐하지를 못해서 구글링을 통해 찾아보았습니다. 대략 다음과 같은 테스팅 완료화면이 뜹니다.


10. SyntaxNet demo.sh 사용해보기

이제 설치가 완료되었습니다. 여기까지 하셨으면 SyntaxNet이 사용가능한 상태이긴합니다. 하지만 문제는 이것을 구체적으로 잘 활용할 Python Wrapping code가 아직 공식적으로 없다는 것입니다. 이 부분을 제가 Google SyntaxNet Team의 메일(syntaxnet-users@google.com)로 질의도 하였지만 아직까지 답변이 없네요... (내 영어를 못알아들었나? ㅠㅠ) 무튼 그래서 파이썬 Wrapping을 혼자 해보고있는데.. 그부분은 좀 더 완성도가 높아지면 다음 포스팅에 공개하도록 하겠습니다.


우선 지금 설치 직후에 SyntaxNet을 사용해보기 위해서는 기본으로 제공된 demo.sh를 사용하는 것입니다. 이게 제대로 실행되기 위해서는 올바른 경로상의 디렉토리에서 명령어를 수행해야만 합니다. 왜냐하면 여러가지 라이브러리들을 호출해오는데 이거를 이상하게 링크를 걸어놓았더라고요.. demo.sh 를 수정해야 될것 같은데.. 우선은 빠른 사용을 위해서 간단히 실행만 해보겠습니다. 저의 설치 디렉토리 기준으로 다음으로 이동합니다.

그리고 커맨드 라인의 Pipe ( | ) 를 사용해서 echo를 통해 분석하고자 하는 영어 문장을 다음과 같이 전달하면 됩니다.

그러면 이상한 로그 메세지들이 (아마 syntaxnet이 tensorflow로 트레이닝 하는 과정인 것 같습니다) 쭈욱 지나가면서 마지막에 다음과 같은 결과화면이 뜹니다. 

저는 개인적으로 결과물의 이런 모양새가 별로 마음에 들지는 않습니다. 그 예로 구글 블로그에서는 위와 똑같은 결과를 아래와 같이 그림으로 아름답게 표현해 주었습니다. 훨씬 이해가 쉽지요.

시각화(visualization)를 할 수 있는 방안이 마련되어야 할 것 같습니다.


어쨌든 이제 demo.sh 를 사용해서 Google이 트레이닝 시켜놓은 모델인 Parsey McParseface 를 그대로 가져와서, 원하는 문장에 대한 구문분석 트리를 생성할 수 있게 되었습니다. 혹시 트레이닝 모델을 직접 학습시켜서 적용하고 싶으신 분들은... 저도 그 부분을 아직 연구중이어서 ㅠ 추후 기회에 해보도록 하겠습니다.


우선 남겨진 과제 중 제가 생각하는 시급한 문제는 이렇습니다.

  • 매번 설치된 디렉토리를 직접 찾아가서 꼭 해당 위치에서만 실행해야 작동한다는 점.
  • 그려지는 트리 그래프가 사람이 한눈에 보고 이해하기에 불편하다는 점.
  • 파이썬을 사용해서 전처리 및 후처리를 할 수는 없을까?

이 세가지에 대한 개선방법을 연구하고 다음 포스팅을 하도록 하겠습니다.


CPUU님의 창작활동을 응원하고 싶으세요?