2017년 5월 10일 수요일

QnA Chabot (or Text Classification) 성능 향상 Tip

요즘 블로깅 할시간이 없어, 대신 최근 Facebook 의 질문에 조금 장문으로 답변한 내용을 기록으로 남겨 보았다. 사실, 조금 시간이 있다면, 아래 짧게 짧게 언급했던것들이 실제로 테스트 했던 데이타로 어떻게 얼마나 성능향상에 기였 했는지, 실 사례들을 함께 공유하고 싶으나... 시간이 없어서 TT.













2017년 3월 14일 화요일

Azure 상에서 Tensorflow GPU instance 이용하기

Community 에 한분께서 아래와 같이 질문을 주셨습니다. 이에대한 답변을 Facebook 에 작성하다 보니, 글이 너무 길어지는 듯 하여, 이곳에 옮겨 적어 봅니다.

Q) AzureML에서 Tensorflow를 연동하는 방법을 아시는 분이 계신가요-제가 아는 범위에선 Theano 연동하는 정도만이네요 ㅠㅠ

A) 답변입니다.

안녕하세요. Data Platform MVP 인 김훈동입니다. Azure 상에서 Tensorflow 를 쓰는 몇가지 방법이 있습니다. 질문에서 AzureML 이라고 언급 주셨는데, Azure ML Studio 등에서의 사용이 아닌 Azure 상에서의 Tensorflow 구동 이라고 질문을 이해했습니다. Azure ML Studio 에서는 Tensorflow Azure 에 구축한 별도 Instance 에 원격 실행 컴멘드를 날려서 Training 을 시키고, Tensorflow Serving Layer 를 이용하여, Input 에 대한 Output Restful 하게 받아 Azure ML Studio 에서 연동하는 방법이 있을 것입니다

아래부터는 Azure Tensorflow Cluster(GPU 포함)를 구축하는 방법론입니다.

(1)   가장쉽게
A.     Azure Instance Gallery 에서 Deep Learning Toolkit for DSVM 이미지 VM을 사용하는 방법
                         i.         OS Windows 2012 RC2 입니다.
                        ii.         GPU 사용이 가능합니다.(Region east US 등으로 하면 N-Series가 보입니다.)
                       iii.         CNTK, Keras, Tensorflow, mxnet 가 모두 기본 세팅되어 있고, MS R, Jupyter Notebook, Python Anaconda등이 설치되어 있으며, Visual Studio Data Science 툴들과 Spyder IDE 등이 세팅되어 있고, 요즘 도전적인 Data Scientist 들에게 Hot Julia Lang 개발환경까지 세팅되어 있습니다.
                       iv.         Jupyter Notebook 을 열면 Tensorflow, CNTK 등의 Example 이 담긴 Notebook 들이 폴더 별로 정리되어 구동됩니다.
                        v.         Ubuntu 에서 쓰시다가 Windows 위에서 사용하는 경우 호환문제를 걱정하시는 분들이 간혹 계시는데, UTF8 한글 부분과 일부 Old 스타일 CSV 핸들링 패키지를 제외하고, 문제가 되는 경우는 별로 없습니다.

(2)   Ubuntu 가 편하다면
A.     Ubuntu Instance 에 기본 Tensorflow 가 세팅된 인스턴스는 아직 존재하지 않는 것으로 보입니다. 제가 하나 만들어서 올릴까봐요. ^^
B.      하지만, Tensorflow 설치가 그리 어렵지 않으므로, Ubuntu VM 에 직접 설치하셔도 됩니다.
C.      동남아시아나 eastUS 등에 가셔서 N-Series 를 선택하시면, GPU Ubuntu VM 을 만드실 수 있습니다. 여기서 주의할점은 이상하게 Ubuntu VM은 디스크 Type SDD가 아닌 HDD 를 선택해야 N-Series 가 보인다는 점 입니다. 그런데, 최종 만들어진 Information 을 보면 SSD 가 포함되어 있습니다.

(3)   Windows10 Instance 에 설치하여 사용하는 방법.
A.     Tensorflow 1.X 가 정식으로 릴리즈 되면서, Windows 10 에도 꽤 쉽게 설치가 가능합니다.
B.      , 현재 Windows 64비트만 지원합니다.
C.      Anaconda 64비트 설치 후 설치하면 더 쉽습니다.
D.     특히 CUDA cuDNN Windows Linux보다 훨씬 설치가 간단합니다.
                         i.         CUDA cuDNN 설치 후 내컴퓨터->우클릭->속성->환경변수 가서 path 만 잡아 주면 끝
