2017년 8월 5일 토요일

GCP, AZURE, AWS 그리고 BigQuery, Azure ML Studio, Data Lake 에 대한 단상

커뮤니에서 한분이 GCP 그리고 BigQuery 에 대하여 타 시스템과의 비교를 요청하셔서 장문의 답변을 하게 되었다. 해당 내용을 이곳에 옮겨 적어 보았다.

우선, 서두는 내가 시작하였다. 대략 이런 내용이었다.

3년 전 post. 당시 우리는 MapReduce기술을 버리고 당시 뜨던 기술인 Cascalog를 도입 및 전환 완료 했던 시점이었다. 이후 Scala,Spark로 옮겨가는데에도 그리 오랜 시간이 걸리진 않았다. 지금은, Scalding이나 Cascalog는 옛기술이되었고, MapReduce는 역사를 논할때나 등장한다. Spark이 세력을 확장하고, 다양한 layer의 기저 인프라역할을 하며, 존재감을 유지하고 있는 가운데, 최상위 application layer의 data science 도구들은 sas 분파를 r 분파가 밀어네고, anaconda, keras등 python 계열들이 크게 세력을 확장하였으며, tensorflow, theano, caffe, cntk, maxnet 등 중간계에 deep learning 류 분파가 끼어들면서, 이 바닥은 좀더 wide 경쟁체계에서 좀더 깊고 좀더 특화된 deep stack 체제로 전환되었다. 그로부터 language 또한 훨씬 다양해졌다. 그러던 와중 intel, yahoo 등에 의해 spark 및 cpu 진영에서의 분산 및 대용량 특화 deep learning approach가 다시 세력을 키우기 시작했으니.... 이 모든게 최근 3년 사이 있었던 일이다... 마치 미드 왕좌의 게임을 보듯 흥미진진한 이 바닥 기술 Stack 들의 흥망성쇠 이야기들 이었다.


이후 여러 말들이 오가던 중 질문...

Question ) 전문가께 GCP, 빅쿼리에 대한 간단한 인상? 감상을 여쭤도 될까요? 자투리 시간에 공부해볼까 하는 중입니다.


그리고, 답변이다. 너무 장문이었나??? 여튼 아까워서 이곳에 옮겨 적었음.

Answer )