E.      Pip GPU 버전 설치할 때,  2월 말까지만 해도, whl 파일 경로가 win_x86_64.whl 요런식으로 되어 있었고, 해당 파일은 오류가 있었는데, 현재 win_amd64.whl 로 바뀌어 있구요. 그 파일이 원래 Windows 에서 오류없이 깔리는 것으로 Blog 등에서 공유되었던 파일입니다. 현재는 공식 install guide 문서가 수정되어 있습니다. (최근에 수정되었네요2017년 3월 현재.)

(4)   Docker 사용방법
A.     영재MVP님께서 말씀해 주신 것 처럼 Docker를 이용할 수도 있습니다. Docker VM보다 유리한 점들이 분명 있죠. 장단점이 있는 것 같습니다.

(5)   좀더 고급스럽게 사용하는 방법
A.     요즘 제가 열심히 실험하고 있는 방법입니다. 실무 시나리오 사용성 검증이 끝나면 블로그 하고 공유 드리도록 하겠습니다.
B.      HDInsight Spark Cluster 가 필요합니다.
                         i.         HDinsight Spark Cluster 가 기 세팅되어 있는 Instance 를 구동합니다.
                        ii.         추가로 Tensorflow Keras 를 설치합니다.
                       iii.         오픈소스인 elephas 를 설치합니다.
                       iv.         실험해보고 있는데요. 위 조합에서는 Tensorflow Spark 의 강점을 조합할 수 있고, 추가로, Tensorflow Model에 대하여 아래와 같은 것들이 가능합니다.


답이 잘 되었으면 좋겠네요. ^^

2017년 2월 28일 화요일

MS Cognitive Service - OCR API 활용기

OCR(Optical character recognition) 은 PDF ,출력 Scan 된 문서나 아날로그 Ouput , 상품 카달로그 이미지, 혹은 사진 등 에서 문자영역을 인식하고, Image Processing 이나 deep learning 기술을 이용, digital 화 가능한 문자를 추출하는 기술이다.

한때(불과 몇년 전만 해도) 해당 기술은 그리 정확도가 높지 않아, Scan된 문서나, 명함에서의 Text 추출 정도에서만 사용되었으나, 최근에는 OCR에 있어서도 Deep Learning 기술이 이용되면서, 그 정확도가 매우 향상되었다.

현재는 실시간 사진 업로드 및 스마트폰 카메라와 연동된 다양한 Business Model 들이 나오고 있는 추세이다.

OCR 관련 하여서는 다양한 API 나 제품 솔루션이  있으며, Open Source 또한 존재한다. 뒤에서 언급하겠지만, Google API 는 Github 에 Source 가 Open 되어 있다. 하지만, OCR 은 훌륭한 Open Source 가 있어도, Open API 가 좀더 유리한 분야 중 하나이다. Training 을 위한 Data 확보가 쉽지 않은 분야이기 때문이다.

Open API 및 제품 솔루션 중 가장 알려진 솔루션은 아래 세가지 이다.
각각이 장단점이 있는데, 간략하게 비교해보면 아래와 같다.
  1. Google OCR 
    1. github 에 소스가 오픈되어 있다.
    2. 적은 양이지만, Data 도 있다.
    3. 성능은 복합적인 이미지 내 문자의 경우 정확도 60% 정도.
    4. [장점] 소스가 오픈되어 있어, 기술 자체를 내재화 하고자 할때 좋은 시작 솔루션이 될 수 있음. Open API 도 있는데, 가격대가 4단계로 세분화 되어 있음.
    5. [단점] 한글의 경우 성능이 그다지 좋진 않음. 전문 솔루션 회사를 인수. 인수 시점이 꽤 되서, 해당 솔루션이 Deep Learning  기반은 아닌듯.
  2. MS OCR
    1. Open API 형태로 Cloud 사용량 Base 과금.
    2. Document 화가 잘 되어 있음.
    3. 성능은 복합적인 이미지 내 문자의 경우 정확도 85% 정도. 스캔 문서의 경우 정확도 90% 정도.
    4. [장점] 한글의 경우에도 성능이 꽤 좋은 편. 복잡한 이미지 내 문자이든, 스캔문서의 문자이든 고르게 성능이 나옴. 
    5. [단점] 구글이 4단계 볼륨별 과금인 반면 MS 는 3단계. 3단계 까지는 가격이 Google 과 동일하나, 4단계 초 대 용량은 Google 이 더 저렴한 요금제 제공. 소스는 없음.
  3. Abbyy
    1. 설치형 제품.
    2. 코어당 라이센스 혹은 서버당 트랜잭션 Limit 라이센스
    3. 성능은 복합적인 이미지 내 문자의 경우 인식이 Skip 되는 경우 많음 정확도 70% 정도. 스캔 문서의 경우 정확도 95% 정도.
    4. [장점] 스캔문서의 경우 정확도 가장 높음. 다양한 부가 Tool 제공. 
    5. [단점] 설치형 제품이라 비쌈. 복합적인 이미지 내부의 활자의 경우 정확도 떨어지고, 활자를 skip 해 버림. 내부 하드웨어를 구비해야 함. Linux 버전은 관리 및 개발 편의 Tool이 빈약함.
위 3가지가 각각 장단점이 있으나, 아래는 Open API 방식을 제공하는 MS OCR 과 Google OCR 의 성능 비교 예시이다.

1. MS OCR API
- 좌측 원본 이미지, 우측 OCR Text


2. Google OCR API
- 위 동일 이미지에 대한 OCR Text


위 처럼 이미지 내에서 활자를 뽑아냄에 있어, MS 가 Google 의 그것 보다 훨씬 좋은 성능을 보여 준다.

MS API 는 Restful API 의 Return String 이 JSON 형태이다. 해당 JSON 으로 부터 Plain Text 뿐 아니라, 각 문자들의 그룹별(이미지 이므로 문단이 그룹단위로 표현 가능) 위치 좌표를 뽑을 수 있다.(단어 단위의 좌표 또한 제공하고 있다.)

아래는 각각을 Parsing 하여 추출하는 Source 이다. MSDN Example 에는 아래와 같은 Parsing Source 예시가 존재하지 않아, 간단하게 만들어 본 예이다. JSON Parser 를 써도 되겠지만, JSON Structure 구조가 패턴화 되어 있어, 아래와 같은 트리구조 loop 패턴으로 코딩 구현하면, 어떤 Language 에서든 손쉽게 원하는 정보 추출이 가능하다.

1. Plain Text 추출 Source (Example)


2. 문단별 좌표 포함 Text 추출 Source (Example)


Spark Machine Learning - Deep Dive ( and Deep Learning )

2017년 2월 두번의 Spark Machine Learning 및 Deep Learning 관련 Speaking 을 했다.
  1. 스사모 팍스 스터디 모임.
    1. 2017년 2월 20일
    2. Spark 로 하는 Machine Learning 실무에서의 Pain Point 와 그 극복 방법
    3. MS R on Spark, Tensorflow(+ Keras) on Spark, Python scikit-learn on Spark 등 다양한 Machine Learning 및 Deep Learning 도구들을 Spark 와 hybrid 하게 사용하는 방법
  2. 대한민국 개발자 커뮤니티 데이.
    1. 앞선  팍스 스터디 모임 내용과 다소 겹치지만, 좀더 고찰 내용에 치중했다.
    2. 빅데이타 개발자 혹은 개발자 Base 머신러닝 Data Scientist 가 AI시대에 임하는 자세. 등등...
위 두 모임에서의 발표 내용을 Merge 하여 슬라이드로 만들어 보았다.

2016년 12월 31일 토요일

MS R(구 Revolution R) on Spark - 설치 및 가능성 엿보기(feat. SparkR)

BigData Scale Data 분석 및 활용 업무를 하다보면, 도구나 사용 언어, 사용 기술 등에 있어 여러가지 선택의 기로에 서게 되는 경우가 종종 있다.

물론 혹자는 특정 언어나 특정 기술로 많은 것을 처리하는 것을 선호하기도 하지만(전문성 증대, 기술의 장인정신 측면에서 이 방식의 유리한 점이 존재한다.), 혹자는(나를 포함) 다양한 언어나 기술을 섞어 쓰면서, 처한 상황(Problem)에 가장 최적화된 기술이나 언어로 유연하게 접근하는 것을 선호하기도 한다.

그러한(후자) 측면에서 보았을때, R은 다양한 기술을 섞어 쓰는 BigData Scientist(혹은 BigData 개발자나 Machine learning 개발자) 에게는 참 계륵 같은 기술이었다. 소위 보편적인 Data 모델러들은, BigData Scientist 보다 R(SAS, Matlab, SPSS 포함)을 더 잘 다루는 것이 일반적이기도 하거니와, 그들과 Co-Work 접근을 해야 하는 경우는, 이미, R이나 SAS 로 무언가 문제가 직면되어 있는 경우가 많기 때문이다. BigData Scale을 다루는 경우이거나, Heavy 한 Machine Learning 작업이 필요하거나, Deep learning 접근이 필요한 경우가 그러한 경우의 일예라 할 수 있다.

이 경우 서로가 잘하는 영역을 분담하려고 하기 시작하면, R 이외의 다양한 특화 대체 기술을 선택하는 경우가 많은데, 그럼에도 불구하고 R을 버릴수 없는 이유는(앞서 계륵이라고 표현하였다.), R로 만들어진 정교한 모델들이(비록 셈플 데이타만 수행된다 손 치더라도) R이외의 기술들에서는 구현체가 완벽하지 않거나, R에서 쉽게 구현된 모델이 다른 기술에서는 구현이 녹록치 않은 경우가 너무나도 많기 때문이다.