요즘 IaaS 는 AWS나 Azure 나 비슷비슷하죠. 가격도 거의 판박이구요. 단, AWS 가 커뮤니티나 3rd Party 쪽 Pre Built 이미지가 많아서, IaaS 에서는 좀 앞서는거 같구요. GCP는 셋중에 좀 밀리구요. PaaS 로 넘어가면, Azure 가 AWS 보다 종류도 많고, 완성도도 좀더 높은게 확실히 느껴지구요. GCP 의 경우는 Serverless 아키텍처에서 카날리 배포 하는 부분이랄지, Big Query 부분 등이 확실히 차별 point가 있는거 같아요. 무엇보다 Tensorflow 를 리딩하는 곳 답게, Deep Learning 에 있어, TPU 라던지.... Tensorflow Serving Layer 를 위한 PaaS 부분이 AWS 나 Azure 와는 확실히 다른 장점을 보유하고 있습니다. Big Query 는 대용량 데이타에 대하여 확실히 속도도 빠르고, 다양한 쿼리나 연산도 지원하여, 사내 BigData 업무에 있어서 확실히 큰 역할을 해낼 수 있습니다. 단, POC나 Toy Project, 혹은 Hands on Lab 수준의 요건이 아닌 실제 BigData Scale Business 요건에서 만나는 복잡다난한 요건에 대하여는 그런류의 Query Platform 은 한계가 있는 경우가 많아서, 대체 시스템 이라기 보다는 One of Them 보완 시스템으로 positioning 하고 접근 하셔야 합니다. NoSQL에 은총알이 없는 것과 비슷한거죠. BigQuery 도 BigQuery 가 지원하지 않는 기능에 대한 보완을 위해 UDF 를 지원하지만,(Hive 도 UDF를 지원하죠..) Hive 가 그러하듯이, Hive 만 가지고, 모든 요건을 해결할 순 없으니까요. 100배 빠른 Hive 가 있다 할지라두요. 가끔 Numpy 가 필요할때도 있죠. Konlpy 가 필요할때도 있구요. R에만 구현되어 있는 어떤 알고리즘이 필요할 때도 있습니다. 그런데, single machine R로는 로딩도 안되는게 문제죠. 복잡한 실무 Real Wordl Business Logic 을 Query 로만 구현할려고 하면, 병렬시스템 최적화 Plan 짜기가 너무 복잡 할때는 Scala 같은 Function Langauage 로 일일이 Parallel 구현 Step 을 구현 해주고 싶을 때가 있습니다. (실무에서는 Dw로직을 BigData 로 옮길때, A4용지 4~5장짜리 한방 쿼리들도 많이 접합니다. 그걸 옮길때는 Query 보다 Code 가 훨씬 편합니다. 대게의 경우 그런 Mart 성 R-Olap Query를 그대로 이관하면, NoSQL 이나 Cloud DW 에서는 대부분 돌지 않거나, 매우 느려집니다.) 
또한, Java 로도 Hive 로도 Spark SQL 이나 Spark ML 로도 안되는 그러한 요건들은 Python 이나 R로 하는게 절대적일때가 있는데, 대용량이 안되면, Spark 위에 PySpark 로 Model Parallelism 이 안되면, Data Parallelism 이라도 꽤하는게 크게 도움이 될때가 있습니다. SparkR 보단 MS R on Spark 나 Spakly R로 도움을 받을 수도 있구요. 요즘은 Tensorflow 나 Keras 도 Spark 위에서 Data Parallelism 이 가능하죠. BigDL 을 쓰면 Deep Learning 에 대하여 Model Parallelism 도 되구요. 여튼 BigQuery 는 훌륭한 General 도구인 것은 맞구요. 역시 은총알은 아니다 정도만 주지하시면 될 듯 해요. 이바닥이 Wide 하게 춘추전국이 아니라, 어느정도 교통정리가 되어가는 대신, 각 분야에 Specialty 를 극대화 하는 쪽으로 치닫고 있어서, Stack 이 매우 깊어졌습니다. 그리고, 실무에서 대용량의 요건을 가지고 Machine Learning 이나 Deep Learning 을 할라손 치면, 단순한 전처리만 하더라도 Anaconda + Python 단일 머신으로는 택도없는 경우가 허다하구요. 이를 위해서는 또다른 도구도 각 Stack 에 한두개 정도씩은 익힐 필요가 있습니다. 실무에서 Deep Learning 프로젝트를 하다 보니, 느낀 점은.... 우리가 Lab 에서 논문쓰고 있는게 아니기 때문에, Deep Learning 자체는 알려진 State of Art 접근 방식 및 해당 알고리즘의 가장 잘 알려진 github 구현체를 가져다 쓰면 되기 때문에, 큰 진입 장벽이 아니었다는 거구요. 오히려 진입 장벽은 A 부터 Z 까지..그리고 AI 의 Serving Layer 까지 그 전체를 아우르는 큰 시스템이 하나로 잘 엮이게 묶는 것이었습니다. 거의 Engineering Art 에 가깝구요... Model 하이퍼 파라미터 튜닝하는것보다, 그 모델을 다수의 동접의 사용자들에게 에러없이 동접을 버티며 Serving 하고, 그 반응이 다시 모델에 input 으로 들어가며, 운영 중 무중지로 rolling upgrade 시키는 걸 잘 구성하는게 5배 쯤 더 손이 많이가고 훨씬 고 난이도 테크닉을 필요로 했다 입니다. 그러던 와중에 대용량 데이타 전처리 부에 있어서는 BigQuery 가 일부에 있어서 큰 역할을 할 수 있습니다. Data Pipe Line 에서 물리적 셔플이 많이 일어나면 안되기 때문에, IaaS 나 PaaS 는 그런 도구들과 맞물려 통일화 고려도 필요하구요. BigData Scale 전처리 요건에 R 이나 Python 등을 섞어 쓰고 싶을때는 클라우드 상에서라면, BigQuery 보다는 Azure ML Studio 나 Data Lake 가 적당할 수도 있습니다. On Premise 라면 Spark 위에서의 Collaboration 을 구성하면 되구요.
또한, Java 로도 Hive 로도 Spark SQL 이나 Spark ML 로도 안되는 그러한 요건들은 Python 이나 R로 하는게 절대적일때가 있는데, 대용량이 안되면, Spark 위에 PySpark 로 Model Parallelism 이 안되면, Data Parallelism 이라도 꽤하는게 크게 도움이 될때가 있습니다. SparkR 보단 MS R on Spark 나 Spakly R로 도움을 받을 수도 있구요. 요즘은 Tensorflow 나 Keras 도 Spark 위에서 Data Parallelism 이 가능하죠. BigDL 을 쓰면 Deep Learning 에 대하여 Model Parallelism 도 되구요. 여튼 BigQuery 는 훌륭한 General 도구인 것은 맞구요. 역시 은총알은 아니다 정도만 주지하시면 될 듯 해요. 이바닥이 Wide 하게 춘추전국이 아니라, 어느정도 교통정리가 되어가는 대신, 각 분야에 Specialty 를 극대화 하는 쪽으로 치닫고 있어서, Stack 이 매우 깊어졌습니다. 그리고, 실무에서 대용량의 요건을 가지고 Machine Learning 이나 Deep Learning 을 할라손 치면, 단순한 전처리만 하더라도 Anaconda + Python 단일 머신으로는 택도없는 경우가 허다하구요. 이를 위해서는 또다른 도구도 각 Stack 에 한두개 정도씩은 익힐 필요가 있습니다. 실무에서 Deep Learning 프로젝트를 하다 보니, 느낀 점은.... 우리가 Lab 에서 논문쓰고 있는게 아니기 때문에, Deep Learning 자체는 알려진 State of Art 접근 방식 및 해당 알고리즘의 가장 잘 알려진 github 구현체를 가져다 쓰면 되기 때문에, 큰 진입 장벽이 아니었다는 거구요. 오히려 진입 장벽은 A 부터 Z 까지..그리고 AI 의 Serving Layer 까지 그 전체를 아우르는 큰 시스템이 하나로 잘 엮이게 묶는 것이었습니다. 거의 Engineering Art 에 가깝구요... Model 하이퍼 파라미터 튜닝하는것보다, 그 모델을 다수의 동접의 사용자들에게 에러없이 동접을 버티며 Serving 하고, 그 반응이 다시 모델에 input 으로 들어가며, 운영 중 무중지로 rolling upgrade 시키는 걸 잘 구성하는게 5배 쯤 더 손이 많이가고 훨씬 고 난이도 테크닉을 필요로 했다 입니다. 그러던 와중에 대용량 데이타 전처리 부에 있어서는 BigQuery 가 일부에 있어서 큰 역할을 할 수 있습니다. Data Pipe Line 에서 물리적 셔플이 많이 일어나면 안되기 때문에, IaaS 나 PaaS 는 그런 도구들과 맞물려 통일화 고려도 필요하구요. BigData Scale 전처리 요건에 R 이나 Python 등을 섞어 쓰고 싶을때는 클라우드 상에서라면, BigQuery 보다는 Azure ML Studio 나 Data Lake 가 적당할 수도 있습니다. On Premise 라면 Spark 위에서의 Collaboration 을 구성하면 되구요.


참고로 Azure 상의 Data Lake 는 기저에 Hadoop 과 Spark 이 있다. 그래서 BigQuery  보다 느릴 순 있으나, Spark이 가지고 있는 확장성을 꽤할 수 있다. 바로 python, java, scala, R, 그리고 Hive SQL  을 쓸 수 있을 뿐 아니라, Spark Cluster  위에 약간의 부가 세팅을 하면, Deep Learning 에 있어, BigDL(made by Intel)로 Model Parallelism 을 꽤할 수 있고, tensorflow on spark(made by Yahoo) 혹은 keras + tensorflow + spark 로 Parallel 하이퍼파라미터 옵티마이제이션 및 앙상블 등을 꽤할 수 있다.

아래는 HDInsight 위에서 BigDL 을 쉽게 설치하는 가이드 문서 이다.

https://software.intel.com/en-us/articles/deploying-bigdl-on-azure-data-science-vm






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 하여 슬라이드로 만들어 보았다.