BigData Scale 모델링 Project에서 자주 접하는 시나리오는 아래와 같다.

  1. 순수 모델러들이 R이나 SAS 로 최적화된 알고리즘을 찾아낸다.
  2. 셈플 데이타 혹은 전수로 데이타를 돌려보고, 각종 파라미터나 로직을 거의 완성한다.
  3. But, 모델이 도는데 3박 4일 이상이 걸리거나, 전수 데이타로 돌리는 것 자체가 불가능하다.
  4. BigData 팀으로 Co-Work 요청이 들어온다. 즉, R 모델을 다른 기술을 이용하여 포팅하는 협의가 시작된다.
  5. SparkML 으로 우선 포팅 가능성을 타진한다.
  6. 초대용량의 경우 수십~수백대의 Spark Cluster 위의 SparkML 로도 답이 안나오는 경우가 많은데 이때는 1차로 Mahout 의 구버전으로 Hadoop Map/Reduce  경유 수행이 가능한지 검토한다.
  7. SparkML 이나 Mahout 으로 구현이 쉽지 않은 복잡한 복합 모델의 경우는 제삼의 기술을 검토한다. Weka, PredictionIO, H2O 등등... 하지만 이 프레임워크들은 좀 난잡해서 별로 선호하진 않는다. 오히려 아래 방식을 좀더 먼저 검토한다.
  8. Spark, Mahout 계열에 없거나, Method 가 빈약한 경우 Python을 뒤져본다. SparkML 은 기본 메소드는 있는데, 고급 옵션들이 아예 구현이 안되어 있는 경우가 많다. 예를 들어 Spark ML의 Word2Vec 에는 기본 Method 외에 다양한 고급 활용 메소드들이 거의 존재하지 않아 일일이 구현을 해주어야 하고, FPGrowth 등은 Lift 값 관련 Method가 없어 이를 구할때, 개발자가 수식을 일일이 구현 해줘야 가능하다. 반면에 R이나 Python 들은 논문에 언급된 대부분의 기법들은 거의 구현이 되어 있는 경우가 많다. 이 시점에 R을 보지 않고, Python 을 보는 이유는, SAS 가 그러하듯이 Python 은 메모리에 올려놓고 계산하지 않고, 머신 1대가 오래 걸리더라도 꾸역 꾸역 계산을 하긴 해내기 때문이다.(뒤에 이 부분에 있어서의 R의 역습을 언급하겠다.) 머신 1대가 담기 힘든 용량이면 Hadoop 같은 공유 저장소에 올려 놓고 loop 를 돌리면, 어쨋든 무한 루프를 돌면서도 뻗지 않고 돌아는 간다.
  9. 8의 기술이 죽지는 않지만, 1대라 너무 너무 오래걸릴때는 GPU 카드를 꺼내 든다. 모든 알고리즘이 GPU 버전이 존재하는 것은 아니지만, 조금 뒤져보면 github 에 다양한 공유 구현체 들이 가끔 큰 희망을 줄때가 많다. C로 최적화된 Gensim 등의 Python 라이브러리는 굳이 GPU까지 동원하지 않더라도, 1대에서 돌려도 Spark 5~7 대의 성능과 맞먹는 경우가 종종 있다. 어쨋든 Python 에는 Spark 에 없는 무수히 많은 알고리즘 중 상당수가 이미 구현된 경우가 왕왕 있다. 그리고 대부분의 알고리즘들이 지원하는 고급 기법들이나 옵션들이 더 풍성하게 구현되어 있다.
  10. Python 이 너무 느릴때도 있다. 병렬 수행이 목마를때도 있다. 이 경우 PySpark 로의 Hybrid 사용 가능성을 타진한다.
  11. PySpark 로도 답이 없는 경우는 TensorFlow 카드를 꺼내 든다. Word2Vec 도 그렇지만, TensorFlow 에는 Deep Learning 류의 거의 대부분과, 상당수의 Machine Learning  알고리즘들이 기본 지원되거나, github 구현체가 이미 존재하는 경우가 왕왕 있다. (deeplearning4j 나 theano, caffe, cntk 등 다른 대안도 존재한다.)
  12. 이도 없을 때는 제일 마지막 방법으로 구글링 후 해당 알고리즘의 구현체, 그게 c가 되었건, java 가 되었건을 찾아 내어, scala on Spark, java on Map/Reduce, python on tensorflow 등으로 포팅 가능한지 그 타당성을 타진한다.


위 12번까지 간 적이 몇번 있었다. 몇해전 (지금은 FPGrowth 라는 걸출한 대안이 있지만..) Spark 초기 버전에서 SparkML에 Apriori 가 없어 Java 구현체를 Spark 에서 돌도록 알고리즘을 포팅했던, 별로 유쾌하지 못했던 경험이 있다. (모든 것에 은총알은 없다. SparkML의 FPGrowth 는 Apriori 알고리즘의 훌륭한 대안이지만, 중 규모의 Large 볼륨 데이타에서 빠르고 병렬성을 훌륭하게 지원하지만... Very High 규모의 데이타의 경우에, 그리고, confidence 를 조금 올려놓고 수행하는 경우, 변동성이 큰 데이타의 경우에, disk 를 쓰기 시작 하면서는 무한 loop 틱한 오랜 수행과 리소스 점유로 Production 에 큰 부하를 주는 경우가 왕왕 있다. 이런 Size 의 Data 에는 Hadoop 경유 연산 등 다른 대안을 찾아야 한다.)

이쯤에서 항상 드는 생각이, 거의 모든 알고리즘(Deep Learning 류만 빼고)들이 구현되어 있는 R이 병렬 수행되면 얼마나 좋을까 라는 점이다. (위 Spark ML 의 예에서 처럼 모든 경우의 은총알을 바라는 것은 아니다. 단, R on Spark 와 R on hadoop 으로 나누어져 있다는 것 자체가 좀더 유연할 것이라는 기대를 해본다.)

서두가 좀 길었는데, 아직은 미완의 진행형이긴 하지만, 이러한 측면에서 SparkR 과 MS R(구 Revolution R)의 병렬성 지원을 위한 최근의 행보는 매우 매우 응원을 하는 바이다.

사실 SparkR은 1.X에서는 실무에서 사용하기가 다소 힘든 정도였고, 2.X가 되면서는 다시 실무 활용이 가능한 정도까지 그 가능성이 열리고 있는데, 하지만 여전히 병렬성을 지원하는 알고리즘들이 극히 적다는 단점을 가지고 있다.(Spark 2.X가 되면서 SparkML과의 연동성 지원이 추가되었다.) 이 측면에 있어, MS R은 과거 상용 Revolution R 을 인수한 엔진을 사용하고 있어, 훨씬 다양한 병렬 수행 메커니즘과 훨씬 다양한 병렬 알고리즘 패키지를 이미 지원하고 있으며, 발전 속도도 매우 빨라진 느낌이다.(이 분야의 대부분 솔루션들이 그러하듯이, 아직 완성형은 아니고 진행형이다.)

SparkR 과 MS R이 접근하는 병렬성 메커니즘 접근 방식(SparkR은 Spark엔진 입장에서 R에 접근해가고 있고, MS R은 R입장에서 Hadoop 과 Spark로 다가가고 있다.)이 다소 틀리고 각각의 방식에 장단점이 있는데, 더욱 좋은 점은 둘을 Hybrid 하게 쓰는 것 또한 가능 하다는 점이다.

아래부터는 On Premise Hadoop ( Apache Hadoop 2.7.1 )과 On Premise Spark ( Apache Spark 2.0.2 )위에서 설치 구동 테스트한 설치 세팅 스크립트 이다. 설치 가이드는 MSDN문서를 참고하였으나, MSDN 을 그데로 따라 설치하면 많은 난관에 봉착하게 된다. 아래는 그 부분들의 해결책 까지를 포함하고 있다.

  1. Download
    1. Spark Cluster 를 이용하여 ScaleR을 돌림에 있어, Linux 버전 Install을 해야 하는지, Hadoop 버전 인스톨을 해야 하는지 좀 햇갈렸는데… Manual 을 잘 보다 보면, for Hadoop 을 설치해야 함을 알 수 있다. 즉 위에서 2번째 버전을 다운받아야 한다.
  2. 설치 참고 메뉴얼
    1. Linux 버전과 Hadoop 버전 설치 가이드는 아래 링크에 나와 있다.
      1. R Server Installation for Linux Systems
        1. https://msdn.microsoft.com/en-us/microsoft-r/rserver-install-linux-server
      2. Hadoop installation and configuration for Microsoft R Server
        1. https://msdn.microsoft.com/en-us/microsoft-r/rserver-install-hadoop
    2. Spark 위에서 구동하기 위한 Getting Started 문서는 아래 문서를 참고하면 된다.
      1. https://msdn.microsoft.com/en-us/microsoft-r/scaler-spark-getting-started
      2. 처음 설치하는 경우라면, scaler spark getting started 를 따라하기 전, Linux 버전이 아닌 Hadoop 버전의 MS R 이 기 설치 되어 있어야 한다.
  3. MS R on Spark 설치(본 설치에서 사용한 버전은  MS R Server for hadoop 9.0.1 임.)

  1.   MS R on Hadoop Package 다운로드 후 압축 풀기

 2.     Root 권한으로 install 스크립트 수행해야 함.

  3.     설치는 install.sh -p -p 옵션을 주고 실행 함.
A.      첫번째 에러 만남.

에러 log 에서 크게 단서를 찾을 수는 없었지만, MS R for Hadoop 인 관계로, Hadoop 관련 설치 설정 과정 중의 에러라고 여겨져, 설치하는 계정에 Hadoop Path 추가.
이후 수행하니 위 에러 없이 정상 Install 되었음.

  4.     모든 Hadoop 노드에 다 설치. (설치 과정은 위와 동일. dsh, pdsh, PyDSH, fabric등으로 이를 병렬 수행 할 수도 있기는 함.)
  5.     설치 이후 확인

  6. Hadoop 폴더 생성 및 퍼미션
A.     한쪽 노드에서만 수행. Hadoop 은 공유 되어 있으므로.

  7.     Node에 로컬 공유 폴더 생성
A.     전체 Node 에서 수행.

  8.     아래 경로의 파일을 Hadoop 에 업로드 하여, Test Code 수행 준비.
     A.     아래 경로는 설치 하고 나면, 자동 생성.
                         i.         /usr/lib64/microsoft-r/3.3/lib64/R/library/RevoScaleR/SampleData/AirlineDemoSmallSplit
                        ii.         But, MSDN의 설치 매뉴얼의 주소와 좀 다른 위치에 있어 주의 요망9.0.1 MS R for Hadoop 에서는 위 파일 형태로 Air Polution 셈플 데이터가 존재.
B.      하둡에 업로드할 임시 폴더 생성.
                         i.         hadoop fs -mkdir /tmp/msRsamples/
                        ii.         셈플 파일이 있는 로컬 경로로 이동하여, 해당 셈플 파일을 Hadoop 에 업로드.
                       iii.         hadoop fs -copyFromLocal *.csv /tmp/msRsamples/
C.      로컬의 동일 경로에도 해당 파일 복사 생성.
                         i.         뒤에가서 Hadoop 과 로컬의 비교를 해보기 위함 임.
                        ii.         mkdir /tmp/msRsamples/
cp /usr/lib64/microsoft-r/3.3/lib64/R/library/RevoScaleR/SampleData/AirlineDemoSmallSplit/*.csv /tmp/msRsamples/
  9.     Revo64 구동
A.     cd MRS90Hadoop
B.      Revo64
  10.  셈플 코드 수행 준비

  11.  Hadoop 경로 핸들링
A.     앞에서 생성한 경로 hadoop fs -ls 조회 잘 수행 됨.

  12.  셈플 코드 수행(For Local)
A.     input <- file.path("/tmp/msRsamples/AirlineDemoSmallPart1.csv")
B.      colInfo <- list(DayOfWeek = list(type = "factor", levels = c("Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday", "Sunday")))
C.      airDS <- RxTextData(file = input, missingValueString = "M", colInfo  = colInfo, fileSystem = RxHdfsFileSystem())
D.     adsSummary <- rxSummary(~ArrDelay+CRSDepTime+DayOfWeek, data = airDS)
E.      adsSummary


  13.  셈플 코드 수행(For Hadoop)
A.     rxSetComputeContext(RxHadoopMR(consoleOutput=TRUE))

    위와 같은 에러 발생. 

4. 에러 해결

위 내용 중 libhdfs.so 에 문제가 있는 듯 하여 아래처럼 ldd 로 로컬 로딩 분석해 보았음.
ldd 로 보면 좀 이해가 가지 않는 부분이 있음. , 모듈이 모두 정상 로딩 된 것으로 보인 다는 점 임.


root su 한 다음 root 권한으로도 수행해 보았음.


위 처럼 이제는 좀전의 에러가 보이지 않음. 대신 Hadoop 에서는 root 의 권한설정이 안되어 있어 이번에는 Hadoop 에서의 에러 메시지가 발생하였음.
다시 밖으로 나가서 root 와 사용자 user 계정 모두 Hadoop local User 에 대하여 공동의 SuperGrop 그룹에 속하도록 퍼미션 권한을 모두 맞추어 주고 재 시도 해 보았음.

앞선 에러 로그의 문제는 해결되었음. 하지만, 이번엔 또 아래 같은 에러 발생.



앞선 문제는 해결되는데… tmp/ 폴더가 또 문제.. (기존에 쓰던 Map/Reduce Job의 사용자와 다른 새로운 사용자로 R 을 병렬 수행하면서 새롭게 권한 문제 발생) 
hadoop fs -chmod -R 1777 /tmp tmp 폴더 권한 문제 해결. 하지만 여전히 libjvm.so 를 인식하지 못하는 문제가 계속되고 있음. 다시 ldd 를 해보아도 로딩 잘 되고 있고...

그렇다면 드는 생각. 현재 수행중인 노드는 ldd 로딩이 잘 되는데, 다른 cluster node 는 안되는게 아닐까? 답은 Yes.

최초 local 수행했던 MS R Master 노드에는 libjvm.so 가 심볼릭 링크 존재함. 그런데, 나머지, 인스톨만 했고, local 수행을 한번도 한적 없는 모든 노드는 libjvm.so 심볼릭 링크가 저 위치(/usr/lib64/microsoft-r/3.3/hadoop/)에 존재하지 않음 그래서 아래처럼 모든 노드에 수동 심볼링 링크 추가해줌. (이것 때문에 삽질 엄청 했음. 아마도 각 로컬에서 local mode를 한번이라도 수행해주면 최초 한번 자동으로 설정 될 것 같긴 함. 하지만, 수십대 수백대가 존재하는 Yarn Cluster 환경에서는 모든 노드에서 Local 모드 수행을 일일이 해주기 힘듦므로 아래 처럼 심볼릭 링크 수행을 distributed Shell 로 수행하는 것이 유리.)

cd /usr/lib64/microsoft-r/3.3/hadoop
su
ln -s /data01/java/jdk/jre/lib/amd64/server/libjvm.so

위 경로는 본인 JAVA_HOMEjdk 위치를 따라야 함. (이를 감지하는 코드가 /usr/lib64/microsoft-r/3.3/Hadoop 경로 안의 getHadoopEnvVars.py 인 것으로 사료 됨.)


위처럼 해주자 모든 문제가 해결되었고, 결과가 아래처럼 Hadoop 버전에서도 동일하게 나왔음.


아래는 Spark 를 통한 수행.(Spark Mode 수행 전 Spark 는 Hadoop 과 연동되어 잘 설정되어 있어야 한다.) Hadoop 을 통한 수행보다 약 4~5배 더 빠름 ^^. 유레카~~~~





5. 결론

우여곡절이 좀 있었지만, 일단, Hadoop Cluster + Spark Cluster 에 MS R 을 전체 노드에 설치하고, Local 수행, on Hadoop 수행, on Spark 수행이 정상적으로 잘 이루어짐을 확인하였다. 대용량 Data Handling 및 병렬 알고리즘 수행 에 대한 위 세가지 Mode 에서의 성능 수치 및 Spark R 과의 deep dive 비교는 다음번에 별도 블로그로 언급해 보도록 하겠다.

당연하겠지만, MS R on Hadoop 보다 MS R on Spark 가 더 수행속도가 빠르다. 그리고, 메모리에 순식간에 로딩되는 작은양의 Sample Data 는 Local 1대 수행이 가장 빠른것도 사실이다. Spark 수행은 그래서 대용량 처리에 있어, 약간 중간계 같은 느낌이다.

속도가 아닌 용량의 측면에서 보자면, local 보다는 spark memory cluster 가, 그리고 spark memory cluster 보다는 hadoop distributed File System cluster 가 훨씬 강력한 것이 사실이기 때문이다.

MS R 은 그 전신인 Revolution R 을 MS가 인수하여, 일부는 Open Community 버전으로 Free 버전으로 오픈되어, 다중 쓰레드, 다중 CPU, disk 기반 iteration 등 기존 Open R의 단점을 많이 보완한 새로운 feature 를 기본 포함하고 있다. 오늘 실험했던 Hadoop 위에서의 병렬 구동, Spark 위에서의 병렬 구동은 MSDN 라이센스가 필요하지만, Azure 위에서 종량제 HDInsight Hadoop + Spark 클러스터를 구동하면, 누구나 몇분만에 클라우드 상에서 유연하게 Node 갯수를 조정해 가며 사용 가능하여, 그다지 먼나라 기술도 아니라 할 수 있다.

모델러가 R 로 넘긴 소스를 BigData scale 로 포팅함에 있어, R 코드를 최대한 재 사용하면서 scale out 을 할 수 있다는 것 자체만으로도, 오늘 실험한 구성은 그 가능성이 무궁무진 하다 하겠다. R의 시각화 기능에 있어서의 막강함은 BigData 개발자들에게 선물같은 기능이 아닐 수 없다.

Spark 는 제트기 같은 민첩함을 제공하지만, 종합운동장 보다 큰 활주로가 있어야 한다. Hadoop 은 듬직하지만, 항공모함 역할 이상을 하긴 힘들었다. Hadoop 위에 Spark 는 항공모함 위에 제트기 처럼, 그 둘의 시너지로 막강한 화력을 제공해주는 것을 우리는 이미 경험한 바 있다. 우리는 가끔 육지에서 조용하게 정교한 작전을 수행하고 돌아오기 위해 Python 이라는 Hummer 고성능 군용 전처후 차량이 필요할 때가 있었다. 스파크보다 빠르지 않아도 된다. 대용량이 좀 힘들어도 상관 없다. 정교한 육지 수색을 할때 제트기 보다는 특공대를 태운 Hummer 차량이 더욱 믿음직한 것 처럼 그 자체로서 역할이 충분히 독보적이었다. 오늘 접한 분산 R 은 그런 측면에서 화력에 비유하자면, Apache 헬기 같은 존재라 할 수 있다. 제트기(Spark) 보다 빠르지 않아도 된다. 할주로가 없는 구석 구석 까지 수색을 하기 위해서 우리는 특공대를 태운 Hummer 차량밖에 대안이 없었으나, 이제는 Apache 헬기를 타고 한번에 더 빠르게 날라갈 수 있으며 그들을 지원사격해줄 수도 있다.

Local Area 에 있어서는, 람보 1인 이면, 모든게 해결 되기도 했었다. 홀로(1대로) 외롭게 싸우던 람보(R)를 Apache 헬기에 태워 여기저기 데리고 다닐 수 있다면...?! 여러곳에 독자적으로 나누어져 있던 람보를 수송헬기에 태워 때(때거지로, 즉, 대용량으로)로 다니게 할 수 있다면...?! 하는 즐거운 상상을 해본다... 람보에 날개 달기(분산 R) 프로젝트는 아직 진행형 이지만, 그 가능성이 심상치만은 않은 이유라 하겠다.


    

2016년 9월 27일 화요일

Python Anaconda & GPU - 세팅 및 성능 비교

요즘 Python 의 행보가 매우 무섭다. 

특히 Machine Learning 쪽에서 다양한 오픈 모듈이 나오면서 힘을 받기 시작했고,  Deep Learning 쪽에서는 TensorFlow 등의 걸출한 프레임워크가 그 행보에 힘을 더해 준 느낌이다. 최근 화두가 된,  microservice 또한 Python 계열에 장점이 많은 분야 중 하나이다. 


  1. 아나콘다 Accelerate 모듈 업데이트
    1. conda update conda
    2. conda install accelerate
    3. conda install numbapro
  2. NVIDIA 드라이버 다운로드
    1. 아래처럼 NVIDIA 홈페이지에서 전용 driver 다운로드.
    2. 먼저 Tesla ... 이름에서 부터 존재감이..ㅋㅋ
    3. 다음은 Quadro ... 드라이버. 존재감이 살짝 떨어짐 TT
    4. 드라이버를 각각 서버에 업로드
    5. 위처럼 기존에 있던 Nouveau 때문에 에러 남. Nouveau 를 disable 시켜야 함.
    6. 친절하게도 disable script 도 만들어 준다.
    7. 기타, 지금까지의 로그는 저 위치에 기록되어 있는 듯... 친절하기도 해라...
    8. 위 수행하고 나면 Tesla 장비는 정상 수행되나, Quadro 장비는 nouveau 가 계속 떠 있어서 충돌 남.
    9. 메뉴얼에 하라는거 다해도 계속 좀비처럼 살아남...
      1. 에이... 강제로 모듈 제거.
      2. rmmod nouveau
      3. 다시 설치... OK 설치 됨.
    10. 설치 후 메시지
  3. CUDA 툴킷으로 GPU Check
    1. 먼저 Tesla M40 장비
    2. 정상 설정 되었음.
    3. 다음은 Quadro K4200 장비
    4. 야도 정상 설정 되었음.
  4. CPU 와 GPU 성능 비교를 위해 사용된 코드
    1. CPU  버전 성능 체크를 위해 사용한 코드
    2. GPU 버전 성능 체크를 위해 사용한 코드
  5. Python Code 로 두 장비에서 CPU vs GPU 성능 비교.
    1. Tesla 장비
      1. CPU 버전 코드 3번 수행 결과
      2. GPU 버전 코드 3번 수행 결과
    2. Quadro 장비
      1.  CPU 버전 코드 3번 수행 결과
      2. GPU 버전 코드 3번 수행 결과
    3. 성능 비교상 기존에 보유하고 있던 1500만원 상당의 Legacy X86 표준 장비와도 성능 비교 해 봄.
      1. GPU는 Support 하지 않으므로 CPU 만 수행하였음.
  6. 종합 결과 (일단, 가격 요소를 제외하고, 성능 부분만 정리하였음.  ps.  Legacy 장비대비 GPU 2개씩 꼳힌 장비들이 약 3배 비쌈.)
이상.

위처럼 GPU 가 CPU 에 비하여 월등한 컴퓨팅 파워들 보여주고 있다. 

ps. 물론 실제 Production 환경에서 저정도 차이가 나거나 하지는 않는데, 모든 연산위 위에서 실험한 GPU 지원 백터 연산만 있는 것은 아니기 때문이다.