tag:blogger.com,1999:blog-81666861406764604302024-03-14T11:27:04.149+09:00HoonDongKim's BigData & AIHadoop, Spark, NoSQL, Machine Learning , Deep Learning ....HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.comBlogger59125tag:blogger.com,1999:blog-8166686140676460430.post-82986692475285799862020-07-02T07:01:00.000+09:002020-07-02T07:10:21.171+09:00Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps Cycle벌써 7개월 전 이군요.<br />
지난 겨울 Tenosrflow-KR Offline 세미나에서 발표했던 내용을 슬라이드쉐어 에 공유 합니다.<br />
<br />
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 방법론 및 AI DevOps Cycle에 대하여 경험을 공유 했던 자료 입니다.<br />
<br />
uvicorn + gunicorn + FastAPI + Tensorflow 의 구성으로, 저렴한 Auto Scale Out CPU Docker Serving 환경을 구성하고, 1만 TPS (초당 1만 Transaction Inference Serving by 10 CPU Docker) 까지, 500ms 이내 에러없이 inference 하는 AI Serving 환경을 구성하는 내용을 포함하고 있습니다. (해당 내용은 Azure App Service for linux Docker 환경에서 4 v-CPU 표준 Ubuntu 이미지 Docker 로 실험되었습니다.)<br />
<br />
기타, 이를 Production 운영하고 관리하기 위한 DevOps 구축 사례를 공유 하였습니다.( DevOps 부분은 같은 팀의 Patrick(박찬엽님)께서 정리를 해주셨습니다. )<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/EwE0fNFo3j2E67" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/ssusere94328/auto-scalable-deep-learning-production-ai-serving-infra-ai-devops-cycle" target="_blank" title="Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps Cycle">Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps Cycle</a> </strong> from <strong><a href="https://www.slideshare.net/ssusere94328" target="_blank">hoondong kim</a></strong> </div>
<br />
ps. (그로부터 7개월 후)<br />
<br />
7개월이 지난 지금, 이 모든 것 또한, 많이 바뀌어 있네요. 새로운 2020년 버전의 New 경험에 대하여는 전혀 새로운 서술을 해 나아가야 할 듯 합니다. 작년에 경험한 것의 몇배 더 큰 경험을 해 나아가고 있습니다.<br />
<br />
DevOps 및 MLOps 를 포함한 Production AI 를 Cloud 위에서, 특히 Kubernetes 환경하에서, 서비스하고 운영하는 데에는 기술도 중요하지만, 그에 걸맞는 DevOps/MLOps 문화와 개발조직의 성숙하고 합일된 서비스/개발 철학이 매우 중요하다는 것을 새삼 경험하고 있습니다.<br />
<br />
이를 서비스 하기 위한, 극 난이도의 기술들은, 그 기술을 받아들이고 서비스 운영하기 위한, 프로세스와 성숙한 개발 문화가 조직에 보급되어 있지 않으면, 심한 내상으로 되돌아 올 수 있습니다. (기존 전통적인 Water Fall 의 실패 케이스 보다, 더 크게 실패할 수 있습니다.)<br />
<br />
반대로, 이를 받아 들이기 위한 난이도 높은 경험을 견디고, 인고의 서비스 정착 경험을 견뎌 낸 경우, 그 기술적인 성숙 외에도, 개발 문화적인 성숙을 통해 얻어지는 잠재력은 훨씬 크지 않나 여겨집니다.<br />
<br />
에니메이션 나루토가 막강한 9미의 힘을 내 뿜을때가 이와 유사한 순간인 듯 합니다.<br />
자칫 폭주할 수 있고, 기술에 매몰될 수도 있습니다. 기술이 서비스로 안정적으로 표출되는 순간은 그 크고 파워풀한 힘과 가능성을 받아들일 성숙한 개발 문화와 프로세스가 정착 된 이후 비로서 가능합니다. 그 순간, 비로서 정상적으로 힘의 통제 및 운영이 가능해 집니다.<br />
<br />
그 큰 힘의 가능성을 받아들일 준비가 된 개발조직은 나루토가 9미의 힘을 통제 할 수 있게 된 시점 처럼, 무한의 가능성을 갖은 시점으로 비로서 완성될 것 입니다. 그렇게 오픈 된 서비스는, 시작이 미약할 지라도, 유연하게, Continuous 하게 개선하고(DevOps), 실험하고(AB Test), 적용하며(CI/CD), 결국, 시장에서 차별화 된 서비스로 빛을 발할 것 입니다.<br />
<br />
인고의 시간을 겪으며 조직이 성숙되고 있는 것이 느껴져서, 저희의 조직이 많이 자랑스러워 지기 시작했습니다. 많이 움츠리고, 많이 고생했던 만큼, 그 내공을 발판 삼아 빠르게 도약할 준비를 얼른 마무리 해야 되겠습니다.<br />
<br />
<img alt="나루토 질풍 전 - 우즈 마키 나루토, 쿠라마의 HD 벽지 다운로드" height="400" src="https://a-static.besthdwallpaper.com/naruto-jilpung-jeon-ujeu-maki-naruto-kurama-byeogji-2560x1600-7981_7.jpg" width="640" /><br />
<br />HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-36488002301248909792019-03-31T23:48:00.001+09:002019-04-02T02:15:14.722+09:00XGBoost 와 Deep Learning Regressor 사용한 Regression 문제에서의 성능지표 정의와 앙상블(ensemble) 방법Python 이나 R에서 앙상블(ensemble)하는 방법을 package에 의존하다가, Deep Learning Model 과의 앙상블을 하려고 하면, 의외로 그 방법을 모르고, 질문을 해오시는 분들이 많았다.<br />
<br />
그래서, <b><u>앙상블 방법을 회귀문제를 예를 들어 설명해 보고자 한다. 또한 회귀문제에 대한 성능지표 재정의 부분도 살펴보도록 하겠다.</u></b><br />
<br />
우선 앙상블은 기법이 많고, 다양한데, 금일 공유하는 방법은 가장 심플하면서도 보편적인 앙상블 방법이라고 할 수 있을 것이다.(Kaggle 등에서도 이 방법이 많이 사용된다.)<br />
<br />
<b><u>1. 우선 Regression 문제의 성능 측정 지표를 재 정의해 보겠다.</u></b><br />
<br />
회귀(Regression) 문제를 위한 성능측정 지표의 Custom 정의라 할 수 있을 것이다. 성능측정 지표 정의는 실무에서 문제 정의 이후 하게 되는 매우 중요한 단계인데, 즉, 어떻게 성능을 측정하고, 어떻게 지표를 가져갈 것인지에 관한 문제이다.<br />
<br />
보통 모델의 성능을 측정하고자 하는 모델러들은 회귀 문제의 경우 MSE(Mean Squre Error)값을 보는 것이 보통이다.<br />
<br />
하지만, 실무에서는 현업분들과 Communication 하는 경우 MSE 값이 얼마에서 얼마로 개선되었어요 라고, 설명하는 경우, 그 모델의 정확도나 개선 정도를 가늠하기가 매우 힘들어, 원활한 소통이 되지 않는 경우가 많다.<br />
<br />
이 경우 개인적으로 많이 사용하는 방법은 회귀문제를 Accuracy 문제로 재정의 하는 방법이다.<br />
물론, Business 의 특성에 맞추어, 이정도면 맞추었다고 할 수 있다 라는 것을 현업분들의 의견을 구하여, 미리 허용 범위를 정해놓고 시작하는 것도 방법일 것이다.<br />
<br />
배송소요시간 예측 문제를 예를 들어 보겠다. 현업과 이야기해 본 결과 0.5일 이내로 예측을 맞춘 경우, 그것은 맞게 예측한 것으로 본다 라고 이야기를 들었다고 가정해 보자. 예를 들어 배송소요 시간이 3.8일인데, 이를 3.1일 이라고 예측하여 반나절 이상 시간 차가 발생한 경우, 이는 잘못 예측했다 라고 판단 할 수 있을 것이다. 반면, 3.8일을 3.6일 이라고 예측하여, 오차범위가 반나절 이하의 시간차만 발생한 경우, 이는 잘 예측했다 라고 판단 가능하다고 가정해 보자.<br />
<br />
이 경우 회귀문제에 해당하는 배송소요시간 예측 문제를 Classification 문제에서 사용하는 Accuracy 문제로 재 정의 가능하다.<br />
<br />
아래는 이를 위한 코드 이다.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-BMSm04I1Bto/XKJAWXwkw-I/AAAAAAAAJjY/We4xX35vqE8TkTBh-vwk270x7VwehmMcQCLcBGAs/s1600/Screen%2BShot%2B2019-04-02%2Bat%2B1.45.53%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="770" data-original-width="1336" height="368" src="https://1.bp.blogspot.com/-BMSm04I1Bto/XKJAWXwkw-I/AAAAAAAAJjY/We4xX35vqE8TkTBh-vwk270x7VwehmMcQCLcBGAs/s640/Screen%2BShot%2B2019-04-02%2Bat%2B1.45.53%2BAM.png" width="640" /></a></div>
Boosting 방식으로 Kaggle 스타일 회귀문제에서 끝판왕 중의 하나인 XGBoost 모델의 정확도를 MSE가 아닌 Accuracy 문제로 재정의 한 코드 이다. 위 처럼 처리하는 경우 정확도를 수치로 뽑아 볼 수 있으며, 위 모델은 0.5일 이내로 예측에 성공할 정확도가 84.04% 라 할 수 있다.<br />
<br />
<b><u>2. 다음으로 두가지 알고리즘을 예를 들고 두 알고리즘을 앙상블 해 보겠다.</u></b><br />
<br />
(1) 위에서도 언급했던 XGBoost 의 0.5일 이내 예측 성공율에 대한 정확도 산정 부분이다.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<a href="https://1.bp.blogspot.com/-BMSm04I1Bto/XKJAWXwkw-I/AAAAAAAAJjY/We4xX35vqE8TkTBh-vwk270x7VwehmMcQCLcBGAs/s1600/Screen%2BShot%2B2019-04-02%2Bat%2B1.45.53%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="770" data-original-width="1336" height="368" src="https://1.bp.blogspot.com/-BMSm04I1Bto/XKJAWXwkw-I/AAAAAAAAJjY/We4xX35vqE8TkTBh-vwk270x7VwehmMcQCLcBGAs/s640/Screen%2BShot%2B2019-04-02%2Bat%2B1.45.53%2BAM.png" width="640" /></a><br />
앞에서도 살펴본 것처럼 <b><u style="background-color: yellow;">XGBoost 예측모델이 0.5일 이내의 오차범위에서 예측 성공한 정확도(성공비율)는 84.04% 였다</u></b>.<br />
<br />
<br />
(2) 다음으로 Deep Learning LSTM Regressor 를 이용한 동일한 Data 에 대한 0.5일 이내 예측 성공률에 대한 정확도 산정 부분이다.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-HN1b0v2zqKE/XKJFaiZBGCI/AAAAAAAAJjw/LeNDQ4RxOM4IExPned4hnrYHfBKQ986DgCLcBGAs/s1600/Screen%2BShot%2B2019-04-02%2Bat%2B2.07.37%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="1600" height="198" src="https://2.bp.blogspot.com/-HN1b0v2zqKE/XKJFaiZBGCI/AAAAAAAAJjw/LeNDQ4RxOM4IExPned4hnrYHfBKQ986DgCLcBGAs/s640/Screen%2BShot%2B2019-04-02%2Bat%2B2.07.37%2BAM.png" width="640" /></a></div>
<br />
<b><u style="background-color: yellow;">Deep Learning LSTM Regressor 는 정확도가 86.94% 였다.</u></b><br />
<br />
Deep Learning 이 XGBoost 보다도 정확도가 높게 나왔다. 이는 항상 이런 양상을 보이지는 않는다. 데이타의 성격에 따라 둘이 역전되기도 하며, 어느 알고리즘이 항상 이긴다고 장담할 수 없다.<br />
<br />
(3) 마지막으로 위 두 알고리즘을 앙상블 해 보겠다.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Rl6mMbMVLfk/XKJGd8JvalI/AAAAAAAAJj4/dpxWKEr1SGUoxF_k8A1-tqPUZ0jFd3B0gCLcBGAs/s1600/Screen%2BShot%2B2019-04-02%2Bat%2B2.12.00%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="688" data-original-width="1600" height="274" src="https://4.bp.blogspot.com/-Rl6mMbMVLfk/XKJGd8JvalI/AAAAAAAAJj4/dpxWKEr1SGUoxF_k8A1-tqPUZ0jFd3B0gCLcBGAs/s640/Screen%2BShot%2B2019-04-02%2Bat%2B2.12.00%2BAM.png" width="640" /></a></div>
<b><u style="background-color: yellow;">앙상블을 하자 정확도가 94.11%로 크게 상승하였다.</u></b><br />
<br />
위에서 처럼 단순하게 두 수치를 산술평균 해 주었다. 허무하게 들리겠지만. 이것도 역시 앙상블이다.<br />
<br />
<b><u>보통 모델이 3개 이상일 때는 산술평균보다 기하평균이나 조화평균을 많이 사용한다.</u></b> 그리고 모델이 위에서 처럼 2개 일 때는 산술평균을 사용해도 무방하다. 모델이 3개 이상일 때 기하평균을 사용하는 이유는 너무 예외적인 소수 모델에 의해 값이 너무 틀어지는 것을 막고, 다수의 모델이 선정한 값이 더 평활하게 값이 유지되도록 하기 위함이다. 보통 그런 것이 더 현실세계의 문제에서 잘 먹히는 것이 사실이다.<br />
<br />
물론 문제의 특성 상 Exact Matching Accuracy 보다 F1 Score 등이 더 의미가 있는 경우가 있을 수 있다. 이 경우는 만장일치일때 좀더 맞다고 선정하는 형태로 앙상블 로직을 재정의 할 수도 있다. 즉, 앙상블 방식 또한 문제에 따라 재정의 혹은 실험을 통한 선별이 가능하다가 정답이라 할 수 있다.<br />
<br />
결론 : 앙상블은 보통 모델이 2개일때는 산술평균, 3개 이상일때 기하평균을 많이 쓰는데, 때에 따라 이를 재정의 하기도 하고, 때에 따라서는 조화 평균을 쓰기도, 때로는 중간값을 쓰기도 하고 때예 따라서는 True False 모델로 바꾸어, 만장일치 여부로 판단하기도 한다. 문제에 가장 최적의 앙상블 방법론을 실험 데이타 셑으로 찾아 가는 것이 정답이라 하겠다. HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-30239100771568395542019-03-31T23:41:00.000+09:002020-07-02T07:39:25.284+09:00추천(Recommendation) 시스템 - 알고리즘 Trend 정리<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; orphans: 2; overflow-wrap: break-word; widows: 2;">
추천 알고리즘의 트랜드를 시계열로 정리해 보았습니다.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
여기에서 언급된 년도는 논문 년도라기 보다는 산업계에서 주로 유행했던 시점에 대한 개인적인 추정치 년도 입니다.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
언급하고 있는 알고리즘 또한 학계에서 유명한 알고리즘 보다는 산업계에서 주로 Production 에서 많이 사용되었던 알고리즘을 나열하고 있습니다. 예를들어, Netflix 는 Competition 에서 우승한 Accuracy 가 높은 복잡한 알고리즘이나, 가장 최신의 학계 SOTA 알고리즘을 사용하는 것이 아닌, 개인화와 최신성, 그리고, 100ms 이하의 빠른 서빙이 가능한, 그로부터 Accuracy 보다는 ABTest 에서 더 효율이 좋은, 기민한 알고리즘을 사용하고 있습니다. 그리고 무엇보다, 그날 그날 시시각각 User 의 미묘한 반응의 변화에 Model 이 즉각적으로 개인화 진화 가능하도록 하는 Realtime Lambda 아키텍처 + 원순환 Continuous 진화 Serving 이 가능한 Simple 한 Model 을 이용하여 추천을 하고 있습니다. ( 2018년 Spark + AI Summit at Sanfrancisco 발표 내용 참고 )</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
본 글에서 소개 드리는 추천 알고리즘은 모든 도메인에 사용 가능한 범용적인 추천 알고리즘은 아닐 수도 있습니다. 하지만, 다양한 추천 알고리즘 접근 방식 및 각각의 장단점을 이해하여, 사고의 넓이를 키우자는 입장에서 전반적인 Trend 를 나열해 보았습니다. 혹시 제가 언급하지 못한 중요 Approach 가 있거나, 제가 잘못 이해하고 있었던 부분이 발견된다면, 언제든 컴멘트 부탁드립니다.</div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<span data-mce-style="color: #003366;" style="color: #003366;">(1) 10년 ~ 15년 전에는 Apriori 알고리즘. 대표적인 연관 상품 추천 알고리즘.</span></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 현재는 현업에서 거의 쓰이고 있지 않지만, Confidence , Support , Coverage , Lift 등의 추천 관련 용어를 이해함에 있어, 교과서적인 지식을 주는 알고리즘.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> <a data-mce-href="https://ratsgo.github.io/machine%20learning/2017/04/08/apriori/" href="https://ratsgo.github.io/machine%20learning/2017/04/08/apriori/" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://ratsgo.github.io/machine%20learning/2017/04/08/apriori/</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(2) 5~10년 전에는 Apriori 다음으로 Collaboration Filtering</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 2010년도 이후, 상당기간 거의 추천의 표준으로 자리 메김.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 손쉬운 구현체 많음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> User Base , Item Base , Contents Base, 혹은 복수개의 결합. etc…</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> T-Store 추천 시스템 관련 이야기가 있는 아래 Blog 추천. 좀 오래된 블로그인데, 그만큼 옛 방식이기 때문 임.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> <a data-mce-href="https://readme.skplanet.com/?p=2509" href="https://readme.skplanet.com/?p=2509" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://readme.skplanet.com/?p=2509</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 아래는 CF on Spark 에 관한 spotify 의 Approach</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> <a data-mce-href="https://www.slideshare.net/MrChrisJohnson/collaborative-filtering-with-spark" href="https://www.slideshare.net/MrChrisJohnson/collaborative-filtering-with-spark" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://www.slideshare.net/MrChrisJohnson/collaborative-filtering-with-spark</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> spotify 는 이후 song2vec 등 다양한 시도로 좀더 진화 함. (item2vec 항목에서 재 언급)</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(3) 4 ~7년 전에는 FPGroth . Apriori 의 BigData 버전</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> Spark ML 라이브러리에 구현되어 있으며, Apriori 와 거의 동일한 Input 과 Output 을 보이지만, 계산 속도 및 BigData Scale 병렬처리에 있어 훨씬 더 효과적인 알고리즘.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 이로부터 Output 이 Apriori 와 거의 동일하지만, 대용량 Data 를 통한 커버리지 개선 및 최신성이 개선 되어 결과론적으로 ABTest Score 를 향상 시키는 것이 가능해짐.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> <a data-mce-href="http://blog.naver.com/PostView.nhn?blogId=sindong14&logNo=220661064114&parentCategoryNo=&categoryNo=48&viewDate=&isShowPopularPosts=true&from=search" href="http://blog.naver.com/PostView.nhn?blogId=sindong14&logNo=220661064114&parentCategoryNo=&categoryNo=48&viewDate=&isShowPopularPosts=true&from=search" style="color: rgb(59, 115, 175) !important; text-decoration: none;">http://blog.naver.com/PostView.nhn?blogId=sindong14&logNo=220661064114&parentCategoryNo=&categoryNo=48&viewDate=&isShowPopularPosts=true&from=search</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(3.5) 4 ~ 5년 전에는 Collaboration Filltering + Deep Learning 혹은 유사 Approach</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 모두의 연구소에서 정리한 버전. 크게 성공한 방식은 별로 없음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> <a data-mce-href="https://www.whydsp.org/291" href="https://www.whydsp.org/291" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://www.whydsp.org/291</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(4) 3~5년 전에는 Matrix Factorization</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> ALS, SGD 가 많이 쓰이며, 모두 Spark ML 에 구현되어 있어, BigData Scale Approach 에서도 많이 사용 되었음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 나온지는 좀더 오래되었지만, Mahout 과 Spark ML 에 구현되면서 BigData 와 결합 가능한 알고리즘으로서 3~5년 전에 더 유행 하였음. (개인적인 경험으로, 정말 Big한 Data 에서는 Spark ML 보다 Mahout Hadoop 버전이 좀더 안정적 이었음.)</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 특히 Netflix 추천 Competition 에서 가장 우수한 알고리즘으로 알려지면서 유명세를 탓던 알고리즘이기도 하다. ( ps. 뒤에 Factorization Machine 이 나오는데, MF에 비하여 좀더 Sparse 한 Matrix 에서 유용하다.)</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> <a data-mce-href="http://sanghyukchun.github.io/73/" href="http://sanghyukchun.github.io/73/" style="color: rgb(59, 115, 175) !important; text-decoration: none;">http://sanghyukchun.github.io/73/</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(5) 2~4년 전에는 Item2Vec + CF</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> Doc2Vec , User2Vec , Item2Vec 등을 CF 에 결합하면, Un Seen Feature 에 대하여 좀더 강건해 짐.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> Doc2Vec 은 상품상세 Text 나 댓글, Search Engine Tag 등을 이용하여 구성 가능. 이후 Doc => Item 으로 치환하고, 카테고리, 제목, 이미지Search Simillarity Score 등을 동원하여, Item2Vec 을 만들어 낼 수 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> Microsoft 사의 Market 상품 추천에 사용된 바 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [Microsoft 논문] <a data-mce-href="https://arxiv.org/vc/arxiv/papers/1603/1603.04259v2.pdf" href="https://arxiv.org/vc/arxiv/papers/1603/1603.04259v2.pdf" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://arxiv.org/vc/arxiv/papers/1603/1603.04259v2.pdf</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> MS의 원 논문에서 파생되어 다양하게 응용되어 사용되고 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [관련 블로그] <a data-mce-href="https://brunch.co.kr/@goodvc78/16" href="https://brunch.co.kr/@goodvc78/16" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://brunch.co.kr/@goodvc78/16</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 예, <span style="font-size: 13.3333px;">item2vec : 아프리카TV에서 Live 방송을 벡터화.</span></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> song2vec : Spotify(음원 스트리밍)에서 플레이리스트로 노래를 벡터화. ( <- 개인적으로 드는 생각. 추천되는 목록에서 사용자가 Skip 또는 Listen 행위를 할 때. Vector 공간에서 방향성을 + 혹은 - 함으로써, 더 원하는 취향의 노래를(실시간으로 지금 딱 이순간에 맞게) 찾아 들어가는 취지에서…. 음원 서비스 추천에 매우 적합할 듯한 느낌. Word2Vec 이 그러하듯이 Song2Vec 또한 수백차원의 방향성 벡터 공간일 수 있으므로...) </div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
( word2vec 이 그러하듯, 복수의 차원에서 공간적으로 +, - 연산을 통해 수백차원의 공간 내부를 특정하여, 해당 위치 근처의 음원들에 대하여, cosign similarity 순 정렬을 빠르게 해 올 수 있음. )</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
(가수와 장르, 남성, 여성, 혼성, 듀오, 년도 등등이 모두 공간 차원 요소일 수 있음.)</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-JX3YL20jXsk/XKIxR2fWyiI/AAAAAAAAJjE/UuajsWcsS189diw5IWzi-sPtFZOMjzCdQCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="602" data-original-width="800" height="480" src="https://2.bp.blogspot.com/-JX3YL20jXsk/XKIxR2fWyiI/AAAAAAAAJjE/UuajsWcsS189diw5IWzi-sPtFZOMjzCdQCLcBGAs/s640/1.png" width="640" /></a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> meta-pro2vec : Criteo(개인화 광고)에서 상품을 벡터화.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(6) 2~3년 전에는 You-tube Recommendation 스타일 Deep Learning Approach</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 사실 딥러닝 보다도 You-tube 는 머문시간으로 Measure 를 바꾼 것 자체가 보다 큰 성공 요인이었음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 딥러닝으로 추천을 바라보는 Bible 격 논문.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [논문] <a data-mce-href="https://static.googleusercontent.com/media/research.google.com/ko/pubs/archive/45530.pdf" href="https://static.googleusercontent.com/media/research.google.com/ko/pubs/archive/45530.pdf" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://static.googleusercontent.com/media/research.google.com/ko//pubs/archive/45530.pdf</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 시간없으신 분들은 이거라도…</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [논문 요약] <a data-mce-href="http://keunwoochoi.blogspot.com/2016/09/deep-neural-networks-for-youtube.html" href="http://keunwoochoi.blogspot.com/2016/09/deep-neural-networks-for-youtube.html" style="color: rgb(59, 115, 175) !important; text-decoration: none;">http://keunwoochoi.blogspot.com/2016/09/deep-neural-networks-for-youtube.html</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [슬라이드 쉐어] <a data-mce-href="https://pt.slideshare.net/lekaha/deep-neural-network-for-youtube-recommendations" href="https://pt.slideshare.net/lekaha/deep-neural-network-for-youtube-recommendations" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://pt.slideshare.net/lekaha/deep-neural-network-for-youtube-recommendations</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 유튜브 알고리즘에 대한 다양한 인문학적 고찰 <a data-mce-href="https://www.bloter.net/archives/301890" href="https://www.bloter.net/archives/301890" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://www.bloter.net/archives/301890</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(7) 1~3년 전부터 Wide & Deep Model</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 구글 Play스토어의 추천에 사용되면서 높은 효율 개선 이력을 보인 알고리즘으로 알려지면서, 유명세를 탔음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 추천이 아닌 예측 문제에서도 유용함. (마치 Factorization Machine 처럼...)</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> Cold Start Problem 에 대하여 좀더 능동적으로 대처하고, Memorization (wide)에 의존성을 덜 받기 위한 Generalized 가 가미된 방식(deep).</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 여기서 시사점. 단건 단건 접근하여 Merged 된 Model 을 Wide Model 이라고 할때, 좀더 Generalized 된 Deep Model 은, User 의 Minimal 한 정보만으로도 다양하게 추천이 되는, 그로부터 Sparse 한 부분까지를 유추해 내는 효과를 주지는 않을 런지… ( 이런 효과는 뒤에서 언급되는 Factorization Machine 에서도 언급 됨.)</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [논문] <a data-mce-href="https://arxiv.org/abs/1606.07792" href="https://arxiv.org/abs/1606.07792" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://arxiv.org/abs/1606.07792</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [조대협님이 정리한 코드가 있는 블로그] <a data-mce-href="https://bcho.tistory.com/tag/wide%20and%20deep%20model" href="https://bcho.tistory.com/tag/wide%20and%20deep%20model" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://bcho.tistory.com/tag/wide%20and%20deep%20model</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(8) 1~2년 전부터 개인화 추천이 뜨면서 다시 각광 받는 Factorization Machine. (논문은 사실 좀 오래 되었음.)</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 특히 Big Sparse Matrix 일때 유리. </div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 특히, (6),(7)의 모델이 Inference 및 Serving 에서 극한의 Engineering 작업을 필요로 하고, BigData Lambda 아키텍처 + Deep Learning Continuous Training 을 통하여 실시간성을 부여하는데 Engineering 복잡도 크게 증가하는 단점을 보여, 단순한 Approach 로 개인화를 구현함에 있어서 상대적으로 Factorization Machine 이 다시금 각광을 받음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 기존 스타일의 추천 Legacy Approach 및 Legacy Search Engine 과 결합하여, 뒷 Layer 로서, 개인화 랭킹을 추가하는 용도로도 많이 쓰임.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 기존 검색엔진의 Output에 Factorization Machine 을 적용하면, 개인화 re-Ranking 을 할 수 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 복수의 모델의 Output 을 Mash-Up 함에 있어, 모델(영역)을 Factorization Machine 과 결합하면, 개인화된 담벼락을 얻을 수 있음. ( amazon 첫페이지나 You-tube 첫페이지 처럼)</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 룰엔진의 결과에 적용 시 Rule Engine + 개인화 Re-Ranking 형태로 손쉽게 개인화 추천 적용 가능.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 모델별 개별 접근의 결과가 개인별로 있는 경우, 특정 이력이 전혀없어 Sparse 한 부분을 Factorization Machine 으로 보완하는 경우, 개별 모델로 부터 General 모델을 파생하는데 도움이 될 수 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> Factorization Machine 은 다양한 구현체가 있음. 특히, AWS 에는 SageMaker 안에 PaaS 위에서 돌아가는 손쉬운 Library 수준의 Service 구현체가 있어( Code Snippet 이라 SaaS 라고 하기에는 무리가 있음) 빠르게 자사의 데이터로 Training 및 Serving 할 수 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 개인적으로 가지고 있는 Jupyter Notebook 소스코드가 있으므로, 필요하신 분은 요청 주세요.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 아래는 정리가 잘 되어있는 Hands On Lab 예제.<br />
-> [HOL] <a data-mce-href="https://cloud.hosting.kr/techblog_180709_movie-recommender-with-factorization-machines/" href="https://cloud.hosting.kr/techblog_180709_movie-recommender-with-factorization-machines/" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://cloud.hosting.kr/techblog_180709_movie-recommender-with-factorization-machines/</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
(8.5) Matrix Factorization 과 Factorization Machine 과의 차이점.</h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> MF와 FM의 차이점을 간단하게 써 놓은 글.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<a data-mce-href="https://stats.stackexchange.com/questions/108901/difference-between-factorization-machines-and-matrix-factorization" href="https://stats.stackexchange.com/questions/108901/difference-between-factorization-machines-and-matrix-factorization" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://stats.stackexchange.com/questions/108901/difference-between-factorization-machines-and-matrix-factorization</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
논문 참고 : <a data-mce-href="https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf" href="https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
Key 내용은 아래와 같다.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
So compared to Matrix Factorization, here are key differences:</div>
<ol style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; margin: 10px 0px 0px; orphans: 2; widows: 2;">
<li>In recommended systems, where Matrix Factorization is generally used, we cannot use side-features. Ex for a movie recommendation system, we cannot use the movie genres, its language etc in Matrix Factorization. The factorization itself has to learn these from the existing interactions. But we can pass this info in Factorization Machines</li>
</ol>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
MF는 유저-상품 데이터만 가지고, 숨겨진 정보들(side-features, latent feature -> 상품카테고리, 검색어, 이전에 본 상품 등등등) 을 표현(학습) 하는 알고리즘이라,<span style="font-size: 13.3333px;">입력 데이터로 유저-상품(클릭 여부) 만 사용 가능. 하지만 FM에서는 이러한 side-feature들을 직접 입력으로 넣어서 학습이 가능하다.</span></div>
<ol style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; margin: 10px 0px 0px; orphans: 2; widows: 2;">
<li>Factorization Machines can also be used for other prediction tasks such as Regression and Binary Classification. This is usually not the case with Matrix Factorization</li>
</ol>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
FM은 MF보다 더 일반적이고 확장된 모델이여서, 추천 뿐만 아니라 회귀나 이진분류 와 같은 다양한 ML에서도 사용 가능하다.(MF는 불가능)</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
Just some extension to Dileep's answer.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
If the only features involved are two categorical variables (e.g. users and items) then FM is equivalent to the matrix factorization model. But FM can be easily applied to more than two and real valued features.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
FM의 가장 큰 장점은 이렇듯 기존 user,item 외에 2개이상의 feature들을 실제로 사용 할 수 있다는 부분.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
(9) 최근. 개인화 추천. ( 2017 re-invent By Amazon )</h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> Amazon 이 사용하였으나, 크게 알려지진 않은 Deep Learning Base 개인화 추천 알고리즘.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 그 이전에 Amazon 도 Factorization Machine 을 썼다는 이야기가 나옴.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 어떻게 추천이 Deep Learning 으로 진화 되었는지 시계열적인 설명을 하고 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 최종 DSSM 버전은 Google 의 You-tube Recommendation 과도 유사. 다양한 Feature 의 Embedding Vector 를 Concat 하여 Neurual Network 에 넣었다는 것이 핵심. 그래서 사실 You-Tube 의 그것보다 그다지 새롭지는 않음.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-e484LjEIOmY/XKIybzl2RiI/AAAAAAAAJjM/I_snmxJL39sZJjmKxSVlkOXiMGKhSchewCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="487" data-original-width="913" height="340" src="https://2.bp.blogspot.com/-e484LjEIOmY/XKIybzl2RiI/AAAAAAAAJjM/I_snmxJL39sZJjmKxSVlkOXiMGKhSchewCLcBGAs/s640/2.png" width="640" /></a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 최종 버전의 소스코드 및 PaaS/SaaS 서비스가 Open 되지는 않았으나, 일부는 github 에 spark + mxnet + gluon 버전의 코드가 부분 공개되어 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [슬라이드쉐어] <a data-mce-href="https://fr.slideshare.net/AmazonWebServices/building-content-recommendation-systems-using-apache-mxnet-and-gluon-mcl402-reinvent-2017" href="https://fr.slideshare.net/AmazonWebServices/building-content-recommendation-systems-using-apache-mxnet-and-gluon-mcl402-reinvent-2017" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://fr.slideshare.net/AmazonWebServices/building-content-recommendation-systems-using-apache-mxnet-and-gluon-mcl402-reinvent-2017</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
(10) 최근. 개인화 추천. Hierarchical RNN ( 2018 re-invent By Amazon )</h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 2018 re-invent 행사에서 Amazon 이 알파버전을 PaaS/SaaS 개인화 추천 서비스로 공개하여, 주목받음. </div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [논문] <a data-mce-href="https://arxiv.org/pdf/1706.04148.pdf" href="https://arxiv.org/pdf/1706.04148.pdf" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://arxiv.org/pdf/1706.04148.pdf</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 아직 알파버전이라 당장 사용해볼 수는 없으나, github 에 위 논문 저자가 올린 공개 버전 코드가 있음.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [구현체] 저자의 구현체 공개버전 : <a data-mce-href="https://github.com/mquad/hgru4rec" href="https://github.com/mquad/hgru4rec" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://github.com/mquad/hgru4rec</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(11) 최근. 개인화 Re-Ranking. (개인화 Reinforcement Learning Re-Ranking By 알리바바)</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 개인화 re-Ranking 에 Reinforcement Learning 이용.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> [논문] <a data-mce-href="https://arxiv.org/pdf/1803.00710.pdf" href="https://arxiv.org/pdf/1803.00710.pdf" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://arxiv.org/pdf/1803.00710.pdf</a></div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> 아카데믹하게 알려진 논문은 아니지만, 타오바오와 알리바바의 사례를 담고있는 논문이라, 매우 현실적인 접근이며, 의미있는 새로운 Approach 임.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> Factorization Machine 과 마찬가지로, 기존 Legacy 추천 시스템 뒤에서, 혹은 복수개의 모델의 개인화 노출 순서를 정하는 부분, 혹은 Search 엔진 뒤에서 개인화를 구현하는데, 적합.</div>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
<br /></div>
<h3 style="color: #172b4d; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 16px; font-variant-ligatures: normal; line-height: 1.5; margin: 30px 0px 0px; orphans: 2; widows: 2;">
<strong>(12) Deep Learning 기반 최신 추천시스템 동향 관련 Survey 논문</strong></h3>
<div style="color: #555555; font-family: "맑은 고딕", seoul, arial, helvetica; font-size: 13.3333px; font-variant-ligatures: normal; line-height: 1.3; margin-top: 10px; orphans: 2; overflow-wrap: break-word; widows: 2;">
-> <a data-mce-href="https://arxiv.org/pdf/1707.07435.pdf" href="https://arxiv.org/pdf/1707.07435.pdf" style="color: rgb(59, 115, 175) !important; text-decoration: none;">https://arxiv.org/pdf/1707.07435.pdf</a></div>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com104tag:blogger.com,1999:blog-8166686140676460430.post-11637248478650210532018-10-10T23:47:00.001+09:002018-10-11T13:56:29.281+09:00강화학습(Reinforcement Learning)으로 접근하는 E-commerce Dynamic Pricing 논문리뷰 요즘 취미생활중인 강화학습!<br />
강화학습의 코딩 Deep Dive 를 하기 위한 Play Ground 를 뒤지던 중, 우리 파트, deep learning specialist 한성국파트너가 <b><u>좋은 논문</u></b>을 소개해 주었다.<br />
<br />
일단, <b><u>나의 기준으로 좋은 논문</u></b>은<br />
(1) Goal 이 Practical 한지,<br />
(2) 구현 가능할 것 같은지,<br />
(3) Goal 뿐 아니라, 구현 난이도 등에서도 현실성을 갖추고 있는지(너무 두리뭉실하게 표현하고, 많이 숨기고 있으면 탈락이다.)...<br />
<br />
에 가중치를 높게 두고 있음을 알려둔다. (물론 저 기준은 산업계에 몸담고 있는 나의 지극히 개인적인 기준일 뿐이다. 저런 류의 Practical 한 논문 또한 Ideal 한, Research 논문을 바탕으로 그 위에 등장할 수 있으므로, 모든 Research 논문들이 결국은 뿌리이며, 진화의 시작이라 할 수 있다.)<br />
<br />
이 논문은 아직 학술적으로는 검증된 논문이 아니다. ICLR 2019 에 제출되었으나, 아직 Review 중인, 그래서, 저자가 누구인지도 모르는 상태의 논문이기 때문이다.<br />
<br />
하지만, 내용을 읽다 보면, 실무에서 바로 적용하기 위한 연구를 진행하였고, 그 과정에서의 시도와 결과 그리고 인사이트 등을 경험을 통해 공유하고 있음을 알수 있다. 더군다나 Tmall.com (By Taobao) 이라고 하는 걸출한 E-commerce 플랫폼 위에서 꽤 많은 양의 데이타와 기간으로 실험한 결과를 보여주고 있어, 검증 자체에도 강한 신뢰가 가는것이 사실이다.<br />
<br />
이런류의 논문은 학술적인 가치를 논외로 치더라도, 그 실험 방법, 문제의 정의, 그리고, 그것을 적용한 결과 자체가 매우 Practical 하여, 이런류의 문제를 동일하게 Real World 에서 접근 시 매우 큰 참고가 될 수 있어서 좋다.<br />
(아마도 저자는 Taobao 의 직원일 것이다. 꼭 그렇지 않더라도, 해당 플랫폼 위에서의 실험 자체가 Real World 를 많이 반영하고 있어서 맘에 든다.)<br />
<br />
본론으로 들어가서 내가 읽은 부분을 요약해 보겠다.<br />
<br />
<ol>
<li>논문 제목</li>
<ol>
<li>DYNAMIC PRICING ON E-COMMERCE PLATFORM
WITH DEEP REINFORCEMENT LEARNING</li>
</ol>
<li>논문 위치</li>
<ol>
<li><a href="https://openreview.net/pdf?id=HJMRvsAcK7">https://openreview.net/pdf?id=HJMRvsAcK7</a></li>
</ol>
<li>서론부에 등장하는 타사 사례</li>
<ol>
<li>Uber 사례</li>
<ol>
<li>Uber 는 'surge' 라고 하는 dynamic pricing 전략을 구현하고 발표한바 있는데, driving time 을 늘리는데 있어 매우 큰 기여(significant impact)를 줬다고 한다.</li>
<li><span style="background-color: yellow;">[사족] @김상우 님. 저희 예전에 쏘카에서 Reinforcement Learning 으로 dynamic Pricing 적용 시의 파급효과및 구현 가능성에 대한 대화를 잠시 나눈적 있었죠? 딱 그 모델이네요. 물론 Uber 는 다른 알고리즘을 사용했을지도 모르지만요...</span></li>
<li>Chen & Sheldon (2016) 에서 소개되었다.</li>
</ol>
<li>Zara 사례 </li>
<ol>
<li>systematic 한 dynamic pricing 모델을 구현 적용하였으며, Markdown pricing strategy 에 적용.</li>
<li>Caro & Gallien (2012) 에서 소개.</li>
<li><i style="background-color: yellow;">[사족] Markdown은 좀 옛 방식이긴 하지만, 여전희 Off-line 등에서 Human 에 의해 직관으로 대부분 수행되고 있으며, 국내 E-commerce 에서는 이 조차도 Model 화 되지 않은 곳이 대부분이다.<i style="background-color: yellow;">(2018년 현재 기준).</i> 기술이 어렵다기 보다는 실행력이 어려운 분야가 또 이 분야일 것이다. 가격과 관련된 프로젝트는 장고를 뒤따르게 만들기도 하거니와, 책임, 위험부담 등등, 넘어서야 하는 것들이 많은, 기술 이외의 것들이 더 어려운 분야가 또 이 분야이다. Zara 방식 소개 논문이 2012년 인것으로 보아, 벌써 6년 전 이므로, Zara 는 지금 이 분야가 매우 진화 되어 있을 것으로 추측 된다.</i></li>
</ol>
<li>Kroger 사례</li>
<ol>
<li>Offline 에서 Dynamic Pricing 을 적용하고 개선하기 위해, Electronic price tag 를 스토어에 적용 개선 중.</li>
<li>Nicas (2015)</li>
<li><i style="background-color: yellow;">[사족] 매우 오래전, 벌써 3년전에 Off에서조차 이런시도를 했으니, 그때부터 Kroger 는 매우 발빠른 유통기업이었던거 같다. 현재(2018년)의 Kroger 는 Google에서 무인자동차를 하던 핵심멤버들이 나와서 창업한 실리콘벨리의 무인자동차 관련 Startup 과 제휴하여, 무인배송자동차를 통한 유통 혁명을 실험하고 있고, 아마존 월마트 못지 않게 Data 를 잘 다루는 선진적인 유통기업의 면모를 다양한 곳에서 보여주고 있다. 아니나 다를까... 2015년 부터 이런 시도를 했었넹.... </i></li>
</ol>
<li>Amazon.com 상품수</li>
<ol>
<li>2017년 기준 562 million = 5억 6천 2백만 상품이 있다고 함.</li>
</ol>
<li>Wallmart.com 상품수</li>
<ol>
<li>4.2 millon = 420만 상품이 있다고 함.<i> <span style="background-color: yellow;">([사족] 뭐 별거 아니네....물론 온라인전용 상품 포함이 아닌 오프라인 상품 수가 저 정도라고 한다면, 말이 다르지만...)</span></i></li>
</ol>
<li>Taobao.com 상품수</li>
<ol>
<li>2 billion = 20억 상품.</li>
<li><span style="background-color: yellow;"><i>([사족] 중국이 대단한건 알고 있었지만, World Top Level 아마존이 5억 6천인데.... 2017년이라고 하더라도, China Top Level 타오바오가 20억 상품 이라뉘.... 물론 Tmall 은 이미 Global 화가 많이 진행되고는 있지만...)</i></span></li>
</ol>
<li>Amazon.com 사례</li>
<ol>
<li>Automatic Pricing System 을 만들었음.</li>
<li>매 15분 마다 Price를 갱신. (2016년 기준)</li>
<li>Chen et al. (2016)</li>
</ol>
<li>학계의 Approach </li>
<ol>
<li>기존연구들</li>
<ol>
<li>Statistical Learning. </li>
<li>price optimization.</li>
<li>stochastic model.</li>
<li>Bayesian dynamic pricing policies.</li>
<li>non-parametric approaches.</li>
</ol>
<li>위 연구들은 큰 한계가 있었음.</li>
<li>그 한계를 뛰어 넘는 최신 연구.</li>
<ol>
<li>MAB(multi armed bandit) 을 이용. Misra et al. (2018) </li>
<li>본 논문은 MAB 를 그래서, base model 비교군으로 삼았음.</li>
</ol>
</ol>
</ol>
<li>본 논문의 알고리즘 요약</li>
<ol>
<li>Dynamic Pricing Problem 을 Deep Reinforcement Learning 으로 접근.</li>
<li>E-Commerce 플랫폼에 적용하여 evaluation. (taobao 의 Tmall.com)</li>
<li>주요접근 방법</li>
<ol>
<li>Markov Decision Process 를 이용한 D.P. 의 첫 논문이라고 밝힘.</li>
<ol>
<li><span style="background-color: yellow;">[사족] 이 시점 부터 AlphaGo-Lee(이세돌버전)가 강하게 떠오른다. Alphago-Lee 는 Markov Decision Process 를 활용한, Monte Carlo tree search , 그리고 마찬가지로 Deep Reinforcement Learning 이 주요 알고리즘들 중 하나이다.</span></li>
</ol>
<li>discrete and continuous 한 price 액션 스페이스 에서 다양한 보상 functions 을 정의.</li>
<ol>
<li>discrete pricing action model</li>
<ol>
<li><b><u>deep Q-networks (DQN) 이용.</u></b></li>
</ol>
<li>continuous pricing action model</li>
<ol>
<li><b><u>(DQN) 과 함께 Deep Deterministic Policy Gradient (DDPG) 가 이용.</u></b></li>
</ol>
</ol>
<li>historical data 로부터 pre-train 모델을 적용.</li>
<ol>
<li>pre-training 의 중요성이 길게 언급되었었음.</li>
</ol>
</ol>
<li>pricing period d 는 하루나 한주가 될 수 있음.</li>
<li>보상(reward) function 은 revenue 혹은 sales. 수익 혹은 매출로 가능하지만...</li>
<ol>
<li>그러나 위 두 값은, 요일, 계절, 행사 및 이벤트 여부 등 다양한 외부 변수에 의하여 매우 가변적인 값이다.</li>
<li>그러한 값들에 독립적인 measure 가 필요.</li>
<li>본 논문에서는 이를 revenue conversion rate 로 칭하였고, 다음과 같이 정하였다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-4sYTsa3lxC4/W738gYyLnEI/AAAAAAAAH-U/HF7hUTjLkrUgIL06zBWSIJ7vDhKT9PKzgCLcBGAs/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="53" data-original-width="212" src="https://2.bp.blogspot.com/-4sYTsa3lxC4/W738gYyLnEI/AAAAAAAAH-U/HF7hUTjLkrUgIL06zBWSIJ7vDhKT9PKzgCLcBGAs/s1600/4.png" /></a></div>
<ol>
<li> dividing <b><span style="font-size: large;">revenue</span></b>i by
<b><span style="font-size: large;">uv</span></b>i -> 이를 시간에 따른 변화량으로 표현.</li>
</ol>
</ol>
<li>다양한 features</li>
<ol>
<li>price features</li>
<li>sales features</li>
<li>customer traffic features</li>
<li>competitiveness features</li>
<ol>
<li><span style="background-color: yellow;">[사족] 경쟁사의 동일 상품의 상태는 중요하고 상관도 높은 feature 일 수 있는데, 유일한 외부 feature 이기도 하다.</span></li>
<li><span style="background-color: yellow;">[사족] 그래서, 크롤링이 동원되어야 하고, 크롤링 해서 가져올 내용은 경쟁사 가격, 행사 및 이벤트 여부, 그리고 댓글 달리는 속도(이는 조회 수를 유추 할 수 있어서...)</span></li>
<li>저자 역시 이런 언급을 했다. </li>
<ol>
<li>The comments and the states of the similar products
contribute to competitiveness features. </li>
</ol>
</ol>
</ol>
</ol>
<li>실험결과</li>
<ol>
<li>Offline 결과</li>
<ol>
<li>4만개의 서로 다른 fast moving consumer product 를 사용</li>
<li>60일 판매데이타 사용</li>
<ol>
<li>59일을 가지고 pre-training </li>
<li>마지막 1일을 가지고 evaluation</li>
</ol>
<li>240만 튜플이 이용되었다.</li>
<li>offline policy evaluation 에서 MAB 알고리즘 구현체로 LinUCB 를 사용. 이는 Deep Reinforcement Learning 을 앞도했음.</li>
<ol>
<li>MAB 는 즉각적인 reward 를 maximize 하는 경향 있음.</li>
<li>DRL 은 long-term reward 를 maximize 하려는 경향 있음.</li>
<li>이는 offline 의 특성에 기인.</li>
<li>하지만, E-commerce 플랫폼에서는 이 optimal policy 는 적합하지 않음.이는 뒤이는 online 결과에서 입증 됨.</li>
</ol>
<li>서로다른 accuracy 모델(error rate, rate of right estimation, etc)에서는 DRL 이 더 높은 accuracy 를 보임.</li>
</ol>
<li>Online 결과</li>
<ol>
<li> revenue conversion rate 와 profit conversion rate 모두 DQN 이 사람의 manual 판단을 앞도 했음.</li>
<ol>
<li><a href="https://2.bp.blogspot.com/-nuaFcjGxk58/W74DnVGx8SI/AAAAAAAAH-k/PptGVFZAllcCea2DwvlxvXlbc_Syt7JSgCLcBGAs/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="722" data-original-width="1032" height="446" src="https://2.bp.blogspot.com/-nuaFcjGxk58/W74DnVGx8SI/AAAAAAAAH-k/PptGVFZAllcCea2DwvlxvXlbc_Syt7JSgCLcBGAs/s640/5.png" width="640" /></a></li>
</ol>
<li>유사 상품 그룹은 유사 결과를 보여준다는 것(a)과 DQN과 LinUCB 를(b) 그리고 다시 DQN과 DDPG 를(c) 비교하였음.</li>
<ol>
<li><a href="https://1.bp.blogspot.com/-y5D7GiuZy5A/W74IY8GnfSI/AAAAAAAAH-w/p9IgfG_8idYdjQYZKLioau3P2YvsTdqpgCEwYBhgL/s1600/6.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="307" data-original-width="572" height="342" src="https://1.bp.blogspot.com/-y5D7GiuZy5A/W74IY8GnfSI/AAAAAAAAH-w/p9IgfG_8idYdjQYZKLioau3P2YvsTdqpgCEwYBhgL/s640/6.png" width="640" /></a></li>
</ol>
</ol>
</ol>
<li>결론</li>
<ol>
<li>DDPG와 DQN 로 구현한 pricing policies는 기존의 다른 pricing policies 를 앞도하였다.</li>
<li>markdown pricing 에 있어서도 deep reinforcement learning approach 가 기존 manual markdown pricing strategy 를 앞도하였다.</li>
<li>본 연구에서는 각각 개별 상품별로 pre-training 을 수행했다.</li>
<li>그러므로, 잘 팔리지 않는 상품에 대하여는 별도의 처리를 해주어야 하며, 이 부분은 transfer learning 및 meta learning 기법이 이용될 수 있다.</li>
<li>향후 promotion pricing feature 와 membership pricing fetures 를 추가할 예정이다.</li>
<li><span style="background-color: yellow;"><b>[사족] 본 논문은 다이나믹 프라이싱을 Markov Decision Process 를 사용하여 가장 최신의 기법인 MAB 기법보다 낳은 결과를 보여주었음을 보여주었다.</b></span></li>
<li><span style="background-color: yellow;"><b>[사족] 이 논문이 읽는 독자의 시각에서 크게 기여하고 있는 바는 아래 정도일 듯 한다. 내가 느낀 바 이다.</b></span></li>
<ol>
<li><span style="background-color: yellow;"><b>Pricing 문제를 RL 로 접근함에 있어, 문제정의 그리고 접근 방법에 충실한 가이드라인을 제공하고 있다.</b></span></li>
<li><span style="background-color: yellow;"><b>시간단위별 revenue conversion rate 를 가지고 reward function을 만든 부분은 간단하면서도 꽤 reasonable 한 approach 였다.</b></span></li>
<li><span style="background-color: yellow;"><b>중요 feature 들을 잘 정리해주었고, 유사상품 그룹의 특성까지 실험해 주었다.</b></span></li>
<li><span style="background-color: yellow;"><b>어느정도의 데이타로 어느정도의 결과에 도달하는지 가이드를 제시해 주었다. 향후 이 수치는 우리가 맞게 접근하고 있는지 가늠하는데 큰 도움이 될 수 있다.</b></span></li>
<li><span style="background-color: yellow;"><b>접근한 DQN 과 DDPG 의 hyper parameter 도 제시하고 있다. 유레카~~ ^^</b></span></li>
</ol>
<li><span style="background-color: yellow;"><b>[사족] 내가 이런류의 Practical 한 논문을 좋아하는 이유는 이를 그대로 구현해 보는 것이 최초의 Base line 모델 구축 이후 다음 2번째 혹은 3번째 시도 정도로서 매우 빠르고 유용한 접근 가이드를 제시하기 때문이다. </b></span></li>
<ol>
</ol>
</ol>
</ol>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com1tag:blogger.com,1999:blog-8166686140676460430.post-40020613059040152692018-08-29T10:25:00.000+09:002018-08-29T10:56:01.361+09:00Production Deep Learning 서비스 Pain Point 에 대한 단상 - E-Commerce Product Overview 기능을 통한 분석<div class="" data-block="true" data-editor="9sk98" data-offset-key="dngsv-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="dngsv-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span data-offset-key="dngsv-0-0" style="font-family: inherit;">요즘 해외 배송이 빨라지고 저렴해 지면서, 전자 제품 및 노트북 액서서리 등등 은 거의 Amazon 및 Alibaba 를 이용하고 있다. 특히 고가의 IT기기의 경우 국내가격대비 20% 이상 저렴한 것을 감안하면, 가격 Save 도 큰 역할을 한다. 하지만 그 무엇보다, Amazon 및 Alibaba 의 IT 기기 Search와 상품상세 view에 있어서의 site 의 편리함과 Data Driven Overview 기능의 사용성은 그 모든것을 능가하는 쐐기를 박는 요소가 아닐 수 없다.</span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="4fr2f-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="4fr2f-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">우선 alibaba 는 IT 기기들의 경우 카테고리별로 사용자들이 주로 보는 속성들을 Quick Details 라는 메뉴로 요약해서 보여준다. 사실 이 부분만 보면 거의 98%에 가까운 확인 사항을 모두 확인 할 수 있어서, 상품상세를 모두 봐야 할 필요가 없다. </span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="3acqu-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-yZLa-p3yXbo/W4XirozyweI/AAAAAAAAHnI/a-o_P9EuCu0X-vyaTqycsaLrDAko_nu_wCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="984" data-original-width="1280" height="492" src="https://2.bp.blogspot.com/-yZLa-p3yXbo/W4XirozyweI/AAAAAAAAHnI/a-o_P9EuCu0X-vyaTqycsaLrDAko_nu_wCLcBGAs/s640/2.png" width="640" /></a></div>
<div class="_1mf _1mj" data-offset-key="3acqu-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span data-offset-key="3acqu-0-0" style="font-family: inherit;"><br /></span></div>
<div class="_1mf _1mj" data-offset-key="3acqu-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">우리나라 e-commerce 의 경우 무겁고 어마어마한 크기의 카탈로그 scan 이미지를 모두 봐야 제품 상세 정보를 알수 있는 경우가 많고, 요약 속성을 제공하는 경우에도, 업자가 자체적으로 제공하여, 상품마다, 노출 위치나 항목, 요약 정보의 제공 패턴이 모두 제각각이다. 불리한 속성은 일부러 언급하지 않는 경우도 있고, 그 경우에는 어마어마한 크기의 카달로그를 죄다 뒤져야 한다.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-JZEFp6w6j_k/W4Xk5rFMqnI/AAAAAAAAHnU/RFhwqDK026EvGpYhYSjU4rx8xC4xLhGuwCLcBGAs/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="631" height="640" src="https://1.bp.blogspot.com/-JZEFp6w6j_k/W4Xk5rFMqnI/AAAAAAAAHnU/RFhwqDK026EvGpYhYSjU4rx8xC4xLhGuwCLcBGAs/s640/3.png" width="251" /></a></div>
<div class="_1mf _1mj" data-offset-key="3acqu-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">Amazon 은 한단계 더 진화 했다. 최근 보았던 2개를 포함하여 총 3개를 비교하여 한눈에 difference 의 요약 정보를 일목 요연 하게 보여 준다. </span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="5endc-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-3PDaAC-2Ty0/W4XlFJtSt-I/AAAAAAAAHnY/BXeXfdYrxnYw0Aws0pwzwvrKvuOOk4pIgCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1039" data-original-width="1535" height="432" src="https://2.bp.blogspot.com/-3PDaAC-2Ty0/W4XlFJtSt-I/AAAAAAAAHnY/BXeXfdYrxnYw0Aws0pwzwvrKvuOOk4pIgCLcBGAs/s640/1.png" width="640" /></a></div>
<div class="_1mf _1mj" data-offset-key="5endc-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span data-offset-key="5endc-0-0" style="font-family: inherit;"><br /></span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="6mmr1-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="6mmr1-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">이는 비단, 사용성과 편리함의 문제로 그치지 않는다. 상품 카테고리별로 중요한 속성이 뭔지를 아는것, 그리고 각 상품별로 그 속성의 값이 무엇인지를 아는 것은 e-commerce site 에서 어마어마한 자산일 수 있다.</span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="b2040-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="b2040-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">일반적인 e-commerce site 의 대부분이 상품별로 제목, 상품상세 text, 카테고리, 브랜드 등만을 관리하는 것과 달리, 위 선진 site 들 처럼 각각의 대표속성, 대표 키워드 등을 관리한다는 것은 Semantic Search , 자연어 기반 챗봇 검색, 속성기반 유사도 추천, 품절 대체 추천, 기타 검색 품질 관리에 있어서도 많은 유리함을 가져다 준다. 다차원의 속성이 있으면, 모든 상품을 N차원 공간에 배치할 수도 있다. 그리고, 그런 유사 상품의 공간 백터 상 관리는, 상품별로 가격, 배송,물류 관리 등 다방명의 Data Driven Model 을 만듦에 있어, 매우 큰 기초 Data 역할을 한다. 약간의 Deep Learning NLP 를 가미하면, 상품명을 몰라도 그 상품을 수식하는 형용사 만으로도 상품을 찾아들어갈 수 있다. </span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="f8hlt-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="f8hlt-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">최근의 e-commerce Text NLP AI use case 관련 논문들은 자연어 문장에서 단순하게 NER 만 뽑아내는 것이 아닌, NER 을 뽑아냄과 동시에 이러한 중요 속성을 함께 뽑아내는 연구가 이루어지고 있음을 보여준다. 문장중에 언급이 없어도, 성별을 찾고, 어른용을 찾는지 아이들용을 찾는지, 선물용인지 등등의 중요속성 정보를 NER 뽑아내듯, 화자 혹은 검색 사용자의 일부 단서나 나열된 keyword sequence 로부터 뽑아준다는 의미이다.</span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="qel0-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="qel0-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">해당 논문을 몇달 전부터 구현레벨에서 검토하였는데, 역시, 구현보다 어려운것이, 그 데이타의 Training 을 위한 Input Data 가 legacy 에 존재하지 않는 다는 점이다. 요즘 내가 alibaba 나 amazon 의 저런 제품 속성 기반 Generated(or Model Managed) Overview 기능에 관심을 갖는 이유라 하겠다. </span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="4ltlp-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="4ltlp-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span data-offset-key="35v66-0-0" style="font-family: inherit;">그렇다면, 해당 속성 데이타가 없다는 것은 누구의 잘못인가? 의사결정자의 잘못인가? 기획자? 전략부서? 데이타부서? AI부서? 그 누구의 잘못도 아니다. 그걸 100% 수작업으로 만들어 내려는 시도는 10년전에도 많은 기획자들이 고민했던 ROI 답 안나오는(그래서 검색 Tag 정도만 최소로 관리하는) 문제 중 하나이다. 그래서 그런것을 만들어내는 것 또한, 요즘은 </span><span style="font-family: inherit;">Deep Learning Model 로 접근하고 있다. 혹은 Model 이 95% 정도를 자동으로 해주고, 소수의 운영자 및 알바생들이, Accuracy 점수가 낮은 순으로 정렬하여, quick 하게 eye checking 만 하면서, click, drag 가 대부분 작업이도록 하면서 supervised learning 되도록 operation 관리자 페이지를 구성하여 구성하는 사례가 선진사례에서 등장하고 있다. 즉, ROI 안나오던 작업이 AI Assist 로 인하여, ROI 가 나오는 해볼만 한 작업이 된 것이다.</span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="35v66-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="35v66-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">하루에 수천건의 신규 상품이 들어와도 자동 분류 되고, 자동 tagging 되고, 공간상에 자동으로 꼳혀 들어가야 하고, operator 에 의한 정교화 보정 작업은 후처리 사항이며 모든것을 전수 관리할 필요가 없어졌다. 이를 프로세스화 하고 입력시점에 업체들에게 위임 할 수도 있으나, 업체는 낚시성 Tag 를 다는데 더 최적화 되어 있으며, 이는 Noise 에 해당한다. 감지된 데이타에 대한 보정 작업은, Supervised Learning, 좀더 구체적으로는 online learning 의 재료로 쓰이며, 모델 진화에 기여 한다. 그것보다 더 잘 기획된 AI 서비스는 그 과정에서, 모든 training 진화를 Operator가 죄다 하는 것이 아닌, 사용자의 반응 및 행위가 model 의 진화에 기여 하도록 UI 기획을 하는 것이라 할 수 있다.(요즘 기획자들은 그래서 Deep Learning 개념을 좀 알고 있어야 한다.)</span></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="3vlka-0-0" style="background-color: white; color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="3vlka-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<br /></div>
</div>
<div class="" data-block="true" data-editor="9sk98" data-offset-key="fphpv-0-0" style="color: #1d2129; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">
<div class="_1mf _1mj" data-offset-key="fphpv-0-0" style="direction: ltr; font-family: inherit; position: relative;">
<span data-offset-key="fphpv-0-0" style="background-color: yellow; font-family: inherit;"><b><u>결론을 내 보겠다.</u></b></span></div>
<div class="_1mf _1mj" data-offset-key="fphpv-0-0" style="background-color: white; direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">Production AI 서비스를 하다보면, </span></div>
<div class="_1mf _1mj" data-offset-key="fphpv-0-0" style="background-color: white; direction: ltr; font-family: inherit; position: relative;">
<ol>
<li>Main Problem 의 model 을 만드는 일이 사실 제일 쉬운 문제이다. 연구도 많이 되어 있고, 논문 혹은 바로 쓸 수 있는 오픈소스나 github 구현체를 찾아서 활용할 수도 있다. </li>
<li>그보다 어려운 부분이 다수동접처리 및 빠른 서빙, 무중지 배포, Auto Scale Out 등의 문제이다. 여기서부터는 Lab 에서 연구하지 않는 분야이고, 참고 자료가 많지 않기 때문이다. <b><u>이를 위한 방법론은 여러차례 블로깅 한 적이 있었다.</u></b></li>
<li>그보다 더 어려운 부분은 만드는 AI Production 서비스에 Freshness 와 personalization 을 추가하는 문제이다. Freshness 는 병렬성이 핵심이며, realtime 인입이 필요하여 kafka, spark streamming 등의 도움이 필요할 수 있으며, 람다 아키텍처가 필요하고, 요즘 스타일로는 Serverless Microservice 기술이 필요하고, kubernetess 및 docker 를 끌여들여야 할 수 있다. Personalizaion 으로 가면, 모델의 차원이 커지고, 사람별로 혹은 상품별로 Training 을 하기 위해 BigData Scale 의 Computing 과 분산 Deep Learning 을 위한 BigData 기술 연계가 동원된다. (개발 생산성과 low level tensorflow 직접 분산처리보다 더 빠른 컴퓨팅을 위해서 이기도 하거니와, 수많은 heavy pre-processing 을 위해서이기도 하다.) <b><u>이를 위한 방법론은 여러차례 블로깅 한 적이 있었다.</u></b></li>
<li>그보다 더 어려운 문제는 양질의 Data 를 확보하는 문제이다. 결국은 Production 직전에 혹은 직 후에 이 부분에 직면하게 된다. Garbage in Garbage out 이다. 모델에 집중하면 정확도 3% 올리는데 반년이 걸릴 수 있지만, Input Data 에 집중하면 몇달을 투자하여 정확도가 10%가 올라갈 수도 있다. 국내에 AI Production Service 를 잘하는 곳도 여기까지 와서 주저 앉는 경우가 많다. 일반적인 IT 프로젝트 처럼 오픈 이후 바로 결과를 확인 하는 습관 때문이기도 하다. AI 프로젝트는 여기서부터 시작이라고 해도 과언이 아니다. 반응을 보지 않고, 상상으로 개발한 1차 결과물보다, 실 데이타가 3달 이상 쌓인 후 이를 보면서, 2차 3차 고도화를 통해, 상상 Training Data 와 Real Input Data 간의 괴리를 줄이는 작업이 이후에 지속적으로 투자 되어야 하는데, 이를 기달리지 못하고, 초기 결과를 보고 스폰을 받지 못하여 Operation 과 이와 맞물린 관리적 고도화가 되지 못하는 AI 서비스를 주변에서 많이 보았다. </li>
<li>그보다 더 어려운 문제는 양질의 Data를 수작업을 통해서가 아닌 자동으로 혹은, 자동80% 수동 20% 정도로 확보하게 만드는 일이다. e-commerce 를 예를 들자면, OCR, 댓글 텍스트, 크롤링 등등 다양한 방식으로 이런한 Data 를 Generation 화 할 수 있으며, 중요속성을 뽑아내는 다양한 알고리즘이 존재한다. 하지만, 이 부분은 경험해 보니, 모델이 어려운게 아니라, 이것 자체가 또하나의 프로젝트가 되어버리는 것이 문제였다. A 프로젝트를 잘하기 위해 B 프로젝트를 또 해야 해요! 가 조직에 잘 설득되지 않는 경우가 많았다. 사실 할일도 많고, 인력도 없는데, A 프로젝트도 겨우 인력 짜내서 하는 형국에 B 는 Minor 로 치부되는 것이, 당연한 현실 일 수 있다. </li>
<li>그것보다 더 어려운 문제는 양질의 Data 와 이후 Production 중 보정 후 재 Training 이 사용자들에 의하여 <b style="font-family: inherit;"><u>원순환</u></b><span style="font-family: inherit;">으로 알아서 진화되도록 UI를 잘 만드는 일이다. 덧붙여 이에 맞는 원순환 맞춤 관리자 페이지도 나와줘야 한다. 덧붙여 모델 자체도 원순환 training 이 가능하도록, 람다 아키텍처 및 batch training, 그리고, 무중지 online training 이 삼박자가 잘 맞게 개발되어야 한다. 아쉽지만, 이는, R&R 지옥을 뚫고 기획을 개발자가 하거나, 기획자가 개발자가 되거나 하는 정도의 Mix 된 융합 Co-Work 이 필요하며, 딱 그 만큼(정말로 개발자가 기획을 하고, 기획자가 개발하는 것 만큼이나)이나 어렵다. </span></li>
</ol>
<span style="font-family: inherit;">오늘 언급한 Production Deep Learning 서비스의 Pain Point 에 대한 단상은 결국, 기획과 모델링과 개발의 유기적인 결합이 중요한 Key 라는 결론으로 귀결 되었다. </span></div>
<div class="_1mf _1mj" data-offset-key="fphpv-0-0" style="background-color: white; direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;">경험해 보건데, 현실적으로 이를 위해 제일 쉬웠던 방법은....</span></div>
<div class="_1mf _1mj" data-offset-key="fphpv-0-0" style="background-color: white; direction: ltr; font-family: inherit; position: relative;">
<ol>
<li>끊임없이 개발자나 모델러들이, 기획자를, 윗분들을 설득하고 , 또 말하고, 또 설득하고... 그 과정에서 싸우기도 하고, 장문의 편지도 많이 쓰고.. 설레발도 많이 떨고, 페이스북에 기사같은것도 막 퍼 날라주고....TT 지난한 일이지만, 그래야....느린속도로 라도 둘 간에 혹은 셋간에(경우에 따라서 넷 이상이 될 수도 있는게 현실이다. TT) 바라보는 곳이 같아지고, Over lap 되어 일하는 부분이 늘어나는 것 같다.</li>
<li> 그리고, 그들을 설득하고, 우리들의 가장 큰 약점인 말빨에서 밀리지 않기 위해서는, 우리들도 끊임없이 문과적으로 사고하고, 비지니스도 좀 가중치를 올려주고, 기획적인 사고도 더 연습하고 더 자주해야 한다는 점이다.</li>
<li>기획자에게 Deep Learning 에 대한 꿈과 밝은 미래를 자주 주입해주고, 공짜 컨퍼런스 티켓도 좀 사비로라도 사서 나 시간없어서 사놓고 못간다고 하면서 좀 던져 주고, 기획자에게 패스트캠퍼스나 모두의 연구소 같은것도 좀 추천해주고.... 이것이 은근히 정말 큰 도움이 된다. 기획자가 50%를 이해하면, 회의시간이 3배 이상 줄어 들고, 서로 딴이야기를 하지 않을 확률이 200% 이상 증가하는 듯 하다. 실제 경험담이다.</li>
<li>위 6단계를 warter fall 로 한다는 것은 말도 안되는 일이다. 외주에 맞기고, Production 시점부터 즉, 위 6단계의 4부터 외주업체가 나간체로 내부에서 한다는 것도 말이 안되는 일이다. 물론 협력하면서 프로젝트를 한 경우는 가능할 수 있다. 결국 초반엔 첫 프로젝트는 개고생을 감수해야 할지도 모르겠다. 역시 경험담이다. 개고생한만큼 기술도, 그리고 위를 이끌어 낼려는 간절함의 동인으로 부터 야기된 설레발 능력(1에서 많이 활용되는 능력이다)도 성숙해지는 듯 하다. </li>
<li>성공을 한번 맞보게 하는것이 매우 중요해 보인다. 그런데 매우 초기에 빨리 맛보게 해줘야 한다. 그렇지 못한다면 자멸할 수도 있다. 이후 그것을 발판삼아야 스폰도 받고, 시간도 얻고, 인력도 얻어서, 시간을 Parallel 화 시킬 수 있다.(초기에는 누구도 기달려주는 사람이 없다.) 결국 AI 서비스는 아이에게 말을 가르치듯, 단계를 하나하나 잘 밟고, 시간 투자를 해야 하는데, 그런데 시간을 기달려주지 않는다....그렇다면, 조직에서 스폰서쉽이라도 받아서 Parallel 하게 모델들을 개발 하는게 중요하다. </li>
</ol>
<div>
요즘 박항서가 2002년도 히딩크 만큼이나 베트남에서 축구 감독으로 활약을 하고 있다. 우리나라에서 AI 하기는 우리나라 대표팀으로 월드컵 16강 가기 정도로, 생각할게 많은 듯 하다. AI와 축구는 멀티플레이어가 매우 중요한것도 닮아 있다. 그리고, 골을 넣는것도 중요하다. 결국 골을 못넣으면, 과정이 어찌 되었든 비난 받는다. 수많은 시선과 실시간으로 쏟아지는 매우 short-term 의 비판을 뚫고서도, long term 의 전략을 세우지 않으면, 본질적으로 결코 쉬운일이 아니다. 너무 log term 의 전략은 자칫 Short-term 의 비판에 나가 떨어지거나, 포기하거나, 이직하거나, 인사고과 D 맞기 십상이다. 하지만...본질적으로 우리나라는 16강 가기 위해, Long term 의 전략과 본질적인 기본기 확충을 위한 시간 투자와, 시스템의 개편과, 축구 협회의 성찰과 혁신도 필요하다.</div>
<div>
<br /></div>
<div>
대한민국 AI 개발자 화이팅 합시다.!!!! </div>
</div>
<div class="_1mf _1mj" data-offset-key="fphpv-0-0" style="background-color: white; direction: ltr; font-family: inherit; position: relative;">
<span style="font-family: inherit;"><br /></span></div>
</div>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-29002312993857516832018-01-11T21:59:00.001+09:002018-02-03T17:01:05.271+09:00Deep Learning Multi Host & Multi GPU Architecture #2 - Keras 를 이용한 Scale Up, Horovod 를 이용한 Scale Out 성능 비교Deep Learning Multi Host, Multi GPU 를 사용하고, BigData Scale 데이타를 처리하며, Auto Scale Out 확장 까지 고려한 아키텍처 구성에 대하여 연재 중이다.<br />
<br />
개요는 이곳에서 확인 가능하다. [아키텍처 주안점 및 설계를 위한 고찰 : <a href="https://hoondongkim.blogspot.kr/2018/01/deep-learning-multi-host-multi-gpu.html">https://hoondongkim.blogspot.kr/2018/01/deep-learning-multi-host-multi-gpu.html</a> ]<br />
<br />
오늘은 두번째로,<span style="background-color: yellow;"> <b><u>High Level 딥러닝 프레임워크 인 Keras 를 이용한 GPU Scale Up. 그리고 Horovod 를 이용한 Multi Host GPU Scale Out 의 성능에 대한 비교를 해보도록 하겠다.</u></b></span><br />
<br />
우선 Tensorflow 나 pyTorch 나 CNTK , Caffe2 등에서 이미 GPU 나 Host 에 대한 확장을 이미 지원하고 있는데, 이러한 실험이 무슨 의미가 있는지 의아할 듯 하여, 그 의미에 대하여 다시 언급해 보도록 하겠다.<br />
<ol>
<li>기존 Deep Learning 프레임워크에서의 Low Level 병렬 수행 최적화 코드를 별도로 구현해야 하는 수고를 덜 수 있다.</li>
<ol>
<li>Keras 의 경우 Multi GPU 를 지원하기 시작한지 불과 3달도 체 지나지 않았다. 2017년 10월 경 버전 2.0.9 부터 지원되기 시작했다.</li>
<li><b><u>하지만, Keras는 단 1줄로 Multi GPU Scale Up 이 된다. (Horovod 와 함께 Keras 를 함께 실험한 이유이기도 하다.)</u></b></li>
</ol>
<li>Multi Host 는 훨씬 복잡하다.</li>
<ol>
<li>Keras 의 경우 Multi Host 는 아직 지원하지 않는 한계가 있다.</li>
<li><b><u>Multi GPU Scale Up 은 8 GPU 가 Max 이다. 즉, BigData Scale 확장을 위해서는 Multi Host 도 동원해야 한다.</u></b></li>
<li>Keras등은 자체적으로는 Multi Host 를 지원하지 않는데, Multi Host 까지 최소의 노력으로 사용가능 하도록 구성하기 위해서는 tensorflowOnSpark 나 Horovod, elephas 등을 이용해야 한다. </li>
</ol>
<li>개발 생산성 뿐 아니라, 성능 까지 더 좋았으면 한다.</li>
<ol>
<li>Horovod (made by Uber ) 의 official 페이지에는 Horovod 개발 배경을 다음과 같이 설명하고 있다.</li>
<li><a href="https://1.bp.blogspot.com/-1oBFCSCe0RY/WlMs1SHJ0qI/AAAAAAAAGlM/0WzsQubj6D0lB4d6pquA35tXDhJ7RjZrACLcBGAs/s1600/why.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="204" data-original-width="1019" height="128" src="https://1.bp.blogspot.com/-1oBFCSCe0RY/WlMs1SHJ0qI/AAAAAAAAGlM/0WzsQubj6D0lB4d6pquA35tXDhJ7RjZrACLcBGAs/s640/why.png" width="640" /></a></li>
<li>이런 언급도 있다.</li>
<li><a href="https://4.bp.blogspot.com/-w3M9w-O2QBQ/WleM03Oox5I/AAAAAAAAGn4/uUP7kACiozo3vKFeZ4Rj-4t9O-n1ufroQCLcBGAs/s1600/uber.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="60" data-original-width="908" height="42" src="https://4.bp.blogspot.com/-w3M9w-O2QBQ/WleM03Oox5I/AAAAAAAAGn4/uUP7kACiozo3vKFeZ4Rj-4t9O-n1ufroQCLcBGAs/s640/uber.png" width="640" /></a></li>
</ol>
</ol>
<ol>
</ol>
<div>
이제 위에서 언급된 <b><u>(1) 병렬 코딩에 있어서의 개발생산성</u></b> , <b><u>(2) 수행 시간 단축 효과</u></b>가 어느 정도 인지 확인 해 보자. (맛보기 정도의 예제이기는 하지만, 느낌을 공유 하고자 한다.)</div>
<div>
<br />
테스트는 아래 환경에서 수행되었다.<br />
<b>1. GPU Scale Up Test</b><br />
=> Azure DSVM Image NC-Series .<br />
=> K80 GPU.<br />
=> Tensorflow + Keras<br />
<b>2. GPU Scale Out Test</b><br />
=> Azure Batch AI Cluster with NC-Series vm.<br />
=> K80 GPU.<br />
=> Tensorflow + Keras + Horovod + Azure Batch AI<br />
<br /></div>
<div>
<ol>
<li>Keras 를 이용한 Multi GPU Scale Up 코드</li>
<ol>
<li>아래 코드 1줄이면 된다.</li>
<li><a href="https://4.bp.blogspot.com/-q0YAwJx2i38/WlR5cIIj5VI/AAAAAAAAGlc/no9pK7LoOIEhNZ_dY-zZzRzC70zwzhDhgCLcBGAs/s1600/multi_gpu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="139" data-original-width="877" height="100" src="https://4.bp.blogspot.com/-q0YAwJx2i38/WlR5cIIj5VI/AAAAAAAAGlc/no9pK7LoOIEhNZ_dY-zZzRzC70zwzhDhgCLcBGAs/s640/multi_gpu.png" width="640" /></a></li>
<li>위에서 사용한 메소드를 호출하기 위해 필요한 package import 는 아래처럼 해주면 된다.</li>
<li><a href="https://3.bp.blogspot.com/-8E_X-IDgCUI/WlR59ZNEQWI/AAAAAAAAGlk/kNfB7gdbdScVP3LPjw9IGdHqnGZxN-WEQCLcBGAs/s1600/multi_gpu2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="94" data-original-width="877" height="68" src="https://3.bp.blogspot.com/-8E_X-IDgCUI/WlR59ZNEQWI/AAAAAAAAGlk/kNfB7gdbdScVP3LPjw9IGdHqnGZxN-WEQCLcBGAs/s640/multi_gpu2.png" width="640" /></a></li>
<li>여기서 매우매우 유의해야 할 점이 있다.</li>
<ol>
<li>Keras 는 Multi GPU 사용 시 epoch 가 나눠져서 수행되는 것과 유사하게 동작한다.</li>
<li><b><u>즉, Epoch 를 GPU 갯수로 나누는 코드 적용이 필요하다.</u></b></li>
<li>이론적으로는 이 경우 GPU 갯수가 2배가 되면, Training 속도가 2배 빨라져야 할 것이다. 그러나, 실험을 해보면 그정도 까지 개선되지는 않는다. 그것은 GPU 가 증가 시 GPU 간 Data 의 동기화 Copy 등에 부가적인 Overhead 가 소요되기 때문이다.</li>
</ol>
</ol>
<li>Keras 를 이용한 Multi GPU Scale Up 성능 비교</li>
<ol>
<li>General 한 LSTM 모델이다. 실험을 위해 Training Data Size 는 줄여놓은 모델이다.</li>
<li>GPU 1개 (NC6)</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-vKKMuAqOrXQ/WlR69oQe9pI/AAAAAAAAGlw/zATYWAqHzOcan0AU3ZUfZi_cT111s4-AACLcBGAs/s1600/multi_gpu3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="984" data-original-width="1280" height="492" src="https://2.bp.blogspot.com/-vKKMuAqOrXQ/WlR69oQe9pI/AAAAAAAAGlw/zATYWAqHzOcan0AU3ZUfZi_cT111s4-AACLcBGAs/s640/multi_gpu3.png" width="640" /></a></div>
<ol>
<li>150초 정도가 소요되었다.</li>
</ol>
<li>GPU 2개 (NC6)</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-17-LvQYM-ps/WlR8ZkJi4RI/AAAAAAAAGl8/seUpUr_FcMwPdw_IvGoEokJWx6yaMdOPgCLcBGAs/s1600/multi_gpu4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="984" data-original-width="1280" height="492" src="https://1.bp.blogspot.com/-17-LvQYM-ps/WlR8ZkJi4RI/AAAAAAAAGl8/seUpUr_FcMwPdw_IvGoEokJWx6yaMdOPgCLcBGAs/s640/multi_gpu4.png" width="640" /></a></div>
<ol>
<li>127초가 소요되었다.</li>
<li>그리고 약간 성능도 개선되었다.</li>
<li>이 시점의 nvidia GPU 사용량은 다음과 같다.</li>
<li><a href="https://3.bp.blogspot.com/-ljgbyU0dTQ8/WleOlt_QgOI/AAAAAAAAGoA/W3aX_iEoTfQi-E1g-NveU99KjSABv47xwCLcBGAs/s1600/keras_2gpu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="470" data-original-width="662" height="454" src="https://3.bp.blogspot.com/-ljgbyU0dTQ8/WleOlt_QgOI/AAAAAAAAGoA/W3aX_iEoTfQi-E1g-NveU99KjSABv47xwCLcBGAs/s640/keras_2gpu.png" width="640" /></a></li>
<li>위 처럼 2번째 GPU 는 보편적으로 Fully 일하지는 못한다. (그러나, 모델 및 알고리즘에 따라 그 양상에는 차이가 있었다.)</li>
</ol>
<li>GPU 4개 (NC12)</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-BnNmRwpKNYg/WlR9QRmigQI/AAAAAAAAGmE/dSlNPmJeLpUZ9jdEz_orf4zIz4As-7dWwCLcBGAs/s1600/multi_gpu6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="984" data-original-width="1280" height="492" src="https://3.bp.blogspot.com/-BnNmRwpKNYg/WlR9QRmigQI/AAAAAAAAGmE/dSlNPmJeLpUZ9jdEz_orf4zIz4As-7dWwCLcBGAs/s640/multi_gpu6.png" width="640" /></a></div>
<ol>
<li>82초가 소요 되었다.</li>
<li>성능도 좀더 향상 되었다.</li>
<li>GPU 갯수와 성능과의 관계는 뒤에서 다시 언급 토록 하겠다.</li>
</ol>
</ol>
<li>Horovod 를 이용한 Multi GPU Scale Out 코드</li>
<ol>
<li>Keras 의 Scale Up 코드 만큼 심플하지는 않지만, Horovod 의 경우도 몇줄 코드만으로 Deep Learning 을 Multi Host 로 Scale Out 가능하다. 중요한 것은 Keras와 달리 Scale Up 도 되고, Scale Out 도 된다는데 있다.</li>
<li>import 패키지</li>
<ol>
<li>import horovod.keras as hvd</li>
</ol>
<li>horovod init 코드</li>
<ol>
<li>hvd.init()</li>
</ol>
<li>Process 당 GPU 하나씩 할당하기 위한 코드</li>
<ol>
<li>config = tf.ConfigProto()</li>
<li>config.gpu_options.allow_growth = True</li>
<li>config.gpu_options.visible_device_list = str(hvd.local_rank())</li>
<li>K.set_session(tf.Session(config=config))</li>
</ol>
<li>Epoch 분산 용으로 변경</li>
<ol>
<li>EPOCH = 200.0</li>
<li>epochs = int(math.ceil(EPOCH / hvd.size()))</li>
</ol>
<li>Optimizer 분산용으로 변경</li>
<ol>
<li>opt = optimizers.Adadelta(1.0 * hvd.size())</li>
</ol>
<li>Callbacks 추가</li>
<ol>
<li>hvd.callbacks.BroadcastGlobalVariablesCallback(0)</li>
</ol>
<li>아래는 위 코드 Example 이다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-QOrdKbG1N78/WldHj9t0I3I/AAAAAAAAGmY/L67WU8RdeLEQjsvZn780hCt-7ArfBtrZwCLcBGAs/s1600/horovod_code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="274" data-original-width="661" height="264" src="https://4.bp.blogspot.com/-QOrdKbG1N78/WldHj9t0I3I/AAAAAAAAGmY/L67WU8RdeLEQjsvZn780hCt-7ArfBtrZwCLcBGAs/s640/horovod_code.png" width="640" /></a></div>
<ol>
<li>epoch 를 본 예에서는 직접 입력하였다. 이후 Optimizer 와 Callbacks 관련 2줄만 각각 model compile 과 model fit 전에 수행해 주면 된다.</li>
</ol>
</ol>
<li>Horovod 를 이용한 Multi Host Scale Out 성능비교</li>
<ol>
<li>Node 1개</li>
<ol>
<li>Jupyter 를 통해 Azure Batch AI 클러스터 위로 Training Job 을 구동하였다.</li>
<li><a href="https://1.bp.blogspot.com/-AXADldjqisQ/WldNKXUm7ZI/AAAAAAAAGmo/3qTFGyPv4h8zz2kYPQo3oo9E-sjG_BGNgCLcBGAs/s1600/horovod%25EC%2584%25B1%25EB%258A%25A51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="972" data-original-width="1378" height="450" src="https://1.bp.blogspot.com/-AXADldjqisQ/WldNKXUm7ZI/AAAAAAAAGmo/3qTFGyPv4h8zz2kYPQo3oo9E-sjG_BGNgCLcBGAs/s640/horovod%25EC%2584%25B1%25EB%258A%25A51.png" width="640" /></a></li>
<li>Node 1개에서 166초가 소요되었다. </li>
</ol>
<li>Node 2개</li>
<ol>
<li>Node 2개 에서 멀티 Host 모드로 수행하자 아래처럼 로그가 2번씩 찍힌다.</li>
<li><a href="https://1.bp.blogspot.com/-2XfpIsCYUmg/WldNxkjCt0I/AAAAAAAAGms/w8Phlc0acbc_0GAxCWxz-DCi1dZIKJyeACLcBGAs/s1600/horovod%25EC%2584%25B1%25EB%258A%25A52-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="744" data-original-width="1309" height="362" src="https://1.bp.blogspot.com/-2XfpIsCYUmg/WldNxkjCt0I/AAAAAAAAGms/w8Phlc0acbc_0GAxCWxz-DCi1dZIKJyeACLcBGAs/s640/horovod%25EC%2584%25B1%25EB%258A%25A52-1.png" width="640" /></a></li>
<li><a href="https://3.bp.blogspot.com/-MMV_2cgDQAk/WldOfCOCjtI/AAAAAAAAGm4/nEYKVuEFJN0J1xH0Yg5deVSfkyTMdI4pACLcBGAs/s1600/horovod%25EC%2584%25B1%25EB%258A%25A52-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="613" data-original-width="1312" height="298" src="https://3.bp.blogspot.com/-MMV_2cgDQAk/WldOfCOCjtI/AAAAAAAAGm4/nEYKVuEFJN0J1xH0Yg5deVSfkyTMdI4pACLcBGAs/s640/horovod%25EC%2584%25B1%25EB%258A%25A52-2.png" width="640" /></a></li>
<li>Horovod Cluster Size 가 2가 되자 initial epoch가 200 이었지만, 각 노드별 병렬 epoch 는 100으로 줄었다.</li>
<li>143초로 수행시간이 단축 되었다.</li>
</ol>
<li>Node 4개</li>
<ol>
<li>Horovod 는 계속 NC6 으로도 병렬 확장 테스트가 가능하나, Keras Scale Up 과의 비교를 위해 , 이 시점에 NC12로 바꾸었다. 왜냐하면, Scale Up 의 경우 NC6 은 GPU 2개 까지밖에 지원하지 않아서, GPU 4개를 테스트하는 시점 NC12로 바꾸었었기 때문이다. </li>
<li>동일한 테스트를 위해 이시점은 NC12 이미지 4대에서의 테스트 이다. 각 멀티 노드에서 GPU 는 1개씩만 사용하였다.</li>
<li>즉, 4 Host * 1 GPU = 4GPU 환경이다.</li>
<li><a href="https://1.bp.blogspot.com/-MJftEoWyFnI/WldPbFBa34I/AAAAAAAAGm8/_6tPffjdF3k44FO0mJyGNaB2tLiqZVcHACLcBGAs/s1600/horovod%25EC%2584%25B1%25EB%258A%25A53-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="654" data-original-width="1293" height="322" src="https://1.bp.blogspot.com/-MJftEoWyFnI/WldPbFBa34I/AAAAAAAAGm8/_6tPffjdF3k44FO0mJyGNaB2tLiqZVcHACLcBGAs/s640/horovod%25EC%2584%25B1%25EB%258A%25A53-1.png" width="640" /></a></li>
<li>예상했던 것처럼 로그가 4번씩 나오고 있다.</li>
<li><a href="https://4.bp.blogspot.com/-tUXW9lyfhhs/WldQIC9dq2I/AAAAAAAAGnM/RIBnGEt5t-ofy_03CSMqhLR5jVOoAfzDQCLcBGAs/s1600/horovod%25EC%2584%25B1%25EB%258A%25A53-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="581" data-original-width="1274" height="290" src="https://4.bp.blogspot.com/-tUXW9lyfhhs/WldQIC9dq2I/AAAAAAAAGnM/RIBnGEt5t-ofy_03CSMqhLR5jVOoAfzDQCLcBGAs/s640/horovod%25EC%2584%25B1%25EB%258A%25A53-2.png" width="640" /></a></li>
<li>수행속도는 89초로 줄어 들었다.</li>
</ol>
</ol>
</ol>
<div>
<b><u style="background-color: yellow;">[결론]</u></b></div>
<div>
<b><u style="background-color: yellow;"><br /></u></b>
<span style="background-color: white;">Keras 의 Scale Up과 Horovod 의 Scale Out 모두 Epoch 를 나눠가졌다. 이런 양상은 TensorflowOnSpark 와는 조금 다른 양상이다. TensorflowOnSpark 는 Epoch 를 나눠갖지 않고, Multi Node 의 Multi Job 들이 Mini Batch 를 1/N 로 나눠 갖는다. 각 특성이 갖는 양상에 따른 차이도 그 차이점을 고려해볼만 한 주제인듯 하다.(향후 시간이 허락한다면 이 부분도 파 보도록 하겠다.)</span><br />
<span style="background-color: white;"><br /></span>
<span style="background-color: white;">우선 오늘 실험해본 내용의 종합 결과는 아래와 같다.</span><br />
<b><u style="background-color: yellow;"><br /></u></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-Hu_1L-1ARVU/WldXSyXak5I/AAAAAAAAGnY/-Qufjtsa6086x9Tz3VCH6FDcGE-vt1jkgCLcBGAs/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="617" data-original-width="1040" height="378" src="https://3.bp.blogspot.com/-Hu_1L-1ARVU/WldXSyXak5I/AAAAAAAAGnY/-Qufjtsa6086x9Tz3VCH6FDcGE-vt1jkgCLcBGAs/s640/4.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<span style="background-color: white;">앞에서도 언급 했던 것처럼 Keras 를 사용하면, Tensorflow Backend 의 GPU Scale Up 은 우선 매우 매우 쉽다. 성능 또한, 기본적인 initial time 을 제외 하고는 어느정도 선형적인 증가를 보여 준다. 좀 더 특이한 양상이 발견되었던 점은, (적은 양의 데이타에서 특히) GPU 갯수가 늘어나자 좀더 성능이 빨리 좋아지는 양상이 발견되었다는 점이다. 이는 앙상블 효과 처럼 보인다. 그리고, 마치 가끔 Mini Batch Size 를 키웠더니, 정확도가 오히려 개선되었을 때와 비슷한 양상이다.(일반적으로 그 반대가 더 많지만...) </span><span style="background-color: white;">모든 weight 의 실시간 공유가 꼭 좋은것 만은 아니다. 4개의 독립적인 GPU 가 어느정도는 독자적인 local minigma 를 찾고, 각 GPU 가 1번씩 epoch 가 끝났을때, 지연 동기화를 하게 되면, local minigma 에 빠질 확률이 훨씬 줄어들기 때문에, 분산 지연 weight 동기화가 오히려 training 에 긍정의 효과를 준 것으로 보여진다.</span></div>
<div>
<span style="background-color: white;"><br /></span></div>
<div>
<span style="background-color: white;">Horovod 를 통한 Scale Out 형태의 GPU 확장은 예상 했던 것 처럼, Scale Up 모드보다는 무거운 연산임이 실험을 통해서도 확인 되었다. 노드 갯수가 작을때에는 Single Node 의 멀티 GPU 보다 더 느린 양상을 보였다. 이는 노드갯수가 4개 정도로 늘어나면 큰 차이가 나지 않는다. (<b><u>이 곳에 언급하진 않았지만, 노드 갯수가 많아질수록 성능은 역전된다</u></b>.) 즉, Horovod 시나리오는 좀더 BigData Scale Deep Learning 에 가깝다. </span></div>
<div>
<span style="background-color: white;"><br /></span></div>
<div>
<span style="background-color: white;">Production 시스템에서 Training Data 가 쌓이고, 그 크기가 점점 커지기 시작하면, 점점 training 전에 전처리 단계에서 부터, 1대 머신의 물리 Disk 를 모두 동원해도 감당이 안될 정도로 Data가 커지는 경우가 있다. 이 경우 Scale Out 시나리오에서는 해당 노드에 간단하게 Hadoop 정도를 설치해주면, 데이타는 복수 Node 에 펼쳐져 저장되게 되고, Disk IO 는 분산되어, 훨씬 성능도 좋아진다. ( Tensorflow 의 공식 github 에는 이러한 경우를 위해hadoop 에 저장된 Training Data를 핸들링 할 수 있는 Hadoop Connector 유틸리티가 제공되고 있다. Spark Connector 도 있다. TensorflowOnSpark 는 내부적으로 해당 유틸리티를 활용하고 있다.) Data 의 크기는 크지 않지만, Disk IO 를 20~30배 이상 성능적으로 개선해보고자 할때는 Hadoop 대신에 해당 노드에 Spark 나 Tachyon (이름이 바뀌긴 했으나, original 이름으로 더 알려진) 이나, Apache ignite 를 설치하고 수행할 수도 있다.</span></div>
<div>
<span style="background-color: white;"><br /></span></div>
<div>
<span style="background-color: white;">위 실험에서도 알 수 있는것처럼, 데이타의 크기가 1대의 머신에 담을 수 있는 크기이고, GPU는 8개 미만만 사용해도 되는 수준이라고 한다면, Scale Up 이 더 유리하다. ( Deep Learning Infra 설계시 참고하기 바란다. 작은 데이타는 1Node 4GPU 가 1GPU 4Node 보다 성능이 더 좋음을 위해서 보여 준 바 있다.)</span></div>
<div>
<span style="background-color: white;"><br /></span></div>
<div>
<span style="background-color: white;">하지만, Scale Up 은 Nvidia 의 dependency 로 대부분의 Deep Learning 프레임워크들이 8개 까지만 지원하는 경우가 많다. 하지만, Scale Out 은 그런 한계를 극복 할 수 있다. </span><span style="background-color: white;">Horovod 는 그래서, 1대 Node 에 GPU 를 4개씩 꼳아서 8대를 클러스터로 묶어서 수행하는 경우 Scale Up 과 Scale Out 의 성능을 동시에 활용할 수 있다. 즉, 그 경우 4*8 = 32개 GPU 를 사용할 수 있다. Keras 는 8개가 한계 이지만, Horovod 그리고, Horovod + Cloud PaaS (본 실험에서는 이 부분을 Azure batch AI 를 이용했다.) 를 사용하는 경우 수백대 이상 까지도 Node 및 GPU를 동원하여, 분산 Training 의 장점을 몇번의 클릭으로 수행 해 볼 수 있다.</span></div>
<div>
<span style="background-color: white;"><br /></span></div>
<div>
<span style="background-color: white;">Keras 는 1줄 코드 수정으로 Scale Up 이 되었지만, Horovod 는 6~8 줄 정도의 수정이 필요하였다. 하지만, 익숙해지면, 1분안에 적용 가능한 수준이었다. 때문에, </span><u style="background-color: yellow;">개</u><u style="background-color: yellow;">발생산성 향상은 검증되었다고 본다.</u><br />
<br />
<span style="background-color: white;">Horovod 의 위키에는 다양한 Horovod 성능 수치 비교자료들이 존재한다. 아래는 그중에 어떤 사용자의 경험을 보여주는 성능비교 수치이다. Scale Out 이 아닌 Scale Up 의 경우에도 8개 GPU 이상일때는 Horovod 방식이 성능이 더 잘 나오는 것을 표현해주고 있다. 내가 했던 실험 데이타 또한 처음에는 Horovod 가 느리다가 Node 4개를 기점으로 역전되는 모양을 보여주었었다.</span></div>
<div>
<span style="background-color: white;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-nDyMRdnwf-c/WlddafPIuVI/AAAAAAAAGno/hJ6mPPYt79Q75tot6f_gwsvzu_Gl2hW6QCLcBGAs/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="104" data-original-width="792" src="https://4.bp.blogspot.com/-nDyMRdnwf-c/WlddafPIuVI/AAAAAAAAGno/hJ6mPPYt79Q75tot6f_gwsvzu_Gl2hW6QCLcBGAs/s1600/5.png" /></a></div>
<div>
<span style="background-color: white;">Scale Out 부분에 있어서도, 대부분의 벤치마크 자료나, 대다수의 비교 자료에서 Horovod 는 Tensorlfow 에서 자체적으로 제공하는 Parameter Server 를 활용한 방식 보다, 수행 속도 측면에서 성능이 더 잘 나오는 것을 확인 해 볼 수 있다.</span><br />
<u><br /><span style="background-color: yellow;">즉, 성능 적인 개선도 검증되었다고 여겨진다.</span></u><br />
<u><br /><b style="background-color: yellow;">개발이 훨씬 쉬워지면서 성능이 뒤쳐지지 않는다면... 아키텍처링 입장에서는 마다할 이유가 없다.</b></u></div>
<div>
<span style="background-color: white;"><br /></span></div>
<div>
<span style="background-color: white;"><br /></span></div>
<ol><ol><ol>
</ol>
</ol>
</ol>
</div>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com3tag:blogger.com,1999:blog-8166686140676460430.post-17942333298989116712018-01-03T01:37:00.002+09:002018-01-08T17:09:21.365+09:00Deep Learning Multi Host & Multi GPU Architecture #1 - 고찰 및 구성 with tensorflow, cntk, keras, horovod, Azure Batch AI지난번 Deep Learning Serving Layer 아키텍처 수립을 위한 고찰(<a href="http://hoondongkim.blogspot.kr/2017/12/deep-learning-inference-serving.html">http://hoondongkim.blogspot.kr/2017/12/deep-learning-inference-serving.html</a>) 이후 , 이번에는 Deep Learning Training Layer 아키텍처 수립에 대하여도 고찰해 보았다.<br />
<br />
아키텍처 수립에서 고려한 주요 주안점은 다음과 같다.<br />
<br />
<ol>
<li>Training 은 Fine Tuning 이 이루어지는 주기적인 Batch Training 이 있을 수 있고, 시시각각 혹은 실시간으로 수행후 바로 반영될 필요가 있는 RealTime & Online Training 이 있을 수 있다. </li>
<ol>
<li>Online Training 은 Fine Tuning 을 하는 시나리오는 아니지만, 기존의 Fine Tuning 된 weight 값을 불러 들여, 빠르게 변경분에 대하여 반영하는 로직이다.</li>
<li>이 경우 부분적으로 해당 Data 로 약간의 overfit 이 발생될 소지는 있다. 하지만, 변경분 Data 는 크기가 매우 작고, 변경 분 Data 의 왜곡을 최소화 하기 위해 일정량의 랜덤 sampling 데이타를 전 class 에 대하여 부분 추출후 섞어 주는 기법을 사용, 왜곡 현상을 줄일 수 있다.</li>
<li>RealTime Training 시나리오를 Production 에 반영하는 경우 가장 중요한 고려 점은 </li>
<ol>
<li>긴급한 Training 변경 요건을 빠르게 수행하여 운영중 모델에 적용할 수 있는가? 그리고,</li>
<li>다수의 Model 관리 Operator 가 실시간적으로 Training Data 를 손보는 경우 이를 받아들일 만큼 시스템이 유연한가? 일 것이다. </li>
</ol>
</ol>
<li>우리가 구상하는 시스템은 BigData Scale Data 를 포함하고 있다. 1대의 GPU 로는 Disk 에 담기 힘든 규모의 Large Scale Data 로 확장 가능하다.</li>
<li>주기적으로 수행되는 다수의 Deep Learning 모델이 Pipe Line 을 통해 구성될 수 있으며, 일정 시간안에 모두 완료되어야 한다.</li>
<li>일시적으로 Deep Learning 모델 프로젝트가 다수개 동시 수행되는 경우 On-Premise GPU 리소스 로는 부족한 경우도 있다. Production Batch Training 을 위해 구성한 GPU 클러스터 시스템은 내부 모델 개발의 유연한 확장에도 활용가능 했으면 한다.</li>
<li>Multi GPU 그리고 Multi Host 를 지원하는 Deep Learning 모델을 만드는 것은 불가능하지 않지만, Tensorflow 에서는 너무 Low level 접근이 필요하고, Keras 에서는 한계가 크다. GPU Cluster 가 그런 부분을 프레임워크 레벨에서 보완해주는 아키텍처가 필요하다. (예, BigDL , TensorlfowOnSpark , Horovod , Azure Batch AI ...) 예를 든 솔루션에 대하여 뒷 부분에서 설명토록 하겠다.)</li>
</ol>
<div>
위 4번, 5번 때문에, 우리는 경험상 On-premise 보다는 Cloud 에 GPU 리소스가 존재하길 원했다. 프로젝트 시작 초기에는 모델개발에 굉장히 많은 GPU 리소스가 필요하다. 운영중에는 오픈 초기 여러번의 on-line Training 이 운영자에 의해 시시각각 수행될 수 있으며, 매 새벽 배치를 통해 fine tuning 배치가 수행될 필요도 있다. 이 경우 GPU 1대 혹은 1대의 single 머신에서 모델이 Training 되는 경우 최고의 성능에 도달하기 까지 매우 많은 시간이 소요 될 수도 있을 것이다.</div>
<div>
<br /></div>
<div>
이러한 이유로 우리는 아래와 같은 환경을 고려하게 되었다.</div>
<div>
<ol>
<li>운영상의 효율성. 안정성. 모델개발 시점의 시간 및 투자비용 Save 를 위해 Cloud GPU 인프라가 효율적이다.</li>
<li>BigData Scale Data 를 통한 Training 및 빠른 Training 퍼포먼스를 위해 GPU Cluster 구성이 필요하다.</li>
<li>GPU 클러스터는 다양한 Deep Learning 프레임워크를 지원해야 한다.</li>
<ol>
<li>우리가 사용하는 Deep Learning 프레임워크는 다음과 같다.</li>
<ol>
<li>Tensorflow</li>
<li>Keras</li>
<li>CNTK</li>
</ol>
</ol>
<li>다수의 Operator 가 관리자 페이지에서 online Training 을 동시에 여러 Job 을 수행 시킬때, 혹은 다수의 Deep Learning 모델러가 복수의 Job을 수행할때, 유연하게 자사의 GPU 클러스터가 반응할 수 있는 플랫폼이 필요했다.</li>
</ol>
<div>
우리는 이를 위해 최종 적으로 다음과 같은 사전 시스템을 구성 및 테스트 해 본 적이 있다.</div>
</div>
<div>
<ol>
<li>Hadoop + Spark + BigDL</li>
<ol>
<li>Data Pre Processing 에 강점이 크며, 기존 Machine Learning 배치와도 잘 결합 가능하다.</li>
<li>기존의 Spark Job 과 한몸처럼 구성이 가능하다.</li>
<li>BigDL 이 아직은 구현된 모델이 많지 않다는 가장 큰 단점이 존재한다. 속도도 GPU 클러스터 보다는 떨어진다. </li>
<li>내부에 기존 BigData 클러스터가 충분히 많고 Spark 를 중요 Machine Learning 개발 도구로 사용하는 경우 활용할 가치가 있다. (참고로 BigDL 은 Intel 이 주도하는 Open Source 이며, Spark 에 내장 라이브러리 처럼 활용 가능하다.)</li>
<li>이 시스템은 이미 On Premise 에 구축하여 일부 모델의 검증에 활용하고 있다. 하지만 최종 시스템으로 선정하지는 않았다.</li>
<li>이 시스템에 대한 경험은 아래에 블로그 했었다.</li>
<li><a href="http://hoondongkim.blogspot.kr/2017/08/deep-learning-text-nlp-with-spark.html">http://hoondongkim.blogspot.kr/2017/08/deep-learning-text-nlp-with-spark.html</a></li>
</ol>
<li>Hadoop + Spark + tensorflowOnSpark</li>
<ol>
<li>위 장점을 수용하면서 Tensorflow 를 사용할 수 있다.</li>
<li>BigDL 과 달리 CPU 뿐 아니라 GPU 도 사용 가능하다.</li>
<li>Tensorflow 에서 Multi GPU, Multi Host 병렬 확장을 10줄 미만의 간단한 코드 수정으로 수행할 수 있다.</li>
<ol>
<li>VGG, inception 등 널리 알려진 모델은 이미 multi gpu 및 multi host 지원이 내장 구현되어 있다. 이런 경우는 tensorflow 만 쓰거나, 혹은 high level api 를 쓰더라도 큰 문제가 되지 않는다.</li>
<li>그러나, 대부분의 custom 모델이거나, 특히 RNN, LSTM 의 수많은 공개된 변종 알고리즘들은 병렬성이 구현된 구현체들이 거의 존재하지 않는다.</li>
<li>이를 직접 병렬성 구현해 주는 것은 매우 지난한 작업이다.</li>
<li>즉, tensorflowOnSpark (made By Yahoo) 는 이런 부분을 보완해 주는 Deep Learning 확장 도구이다.</li>
<li>이 시스템은 또한 On Premise 에 구축하여 Tensorlfow 모델의 일부 검증에 활용한 바 있다. 하지만 Main Production 시스템으로 선정하지는 않았으며, Dev 및 모델링 시점에 활용하는 용도로만 사용중이다.</li>
<ol>
<li>가장 큰 이유는 내부에 CPU 클러스터는 수천 코어 동원이 가능하지만, GPU 클러스터는 리소스가 부족하기 때문이다.</li>
<li>Cloud 에 구성하기에도 Hadoop 및 Spark 디펜던시, 그리고, Legacy 가 Tensorlfow 보다도 훨씬 무거워, 유연한 시스템으로 사용하기에는 다소 Over Spec 인 느낌이 커보였다.</li>
</ol>
<li>이 시스템을 아직 Production 으로 사용하지 않는 가장 큰 이유는 Keras 가 아직 완벽하게 지원되지 않고 있다는 점이다. 우리는 많은 모델을 빠르게 실험해보고 적용해 보기 위해 Keras 를 상당한 비중으로 사용중에 있다.</li>
<ol>
<li>논문 쓸 목적이 아니라면, 그리고, Agile 한 Deep Learning Approach 를 위해서는 Keras 는 최고의 툴이다. </li>
</ol>
<li>이 시스템에 대한 경험 그리고 세팅 방법은 아래에 블로그 했었다.</li>
<li><a href="http://hoondongkim.blogspot.kr/2017/09/bigdata-distributed-deep-learning.html">http://hoondongkim.blogspot.kr/2017/09/bigdata-distributed-deep-learning.html</a></li>
</ol>
</ol>
<li><b><u style="background-color: yellow;">Tensorflow + Keras + CNTK + Horovod + Azure Batch AI</u></b></li>
<ol>
<li> <b><u>최종 아키텍처로 선정한 시스템이다.</u></b></li>
<li>TenosrlflowOnSpark 와 마찬가지로 CPU 와 GPU 모두 사용 가능하다.</li>
<li>Production 용 배치 프레임워크의 아키텍처로 더 적당하다.</li>
<ol>
<li>즉, 모델 개발 및 Dev 시스템은 꼭 이 구성일 필요는 없다. 아니, Dev 시스템은 이 구성이 오히려 개발 생산성에 저해가 될 수 있다.</li>
<li>Dev 에서는 위 1,2가 사용될 수 있다.</li>
<li>모델 개발 시점에는 Cluster 보다 Scale Up된 High End 장비 혹은 GPU VM이 더 편할 수 있다. </li>
<li>단, 다양하게 하이퍼 파라미터를 실험 적용해보는 단계에서는 Scale Out 가능한 이 구성이 더 유리하다.</li>
</ol>
<li>앞 4개는 Open Source Deep Learning 도구들이며 각각 장단점이 있고, 때로는 보완 도구로서 함께 사용해야 한다.(특히 Keras)</li>
<li>CNTK 는 보완 및 대체제로 경우에 따라 사용이 가능하다. CNTK 는 Keras 환경에서 기존의 Keras Source Code를 거의 수정하지 않고(우리의 Production 코드는 1~2줄 미만의 수정으로, 때로는 0줄 수정으로 가능하였다.) Backend 를 Tensorlfow 에서 CNTK 로 바꾸어 모델마다 선별적으로 선택하여 사용할 수 있다. 그리고, 다음과 같은 장점이 있다.</li>
<ol>
<li>Keras 와 함께 사용시 기존 코드를 그대로, CNTK 적용이 가능하다.</li>
<li>RNN 계열에서 Tensorflow 보다 빠르다고 알려져 있다.</li>
<li>대부분의 병렬 Deep Learning 수행에 있어, 훨씬 적은 노력으로 확장이 가능하다.</li>
</ol>
<li>Horovod 는 Uber 가 만든 Deep Learning 분산 프레임워크로 Tensorflow 와 Keras 를 지원한다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-qNdopWcQAnA/Wku1L2ZXfZI/AAAAAAAAGkY/TGSHQjLC5_E0pC_l3nzBrHS6yU4PGcukACLcBGAs/s1600/horovod_benchmark.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="442" data-original-width="1028" height="274" src="https://2.bp.blogspot.com/-qNdopWcQAnA/Wku1L2ZXfZI/AAAAAAAAGkY/TGSHQjLC5_E0pC_l3nzBrHS6yU4PGcukACLcBGAs/s640/horovod_benchmark.png" width="640" /></a></div>
<ol>
<li>Tensorflow 및 Keras 의 Low Level 코드 접근 없이 Multi GPU , Multi Host 사용이 가능하다.</li>
<li>위는 BechMark 자료이다.</li>
</ol>
<li>Azure Batch AI</li>
<ol>
<li>Azure 가 제공하는 Deep Learning 프레임워크의 병렬 확장 및 Auto Scale Out 을 지원하는 PaaS 이다.</li>
<li>Tensorflow , keras, cntk , horovod(Manually) 등을 지원한다.</li>
<li>CNTK 를 Backend 로 사용 시 병렬확장성에 대한 Code 접근을 추상화 할 수 있다.</li>
<ol>
<li>즉, 이 때문에 tensorflow + keras 코드를 CNTK + keras 코드로 수정한 후, 이를 Azure Batch AI 에 호스팅 하는 경우 Auto Scale Out 의 장점을 극대화 할 수 있다.</li>
<li>모든 것이 Compute Parallel 이 되지는 않을 수 있다.(Horovod 와는 다른 방식이다.) 모델에 따라 Data Parallel 만 될 수도 있다는 의미이며, 이 부분에 대해서는 추후 좀더 실험을 해볼 예정이다.</li>
</ol>
<li>Tensorflow + Horovod + Azure Batch AI 구성 시 native tensorflow 코드를 Low Level 코드 접근 없이 multi Gpu, multi host 확장이 가능할뿐 아니라 Auto Scale Out 이 가능하다.</li>
<li>비용에 대한 Limit 을 위해 Min Node 수와 Max Node 수 설정이 가능하다.</li>
<li>하나의 Job 의 확장 뿐 아니라, 복수 GPU 클러스터 Node 에 복수의 Deep Learning Job 을 분배 및 할당하는 Cluster 로도 활용 가능하다.</li>
<li>이는 Production 용 Training 시스템 뿐 아니라, 다수의 Deep Learning Model 개발자들이 있는 경우 모델 개발이나 하이퍼파라미터의 빠른 튜닝을 위해서도 활용 가능한 시스템 이다.</li>
</ol>
</ol>
</ol>
<div>
<br /></div>
</div>
<div>
여기서부터는 위 최종 선정 시스템을 이용 실제 Production 용 Legacy Deep Learning 모델을 Azure Batch AI 위에서 병렬 구동한 모습이다.</div>
<div>
<br /></div>
<div>
<ol>
<li><b><u style="background-color: yellow;">Tensorlfow + Keras 로 작업된 Legacy 코드를 CNTK + Keras + Azure Batch AI 로 포팅하여 Multi Host + Multi GPU 로 수행한 화면.</u></b></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-7kqdmfVBFYw/WkuwLUjStYI/AAAAAAAAGkA/k2u2EURonTo6N-cHfzchz_axD0k_jrFYQCLcBGAs/s1600/cntk_keras.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="787" data-original-width="1261" height="398" src="https://1.bp.blogspot.com/-7kqdmfVBFYw/WkuwLUjStYI/AAAAAAAAGkA/k2u2EURonTo6N-cHfzchz_axD0k_jrFYQCLcBGAs/s640/cntk_keras.png" width="640" /></a></div>
<li><b><u style="background-color: yellow;">Tenosrflow + Keras 로 작업된 Legacy 코드를 Tenosorflow + Keras + horovod + Azure Batch AI 로 포팅하여 Multi Host + Multi GPU 로 수행한 화면.</u></b></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-TbhJxiGAh7Q/WkuxM8xJs4I/AAAAAAAAGkI/LCeVt8mKUHwDRbrpsMBmd4wnjzpqsvJoACLcBGAs/s1600/horovod1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1000" data-original-width="1296" height="492" src="https://2.bp.blogspot.com/-TbhJxiGAh7Q/WkuxM8xJs4I/AAAAAAAAGkI/LCeVt8mKUHwDRbrpsMBmd4wnjzpqsvJoACLcBGAs/s640/horovod1.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-6fcci7G4axw/WkuxRe3U5HI/AAAAAAAAGkM/8jf1iZsbqy4PGyzMBF9Lba0vPCGaMgXhwCLcBGAs/s1600/horovod2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1000" data-original-width="1296" height="492" src="https://1.bp.blogspot.com/-6fcci7G4axw/WkuxRe3U5HI/AAAAAAAAGkM/8jf1iZsbqy4PGyzMBF9Lba0vPCGaMgXhwCLcBGAs/s640/horovod2.png" width="640" /></a></div>
<li>수행 이후 수행 결과를 PaaS 상에서 확인</li>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<ol>
<li>수행결과</li>
<ol>
<li><a href="https://1.bp.blogspot.com/-4tw30ikJKro/WkvNRm_g2JI/AAAAAAAAGko/jAP8aD5BfEMkgVSFcbBzOUl0xejOYUsjwCLcBGAs/s1600/complete.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="984" data-original-width="1280" height="492" src="https://1.bp.blogspot.com/-4tw30ikJKro/WkvNRm_g2JI/AAAAAAAAGko/jAP8aD5BfEMkgVSFcbBzOUl0xejOYUsjwCLcBGAs/s640/complete.png" width="640" /></a></li>
</ol>
<li>클러스터 모니터링</li>
<ol>
<li><a href="https://3.bp.blogspot.com/-H9UBcn5QOkQ/WkvO1coAM3I/AAAAAAAAGk0/HcQ93tk0UaIyWEcYkP7e82d63e-wB7JVQCLcBGAs/s1600/complete2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="663" data-original-width="1137" height="372" src="https://3.bp.blogspot.com/-H9UBcn5QOkQ/WkvO1coAM3I/AAAAAAAAGk0/HcQ93tk0UaIyWEcYkP7e82d63e-wB7JVQCLcBGAs/s640/complete2.png" width="640" /></a></li>
</ol>
</ol>
</ol>
<div>
<b><u style="background-color: yellow;"><br /></u></b>
<b><u style="background-color: yellow;">[결론]</u></b></div>
</div>
<div>
<br /></div>
<br />
<br />
<div>
위 처럼 Tensorflow + Keras 로 작성된 Legacy Deep Learning Training 코드는 코드 수정을 거의 하지 않고, Single GPU 에서만 돌던 코드가 Azure Batch AI 위에서 Mulit GPU 와 Multi Host 로 병렬 구동됨을 확인 하였다.</div>
<div>
<br /></div>
<div>
위를 위해서 CNTK + Keras + Azure Batch AI 환경에서는 Legacy 코드를 단 1줄도 수정하지 않고, Backend 설정만 Tensorflow 에서 CNTK 로 변경하여 Azure Batch AI 위에서 병렬 수행됨을 확인 하였다.</div>
<div>
<br /></div>
<div>
하지만, 모든 Legacy 코드가 Keras 코드로만 구성된 것은 아니다. Keras 가 지원하지 않는 최신의 기법을 사용하는 경우. (예를 들어 2017년 여름경 까지 Keras 는 LSTM 에 Attention 을 포함하는 것을 지원하지 않았었다.) Tensorlfow 코드와 Keras 코드가 섞여 사용하는 경우가 실제로 우리의 경우도 존재 한다.</div>
<div>
<br /></div>
<div>
때로는 github 에 구현체가 공개된 잘짜여진 open source 코드가 keras 가 아닌 tensorflow 로만 구성된 코드일 수도 있다.</div>
<div>
<br /></div>
<div>
이를 위해 우리는 Horovod 를 이용한 Multi Host + Multi GPU 구동도 함께 테스트 했었다.</div>
<div>
Tensorflow + Keras + Horovod + Azure Batch AI 구성은 그러한 시나리오를 위한 추가 확장 환경 구성이었다.</div>
<div>
<br />
tensorflow + Keras + Horovod + Azure Batch AI 환경에서는 기존 Legacy 코드를 약 4~5 줄 정도를 추가하고, 2줄 정도를 변경하였으며, 변경을 하는데 들어간 시간은 최초 작업이었을 때에도 3~5분 미만으로 매우 쉬운 편이었다. 익숙해지면, 1~2분 안에 코드 수정이 가능한 수준이다.<br />
<br />
단, CNTK + Keras + Azure Batch AI 와는 다르게, tensorflow + Keras + Horovod + Azure Batch AI 는 공식 github 에 example 도 존재하지 않으며, 다소 초기 세팅시 Debug 후 수동 설정 변경 사항이 많이 필요하였다.( 최초에 한번만 수행해주면 된다. ) 이 복잡한 초기 세팅 부분은 별도로 블로깅 예정이다 . 해당 부분을 따라한다면 어렵지 않게 Legacy 코드를 수행할 수 있을 것이다.<br />
<br /></div>
<div>
이번 블로깅에서는 고찰 및 구성 결론 만 다루었다. 다음 연재에서는 실제로 구성하는 방법과 구성 과정에서 구성을 debug 하는 방법, trouble shutting 하는 방법에 대하여 다루도록 하겠다.</div>
<div>
<br /></div>
<div>
연재 순서는 다음과 같다.</div>
<div>
<br /></div>
<div>
연재 1. 이번글.</div>
<div>
<br />
연재 2. Deep Learning Multi Host & Multi GPU Architecture #2 - Keras 를 이용한 Scale Up, Horovod 를 이용한 Scale Out 성능 비교<br />
<br /></div>
<div>
연재 3. CNTK + Keras + Azure Batch AI 구성 방법</div>
<div>
<br /></div>
<div>
연재 4. Tensorlfow + Keras + Horovod + Azure Batch AI. Mnist 간단 버전 구성 설정 방법</div>
<div>
<br /></div>
<div>
연재 5. Tensorlfow + Keras + Horovod + Azure Batch AI. Legacy Code Advanced 버전 구성 설정 방법.</div>
<div>
<br /></div>
<div>
연재 6. Azure Batch AI 를 이용한 Custom Deep Learning 모델 구동 시 Trouble Shutting 을 좀더 쉽게 하는 방법.</div>
<div>
<br /></div>
<div>
</div>
<div>
<br /></div>
<br />
<ol>
</ol>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-26946927559962912542017-12-27T01:34:00.003+09:002017-12-27T02:18:10.536+09:00Deep Learning Inference & Serving Architecture 를 위한 실험 및 고찰 1 - GPU vs CPU최근 Production을 위한 Deep Learning Serving 레이어의 아키텍처를 구성하기 위해 몇가지 실험을 했던 내용을 정리해 보았다. 몇번에 걸쳐 연재 될 수 있을 듯 한데...<br />
<br />
우선 오늘의 주제는 <b><u>Inference 에 있어서도 정말 GPU 가 CPU보다 유리한가? (결론이 유추 되는가???)</u></b><br />
<br />
<br />
아키텍처를 구성함에 있어, 다양한 Use Case 가 있을 수는 있으나, 정답이 존재하지는 않는다고 생각한다. 다양한 비지니스로직, 데이타의 양이나 성격, 사용하는 기술들, 개발 언어, 목적하는 바, 동시접속자 수, On-premise , Cloud 여부 등에 따라 다양한 조합이 있을 수 있을 것이고, 각각이 장단점이 존재할 것이기 때문이다.<br />
<br />
여러 참고 자료로 사전 조사를 해본것은 사실이지만, 우리의 Deep Learning 모델과 우리의 데이타, 우리의 로직으로 후보 아키텍처에서 직접 실험을 하고 아키텍처를 확정하고자 아래와 같은 실험을 진행하였다.<br />
<br />
실험에 앞서, 주안점은 다음과 같다.<br />
<br />
<ol>
<li>우리는 Keras , Tensorflow (일부 CNTK) 등의 Deep Learning Framework 로 만들어진 Deep Neural Network 모델을 이용, 대국민 서비스를 준비하고 있다.</li>
<li>다수의 동접이 있을 수 있고, 이벤트나 행사 여부, 광고 및 홍보 여부에 따라, 트래픽이 매우 가변적일 수 있고, 다수의 동접 및 다수의 inference 가 일어날 수 있다.</li>
<li>많은 동접의 경우에도 응답은 1초 이내를 목표로 한다.</li>
<li>Deep Learning 모델은 RNN, LSTM 류와 간단한 류의 CNN 이 주를 이룬다.(우리의 모델은 vgg, inception 류의 heavy CNN 은 아니다.)</li>
<li>우리의 모델이 특이한 점은 주기적인 Fine Tuning 과 시시 각각의 RealTime on-line Training 이 운영중인 Model 에 시시각각 이루어진다는 점이다. 이는 Serving Layer 설계에 있어 중요 고려 사항 중 하나인데, Serving 되는 모델의 Size 를 줄이고 응답 속도를 빠르게 하기 위한 알려진 기법들을 적용하는데 방해가 되는 요소이기 때문이다. </li>
<li>Tensorflow 의 Serving 은 써본 사람들은 알겠지만, Web Service 로 만들어 배포하기에는 몇가지 제약이 느껴진다. 이 실험은 Tensorflow Serving 전용 엔진을 통한 실험은 아니며, 보다 High Level 로 접근하여 Inference Layer 를 직접 구현했을 때의 실험이다.</li>
</ol>
일반적으로 Inference 전용 Model Optimization 을 할 때는 주로 아래의 방법들이 사용된다.<br />
<br />
<ol>
<li>check point 등 training 에서만 사용되는 operation 을 없앤다.</li>
<li>batch normalization ops 도 제거한다.</li>
<li>도달하지 않는 graph 영역 제거</li>
<li>Check Numeric 제거</li>
<li>각종 variable 값 들은 constant 로 바꾸어, 크기를 줄이고 속도를 빠르게 하며, Thread Safe 하게 변경한다.</li>
</ol>
<div>
위 기법들은 Model 이 Freezing 된 경우에 한하여서이다. realtime training 과 inference 가 동시에 일어나는 경우는 </div>
<div>
<ol>
<li>training model 과 inference model 을 분리하고, 지연 동기화 시키거나</li>
<li>둘을 하나로 가져가되 constant 화 하고 freezing 하는 것을 포기해야 한다.</li>
</ol>
</div>
<div>
위 둘의 중간도 가능할 수는 있다. Node 가 복수개인 경우 Training 중인 Node 가 잠시 Serving Node 에서 빠져 있는 경우가 그 경우에 해당 할 것이다. 후에 우리는 Serving Layer 에 있어, Auto Scale Out 가능한 Docker PaaS나 Microservice Serverless PaaS 를 중요 고려 요소로 낙점하고 추가적인 실험을 하였는데, (아마 이 연재가 좀더 계속되어진다면, 다시 상세하게 다루어 보도록 하겠다. ) 이 시나리오 에서는 Training Layer 와 Serving Layer 를 각각의 장점을 극대화 시키고, Model 파일의 경우만 지연 공유시키는 또다른 시나리오가 나올 수 있다.</div>
<div>
<br /></div>
<br />
우선 오늘 다룰 내용은 위에서 언급된 다양한 방법론의 첫단추로서, 우리 모델이 과연 CPU 에서 더 잘 inference 되는 지, GPU 에서 더 잘 inference 되는지 의 여부에 대하여 실험 해본 결과이다. (ps. 실험에서 사용된 모델은 실험용으로 실제 모델이 다소 단순화된 General Model 임)<br />
다수 동접 Inference 테스트 전 training 퍼포먼스 또한 실험한 결과를 함께 정리 하였다.<br />
<br />
[<b><u>1] 실험에 사용된 딥러닝 모델 및 모델 크기</u></b><br />
<br />
- 일반적인 Language Model 용 LSTM 모델<br />
- categorical_cross_entropy 사용<br />
- Top 1 분류 모델<br />
- Word Embedding Layer 차원 수 : 300차원<br />
- Total Parameter 수 : 80,656,435 개<br />
<br />
- [특이사항] Language Model 특성상 Total Parameter 에서 앞부분이 많은 부분 차지.<br />
- [특이사항] LSTM 이 번역등의 문제가 아닌 Text Classification 문제에 적용된 경우 이므로, 층이 복잡하지는 않음. 층을 복잡하게 하여도 성능 향상 없었음. 그러나, 일반적인 word2vec + cnn 보다는 3% 정도 성능 향상된 모델임.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-BEoIDHIUyPA/WkJZVBzDqQI/AAAAAAAAGZM/C0ZOxb7v230a5RJrhffvaF993eONZMmIwCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="61" data-original-width="246" src="https://1.bp.blogspot.com/-BEoIDHIUyPA/WkJZVBzDqQI/AAAAAAAAGZM/C0ZOxb7v230a5RJrhffvaF993eONZMmIwCLcBGAs/s1600/1.png" /></a></div>
<br />
<b><u>[2] 실험에 사용된 hyper parameter</u></b><br />
<br />
- epochs=4 , batch_size=64 , optimizer=adam<br />
- learning Rate=0.001, beta_1=0.9 , beta_2=0.999, epsilon=1e-8<br />
<br />
- [특이사항] CPU Training 은 GPU 와 달리 batch size 를 4096등 훨씬 큰 수치를 주어도 memory resource 고갈 에러가 발생하지 않음, drop out 이나 batch bormalize 를 적절히 쓰는 경우 batch size 를 크게 주는 경우, 정확도는 비슷한데, 더 빨리 Training 이 될 수 있음.<br />
- 즉, CPU vs GPU 트레이닝 퍼포먼스는 실무에서는 batch_size 를 달리 주어, CPU가 아래보다 더 빨리 응답하는 것도 가능하나, 동일 hyper parameter 값에 대한 성능 비교를 위해 아래에서는 동일 값으로 수행한 결과 이다.<br />
<div>
<br /></div>
<b><u>[3] 실험에 동원된 HW 장비 Spec</u></b><br />
<br />
- cpu : 12 vcore , 112gb Memory ( On Azure Cloud VM )<br />
- gpu : K80 GPU * 2개 , 12 vcore , 112GB Memory ( On Azure Cloud Data Science GPU VM ) (단, 모델 inference 시에는 1개 GPU 만 사용하여 실험하였음)<br />
<br />
<b><u>[4] Training Data 크기</u></b><br />
<br />
- training data row 수 : 1,649,415 건<br />
<br />
<b><u>[5] Training 속도 및 성능</u></b><br />
<br />
<br />
<ol>
<li>CPU Training Performance</li>
<ol>
<li>epoch1 : 23,790 초</li>
<li>epoch2 : 24,071 초</li>
<li>epoch3 : 24,026 초</li>
<li>epoch4 : 24,100 초</li>
<li><a href="https://1.bp.blogspot.com/-HIzXLfsKWdU/WkJc_gCV-UI/AAAAAAAAGZY/XCAU1V1rZlsUH4EXy5FbOMnRAHQ4m9QKQCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="148" data-original-width="906" src="https://1.bp.blogspot.com/-HIzXLfsKWdU/WkJc_gCV-UI/AAAAAAAAGZY/XCAU1V1rZlsUH4EXy5FbOMnRAHQ4m9QKQCLcBGAs/s1600/2.png" /></a></li>
</ol>
<li>GPU Training Performance</li>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<ol>
<li>epoch1 : 8,612초</li>
<li>epoch2 : 8,370초</li>
<li>epoch3 : 8,377초</li>
<li>epoch4 : 8,360초</li>
<li><a href="https://3.bp.blogspot.com/-zzcI69ROQZ8/WkJdw7gru9I/AAAAAAAAGZg/0RfK8gprCEkUcbzDMltueIOCzW-tujMqACLcBGAs/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="176" data-original-width="715" src="https://3.bp.blogspot.com/-zzcI69ROQZ8/WkJdw7gru9I/AAAAAAAAGZg/0RfK8gprCEkUcbzDMltueIOCzW-tujMqACLcBGAs/s1600/3.png" /></a></li>
</ol>
</ol>
<div>
<b><u>[6] Single Inference 성능</u></b></div>
<br />
<a href="https://1.bp.blogspot.com/-X4gtvXIIdlg/WkJebYMfGLI/AAAAAAAAGZs/SsdRlW15kiIFdpvCjBKW8hKKSxzcbEcrgCLcBGAs/s1600/4.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="273" data-original-width="665" src="https://1.bp.blogspot.com/-X4gtvXIIdlg/WkJebYMfGLI/AAAAAAAAGZs/SsdRlW15kiIFdpvCjBKW8hKKSxzcbEcrgCLcBGAs/s1600/4.png" /></a><br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
예상과 달리 CPU가 Wall Time 이 더 빠르다. Wall Time 은 벽걸이 시계 시간을 의미한다. 즉 실제, 걸린 시간이다. CPU 의 경우 user time 은 150에 육박하는 경우가 있는데, 그래도 wall time 은 일정하게 30에서 40 사이의 값을 보여준다. 여기에서 다음과 같은 가정을 해볼 수 있다. CPU 는 멀티코어를 써서 더 빠른가??</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>[7] Multiple Sequential Inference 성능</u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
이번에는 1개 Inference 가 아닌 1000번의 inference 를 sequencial 하게 (Not 병렬) 수행해보았다. 그리고, 위 (6)의 가정이 맞는지 cpu 및 gpu 의 usage 상황을 확인해 보았다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
사용된 코드도 아래에 참고로 넣어 보았다.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-c6893U5Sx4M/WkJgVl5xIxI/AAAAAAAAGZ4/i3yHu4WVluQg7yeIlsoTeUrx5uuNonQOACLcBGAs/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="619" data-original-width="946" src="https://2.bp.blogspot.com/-c6893U5Sx4M/WkJgVl5xIxI/AAAAAAAAGZ4/i3yHu4WVluQg7yeIlsoTeUrx5uuNonQOACLcBGAs/s1600/5.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-ScLgVsha_gg/WkJg8RJL0zI/AAAAAAAAGaA/QZSOlcmG8zIsuKxVwYAcIQ7cZJpQhFbUACLcBGAs/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="686" data-original-width="935" src="https://2.bp.blogspot.com/-ScLgVsha_gg/WkJg8RJL0zI/AAAAAAAAGaA/QZSOlcmG8zIsuKxVwYAcIQ7cZJpQhFbUACLcBGAs/s1600/6.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
1000번을 연속하여 serial 하게 수행해보자 위와 같은 속도가 측정되었으며, 평균을 내 보면, CPU는 20ms , GPU는 60 ms 정도가 걸렸다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
특이한점은 , 처음 예상과 비슷하게, CPU는 멀티코어를 쓰고 있고,(코어 전체를 쓰진 않았음, 위 스크린샷 시점에는 420% 정도가 동작하고 있음.), GPU 는 GPU 1번 코어만을 50~70% 정도 사용하고 있으며, CPU 는 1개 CPU만 100% 사용하고 있다는 점 이었다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
여기에서 한가지 의문이 생겼다. 그렇다면 혹시 CPU가 병목인가?</div>
<div class="separator" style="clear: both; text-align: left;">
그리고, 그렇다면, 혹시 위 코드에서 사용된 유일한 Pre Processing 인 Tokenizer 가 영향을 주고 있는 것인가?</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
그래서 위 실험에 사용된 코드에서 Tokenizer 전처리 Pre Processing 부를 1000번의 loop 바깥으로 빼보고 성능 향상 정도를 측정해 보았다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>[8] CPU 에서 Tokenizer 가 주는 영향</u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-A8oPdXGOU0c/WkJiga3pGDI/AAAAAAAAGaM/CCEs3AK6SHA1ZOBMjqnRKYWy9ELdI5ExgCLcBGAs/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="317" data-original-width="1190" src="https://1.bp.blogspot.com/-A8oPdXGOU0c/WkJiga3pGDI/AAAAAAAAGaM/CCEs3AK6SHA1ZOBMjqnRKYWy9ELdI5ExgCLcBGAs/s1600/7.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
위 처럼 CPU 실험에서는 Pre-Processing 영역인 Tokenizer 가 주는 영향은 5% 정도에 지나지 않았다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>[9] GPU에서 Tokenizer 가 주는 영향</u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-RcpfJrD09tQ/WkJlcPlJPKI/AAAAAAAAGac/3U_JJ8S5JUQgkCmXCLJLaet4ajz-9gyKwCLcBGAs/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="268" data-original-width="1118" src="https://4.bp.blogspot.com/-RcpfJrD09tQ/WkJlcPlJPKI/AAAAAAAAGac/3U_JJ8S5JUQgkCmXCLJLaet4ajz-9gyKwCLcBGAs/s1600/8.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both;">
GPU에서도 마찬가지로 Pre-Processing 부분이 주는 영향은 2% 정도에 지나지 않았다. %는 줄었고, 절대치는 비슷하다. 즉, CPU에서이든 GPU에서이든 Pre-Processing 은 CPU 를 이용하기 때문에 절대치는 비슷한것이 이치에 맞다.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
위 상황에서 CPU와 GPU 의 USAGE 도 확인해 보았다.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-bw-1OS_Ys7U/WkJmyDXorVI/AAAAAAAAGao/IraNAFW4SisZNCqHNfSq-F_J4NlR2DoYACLcBGAs/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="770" data-original-width="914" src="https://4.bp.blogspot.com/-bw-1OS_Ys7U/WkJmyDXorVI/AAAAAAAAGao/IraNAFW4SisZNCqHNfSq-F_J4NlR2DoYACLcBGAs/s1600/9.png" /></a></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
여전히 CPU 는 1Core 만 100% Full로 일하고 있고, GPU 는 50%에서 70%를 왔다갔다 하였다. 그러므로, CPU 는 전처리 때문이 아닐까 하는 가정은 False 라고 할 수 있을 것이다. 해당 가정에 대한 의문은 해소 되었다.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>[10] 이제 실제 Inference 테스트를 위해 모델을 flask microservice 형태로 배포하였다. </u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-5n7tCMcH_8I/WkJnlD-ezxI/AAAAAAAAGa0/PVLcglamwR4v9YsJwVOtSaNV-6yIEfaAQCLcBGAs/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="184" data-original-width="932" src="https://2.bp.blogspot.com/-5n7tCMcH_8I/WkJnlD-ezxI/AAAAAAAAGa0/PVLcglamwR4v9YsJwVOtSaNV-6yIEfaAQCLcBGAs/s1600/10.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: left;">
위 구동은 CPU 전용 머신과 GPU 전용 머신에서 각각 해 주었다.</div>
<div class="separator" style="clear: both; text-align: left;">
실제 Production 에서는 성능 극대화를 위해 하나의 머신에 port 를 달리하여 여러 Process 를 띄우고 앞에 웹프록시 등을 두는 것이 일반적이지만, 이 실험은 상대적인 비교를 위함이 목적이므로, 그런 작업을 해주지는 않았다.</div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>[11] 이제 실제 운영 Production 환경과 유사한 환경에서 동시접속수행 Test 를 해보겠다.</u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: left;">
이곳에 따로 기재하진 않았으나, 앞선 시점에서의 비교는 Jupyter Notebook 에서 이루어졌다. 모두가 아는 바와 같이 Jupyter Notebook 위에서의 구동은 단일 Python 독립 프로세스보다 훨씬 느리다. 즉, 동일한 실험이 flask 위에서 구동된 경우 Jupyter 위에서 구동된 경우보다 훨씬 빠르다. 그리고, flask 는 경량의 비동기 웹 프레임워크 이기 때문에, 병렬 수행이 위의 경우보다 훨씬 빠르게 일어난다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
위에서는 Serial 하게 한번에 하나씩만 Job 을 수행하였다. 이번 flask 에서의 수행은 다수 User 에서의 Parallel 동접 수행이다. 때문에 Serial 하게 수행했을 때보다 더 많은 병렬 Job 이 수행되었고, 그 결과 Jupyter 에서의 serial 수행보다 성능이 훨씬 더 좋게 나오고 있다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>(1) CPU 에서의 최종 결과</u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request]<br />
1 200.35 4.991 30.13 201 0<br />
11 273.97 3.650 41.20 274 0<br />
21 245.21 4.078 36.88 246 0<br />
31 265.94 3.760 39.99 266 0<br />
41 265.97 3.760 40.00 266 0<br />
51 265.95 3.760 40.00 266 0<br />
61 258.76 3.865 38.92 259 0<br />
71 260.95 3.832 39.24 262 0<br />
81 244.99 4.082 36.84 245 0<br />
91 251.80 3.971 37.87 253 0</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request]<br />
300 274.39 3.644 41.27 275 0<br />
310 233.33 4.286 35.09 234 0<br />
320 173.71 5.757 26.12 174 0<br />
330 133.75 7.476 20.12 134 0<br />
340 142.73 7.006 21.46 143 0<br />
350 130.86 7.642 19.68 131 0<br />
360 128.93 7.756 19.39 129 0<br />
370 280.45 3.566 42.18 281 0<br />
380 267.97 3.732 40.30 268 0<br />
390 278.43 3.592 41.87 279 0<br />
400 200.84 4.979 30.20 201 0</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
Apach 오픈소스 부하테스트 도구를 이용하여 동시접속 수행 성능을 측정하였다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
하나의 단일 User 가 비동기로 여러개의 병렬 수행을 요청하며, 그러한 User 또한 1에서 최고 400까지 늘려가며 측정 하였다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
CPU는 TPS 가 270 정도씩 나와 주고 있다. 그 시점 flask 의 로그를 보면, 실제 초단위로 동일한 log 가 270여개 실제로 모두 200 응답으로 존재함을 확인 할 수 있다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-fR2wfGFFl50/WkJzWRgdRqI/AAAAAAAAGbE/PeJsCcSsAXst-PcKQr33q4UMWKRIoqbygCLcBGAs/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="680" data-original-width="808" src="https://3.bp.blogspot.com/-fR2wfGFFl50/WkJzWRgdRqI/AAAAAAAAGbE/PeJsCcSsAXst-PcKQr33q4UMWKRIoqbygCLcBGAs/s1600/11.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-jQ_4tc8V4Ao/WkJzfdDjq_I/AAAAAAAAGbI/gZphSY8bhHsS-uUFM9B1Bp5DonnejA6cQCLcBGAs/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="157" data-original-width="640" src="https://3.bp.blogspot.com/-jQ_4tc8V4Ao/WkJzfdDjq_I/AAAAAAAAGbI/gZphSY8bhHsS-uUFM9B1Bp5DonnejA6cQCLcBGAs/s1600/13.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>(2) GPU 에서의 최종 결과</u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both;">
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request]<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
1 16.47 60.735 2.48 17 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
11 16.24 61.565 2.44 17 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
21 15.69 63.740 2.36 16 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
31 11.60 86.215 1.74 12 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
41 4.98 200.914 0.75 5 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
51 0 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
61 17.80 56.186 2.68 18 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
71 0 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
81 17.47 57.242 2.63 18 0<span style="white-space: pre;"> </span></div>
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both;">
91 0 0</div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both;">
[Run User] [TPS] [Time Per Request : millisec] [Transfer rate: Kbytes/sec] [Complete Request] [Failed Request]</div>
<div class="separator" style="clear: both;">
1 15.87 63.014 2.39 16 0</div>
<div class="separator" style="clear: both;">
11 17.28 57.886 2.60 18 0</div>
<div class="separator" style="clear: both;">
21 15.69 63.744 2.36 16 0</div>
<div class="separator" style="clear: both;">
31 12.46 80.263 1.87 13 0</div>
<div class="separator" style="clear: both;">
41 5.76 173.748 0.87 6 0</div>
<div class="separator" style="clear: both;">
51 0 0</div>
<div class="separator" style="clear: both;">
61 17.33 57.706 2.61 18 0</div>
<div class="separator" style="clear: both;">
71 0 0</div>
<div class="separator" style="clear: both;">
81 12.42 80.529 1.87 13 0</div>
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both;">
91 0 0</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-sRS-x1UUpvk/WkJ0IzHvsOI/AAAAAAAAGbU/sk0ZXImctAsuacykO_n3Q3HLecSAnDi3QCLcBGAs/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="518" data-original-width="1092" src="https://2.bp.blogspot.com/-sRS-x1UUpvk/WkJ0IzHvsOI/AAAAAAAAGbU/sk0ZXImctAsuacykO_n3Q3HLecSAnDi3QCLcBGAs/s1600/14.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: left;">
GPU 는 TPS 가 16 정도밖에 되지 않는 저조한 결과를 보여 주었다.</div>
<div class="separator" style="clear: both; text-align: left;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>[결론]</u></b></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
(ps. 동시수행 과정에서의 cpu , gpu 사용량은 serial 1000건 수행의 경우와 매우 유사했다.)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
CPU 의 경우 특징은 느려질 지언정 400동접까지도 Fail Request 가 하나도 없었다는 점이다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
그리고 Serial 하게 1000개를 수행했을때, 개당 20 ms 이던것이 병렬로 수행했을때에는 약 5배정도 빠른 성능을 보여 주었다. </div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
하지만 GPU 의 경우는 동접자가 많아지면, Fail Request 가 매우 많아 졌고, TPS 자체도 CPU 에 비하여 매우 느렸다. Serial 수행에서 3배 느렸으나, 동접 수행은 거의 10배 이상 느렸다. CPU 코어가 여러개인것도 그렇지만, 메모리 등도 한몫을 했을 것으로 보여진다. GPU 의 경우는 serial 하게 측정했을때나 parallel 하게 측정했을때 모두 개당 응답 속도가 60ms 정도로 일정하다는 특징도 보여주었다. 즉, 동시 처리가 좀 매우 취약해 보인다. 동시 수행하는 속도 개선 효과가 거의 없었다.(CPU 와는 전혀 다른 양상이다.)</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
또한 GPU inference 의 경우 단일 CPU 가 GPU 한개와 함께 힘들게 일하고 있었던 양상 또한, 병렬 동시접속 능력을 떨어뜨리는 계기가 된듯 하다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
(이는 Tensorflow 에서의 실험 내용이다. CNTK 로도 동일한 모델을 수행할 수 있는데, 그 비교 결과는 다음 기회에 Posting 해보도록 하겠다.)</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
일단 CPU Inference 의 경우는, 메모리 사용량, CPU 사용량, 모두 저정도의 traffic 에 대하여는 안정적인 결과를 보여주는 것을 확인 할 수 있었다. GPU 의 경우는 Production 으로 대국민 서비스를 하기에 매우 위험한 수준이었다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
Developer 입장에서, 우리에게 CPU는 사실 GPU에 비하여 상대적으로 너무나 친숙하고 풍족한 리소스 이다. 게다가, 우리는 Docker , Microservice , Spark on Hadoop Yarn, Mesos 등 다양한 CPU + in-Memory 병렬 cluster 솔루션이 있다. 그리고 Public Cloud 에도 Auto Scale Out 이 가능한 Docker PaaS 나 Serverless MicroService PaaS 가 GPU 보다는 훨씬 저렴한 가격으로 구비되어 있다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
AI Serving Layer 는 이렇게 일단 우리의 시나리오와 우리의 모델에 있어서는 GPU 를 제끼고 고려할만 한 실험 결과가 나왔다. ( 물론 VGG, Inception 등 층이 깊은 Deep Learning 모델은 이것과 다른 양상이 나올 지도 모른다. TensorRT 등 Nvidia 는 Inference 전용 솔루션도 내놓은 것으로 알고 있다.) </div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
지금 담담하게 결론을 적고 있지만, 사실 실험결과가 이렇게 나왔을때 나는 흥분을 감추지 못했다. 하마터면 수억원짜리 GPU가 6~8개씩 꼳 힌 장비를 수대 구매하는 프로세스를 태울 뻔 했기도 했지만.... 무엇보다, 대용량 서비스와 다수 동접자를 위한 아키텍처에, 위 결론에서는 많은 솔루션과 오픈소스 그리고 public cloud 를 쓸 수 있는 풍부한 가능성이 생겼다는 점에서 안도의 한숨을 쉴 수 있었다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
PS. 위 실험 결과와 결론 유추 과정에서 제가 범한 논리적 오류가 있었다면 지적해주시기 바랍니다. 공유 이후 컴멘트는 곧 저에게는 배움이기도 하다는 자세로 공유를 실천 하고 있습니다.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 14px;">
</div>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com6tag:blogger.com,1999:blog-8166686140676460430.post-26623339688796187962017-09-07T05:38:00.003+09:002017-12-07T08:29:39.125+09:00BigData와 결합한, 분산 Deep Learning 그 의미와 접근 방법에 대하여<div style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; padding: 0px;">
<span style="background-color: white;">딥러닝의 대부이신 제프리 힌튼 교수님은, 머신러닝의 수십년간 암흑기가 극복될 수 있었던 계기로 3대 난재가 풀렸기 때문이라고 언급하신 바 있다. 바로 아래와 같다.</span></div>
<div style="background-color: white; padding: 0px;">
</div>
<ol>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">알고리즘적 혁신 ( Deep Neural Net 이 가능해진, Relu, DropOut, 발견 등등..)</span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">하드웨어 혁신 ( GPU 를 이용한 컴퓨팅 파워 Scale Up )</span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">소프트웨어 혁신 ( BigData Cluster 를 이용한 분산 컴퓨팅 파워 Scale Out )</span></span></li>
</ol>
<div>
<span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">이 중 1은 우리가 너무나 많이 알고 있고, 곁에서 접하고 있고, 심지어 사랑하고 있는 분야이다.</span></span></div>
<div>
<span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">2는 약간 비싸지만, 회사에서 안사주면, 자비를 털어서라도 집 Desktop에 2개 정도 꼳아주고, 그 날개 돋힌 파워를 충분히 느껴 볼 수 있는 분야이다.</span></span></div>
<div>
<span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;"><br /></span></span></div>
<div>
<span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">하지만, 3은 좀 말이 다르다. 힌튼 교수님이 말씀 하셨지만, Lab 에서든 기업에서든, 섣불리(아직까지는) 시도되지 못하는 경향이 있고, 관련된 자료도 많지 않다. 무엇보다도, Popular 한 오픈 Data 를 통해 논문에서 통용되는 수십만 혹은 수백만건의 데이타는 그다지 Big 하지 않기 때문에, 1+2 만 가지고도 꾸엮 꾸엮 실험하고 돌려보고, 논문을 완성해갈 수도 있는 수준일 수 있다. 때문에, 구글, MS 등 몇몇 회사등을 제외하고는 수십층 짜리 Very Very Deep 류의 모델을 밑바닥부터 적합한 Neural Networks 구조를 발견하고, 이를 초기값부터 시작하여 새롭게 학습시키는 등의 작업은 일반 소규모 Lab 등에서는 하기가 매우 힘들고, 그러다 보니, 그에 대한 학계의 연구가 보편화 되어 있지는 않는 듯 보인다. </span></span></div>
<div>
<span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;"><br /></span></span></div>
<div>
<span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">그래서인지 3의 접근은 일부 공룡 기업들에 의하여 자체 구축 혹은 오픈소스화 되어 일부 만이 오픈된 상태이다. </span></span></div>
<div>
<span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;"><br /></span></span></div>
<div>
<span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">기업의 Production Deep Learning 프로젝트의 경우, 우선 보유 Data 의 크기가 논문에서 사용되는 Data 의 크기보다 수십배 ~ 수백배인 경우가 많다.(아닌경우도 많지만...) 그리고, 복수의 모델을 함께 쓰거나 좀더 Fine Tuning 을 위해, Online Learning , Transfer Learning 보다는 초기부터의 Learning 을 시도하는 경우가 훨씬 많다.(특히, 한글 Deep Learning Text NLP 등은 기 학습되어 있는 Pre training Set 도 존재하지 않는다.)</span></span></div>
<br />
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; padding: 0px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; padding: 0px;">
<b><u>오늘은 그런 부분 즉, Deep Learning 을 Big Data Scale Data 를 가지고 수십대 수백대의 GPU 클러스터를 가지고서 병렬 Training 을 하기 위한 BigData Platform + deep Learning Platform 구성에 대하여 이야기 해보고자 한다.</u></b></div>
<div style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; padding: 0px;">
<span style="background-color: yellow;"><br /></span></div>
<div style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; padding: 0px;">
<b><u style="background-color: yellow;">[1] GPU 만으로 하는 Deep Learning Approach의 한계</u></b></div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; padding: 0px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; padding: 0px;">
가장 Popular 한 Deep Learning 프레임워크 중 하나인 Tensorflow 는 사실, 이미 멀티 GPU 를 지원하고, 멀티 노드도 지원하며, 아직 미흡하지만, 자체 Serving Layer 도 가지고 있다. 하지만, Tensorflow 가 지원하는 수준의 분산 컴퓨팅, 분산 GPU 는 마치, 분산 데이타 컴퓨팅을 Map/Reduce 로 하는 경우와 유사하게 너무 Low Level 접근을 필요로 하는 경우가 많다. 하나의 Simple 한 Neural Network 모델이 Data Parallel 이 되거나 Compute Parallel 이 되는것 특히, 그것이 High Level 로 저절로 되는 것은 아직 그 어떤 Deep Learning 프레임워크도 완벽하게 지원하고 있지는 않는 영역이다.</div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
Caffe나 Tensorflow , Torch, CNTK 등의 deep learning 프레임워크는 그 자체만으로 은총알은 아니다. High Level Scale Up 된 장비 한두대로 논문에서 다루는 크기의 데이타를 처리하는데에는 문제가 되지 않으나, 실무 데이타, 특히 클릭 스트림을 RNN이나 LSTM 분석하는 정도의 시나리오만 되도, 데이타의 크기나 GPU 머신의 Memory 문제로 금방 문제가 드러나기 십상이다.</div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
다중 사용자에게 Deep Learning Serving(Service Request 대응) 을 하는 도중에, Model traing 갱신이 일어나고, 실시간 업데이트가 되면서, 무중지로 Model 배포되는 시나리오는 또 다른 고급 기술을 요구하기도 한다.</div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
<b><u>GPU 만으로 하는 Single Scale Up, Deep Learning Approach의 한계를 정리해 보자면 아래정도 일 것이다. </u></b></div>
<div style="background-color: white; margin-top: 10px; padding: 0px;">
</div>
<ol>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">Hyper Parameter Tunning 노가다</span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">Training 속도 한계있음</span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">멀티 GPU 코딩의 거시기함.</span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">GPU의 협소한 메모리로 인한 ResourceExhaustedError. </span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">강제된 작은 Batch Size</span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">RealTime Inference, 다수 동접자 Serving Layer, 모델의 무중지 Rolling Upgrade</span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">BigData Scale Data 들을 접근 하기 위한 Data Pipe lining </span></span></li>
<li><span style="color: #333333; font-family: "arial" , sans-serif;"><span style="font-size: 14px;">모델 태우기 전, Python 레벨 데이타 전처리와 후처리의 한세월...</span></span></li>
</ol>
<br />
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
<b><u style="background-color: yellow;">[2] Open Source 진영 BigData Scale Distributed Deep Learning Approach </u></b></div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
하지만, 오픈소스 진영에서는 그러한 것들을 주로 hadoop + Spark (PySpark) 를 통해 해결 시도 하고 있고, 어느정도 Production 레벨까지 활용 가능한 수준의 결과물들이 나오고 있다. 즉, 서두에서 언급했던 3(BigData 혁신)의 시도가 되고 있는 것이다.</div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
BigDL, elaphas , caffeOnSpark 등 그런류의 몇가지 오픈소스를 실제 Production Level Deep Learning 배치 시나리오를 이용 Training 해보고 테스트 해보았는데, 아래 소개하는 TensorflowOnSpakr (made by Yahoo) 오픈소스는 그중 가장 가능성이 보이는 Approach 중 하나라 할 수 있을 것이다. (참고로, Yahoo 는 TensorflowOnSpark 을 만들기 전 CaffeOnSpark을 먼저 만들었고 테스트 하였다.)</div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
아래는 Inception-v3 모델을 spark 멀티 노드위에서 worker 노드 갯수를 달리해가면 분산 Training 한 속도 비교 이다.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-23yOv-GAePQ/WbBX-WKhqwI/AAAAAAAAEfw/VXAPvWz4ROE7NVP_RIP7vWMLqE8idqRDwCLcBGAs/s1600/scaling.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="265" data-original-width="475" height="356" src="https://1.bp.blogspot.com/-23yOv-GAePQ/WbBX-WKhqwI/AAAAAAAAEfw/VXAPvWz4ROE7NVP_RIP7vWMLqE8idqRDwCLcBGAs/s640/scaling.png" width="640" /></a></div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
위처럼 1대에서 48시간을 돌려도 정확도가 0.73 % 정도인게, 8대에서는 7시간만에 도달되고 이후로, 85%가 넘는 정확도에 훨씬 빠른 시간에 도달 되는 것을 확인 할 수 있다.</div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
<b><u style="background-color: yellow;">[3] TensorflowOnSpark 설치 및 세팅 사용방법 </u></b></div>
<div style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
아래는 그런 Producion Level 에서 BigData 분산 Traing 과 RealTime Traing 부분에 강한 강점을 가지고 있는 시스템 구성으로 Tensorflow + Spark + Hadoop 구성을 설정 하고 세팅 한 후, 간단하게 사용하는 방법이다. ( Hadoop 과 Spark 는 Yarn Cluster 모드로 이미 설정이 기 완료 되어 있다고 가정하고, 그 이후의 세팅 방법만 언급 하였다.)</div>
<ol>
<li>Python3 관련 설정 및 설치</li>
<ol>
<li>우선 SSL 관련</li>
<ol>
<li>yum install openssl openssl-devel -y</li>
</ol>
<li>Anaconda 설치</li>
<ol>
<li>https://repo.continuum.io/archive/ 위치에서 Linux 버전 최신 설치 파일 Download</li>
<li>각 노드에 모두 복사</li>
<li>chmod 755 Anaconda3-4.4.0-Linux-x86_64.sh</li>
<li>sudo ./Anaconda3-4.4.0-Linux-x86_64.sh</li>
<li>설치 완료 시 화면</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-2AuhOlfOwOY/WaUdsmA7a_I/AAAAAAAAEbQ/WdzJ38nlZw0ES65eLAFedo3xLGdHAUwpgCLcBGAs/s1600/anaconda_install.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="280" data-original-width="1075" height="166" src="https://4.bp.blogspot.com/-2AuhOlfOwOY/WaUdsmA7a_I/AAAAAAAAEbQ/WdzJ38nlZw0ES65eLAFedo3xLGdHAUwpgCLcBGAs/s640/anaconda_install.png" width="640" /></a></div>
<ol>
<li>설치 완료 화면</li>
</ol>
<li>bin 경로에 심볼릭 링크 연결 (Source 경로는 각자의 경로를 따를 것!)</li>
<ol>
<li>sudo ln -s /home/moneymall/anaconda3/bin/python3 /bin/python3</li>
</ol>
<li>기존 python 을 un link</li>
<ol>
<li>sudo unlink /bin/python</li>
</ol>
<li>새로 설치한 python3 로 다시 link</li>
<ol>
<li>sudo ln -s /bin/python3 /bin/python</li>
</ol>
<li>pip 도 설정</li>
<ol>
<li>sudo ln -s /home/moneymall/anaconda3/bin/pip /bin/pip</li>
</ol>
<li><br /></li>
</ol>
</ol>
<li>Anaconda 설치에 관하여.</li>
<ol>
<li>Tensorflow 등의 기본이 되는 Python Dev 환경을 설치하는 여러가지 방법이 있지만, 내가 선호하는 방법은 우선 anaconda 를 깔아주는 것이다. 공간차지 등등 부수적인 단점이 있긴 하지만, 여러가지 추가적인 기능들이나 필수 모듈들이 동시에 깔려서 편하고, 이후 anaconda 가 제공하는 여러가지 관리 도구들을 이용하여 다양한 장점을 꽤할 수 있다.</li>
<li>Root 로 설치시 실제 사용하는 계정으로 수행하는데 불편함이 많음.</li>
<li>실제 사용하는 계정으로 설치하는 것이 더 편함.</li>
</ol>
<li>Tensorflow 및 TensroflowOnSpark 설치</li>
<ol>
<li>pip install tensorflow</li>
<ol>
<li>CPU 모드일때는 그냥 간단히 저렇게 해줘도 됨.</li>
<li>virtual env 등에 설정할 수도 있고, conda create 한 다음 설정할 수도 있으나, spark 와 연동을 위해서는 바깥에서 전역적으로 저렇게 설치하는 것이 좋음.</li>
<li>설치 완료 화면<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-AeXnWrYdsUU/WaUiFV8S0ZI/AAAAAAAAEbc/C2md4nph57U5mxXWhfHiB0OZchqBBQp3QCLcBGAs/s1600/tensorflow_install.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="264" data-original-width="1075" height="157" src="https://3.bp.blogspot.com/-AeXnWrYdsUU/WaUiFV8S0ZI/AAAAAAAAEbc/C2md4nph57U5mxXWhfHiB0OZchqBBQp3QCLcBGAs/s640/tensorflow_install.png" width="640" /></a></div>
</li>
</ol>
<li>pip install tensorflowonspark</li>
<ol>
<li>설치 무지 빨리 끝남.</li>
<li>설치 완료 화면<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-LkJAWFqH-3g/WaUixQlSjBI/AAAAAAAAEbk/CdDUcRV6YDk1yePEUJj8Ri1I4wq5RRU-ACLcBGAs/s1600/tensorflowonspark_install.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="264" data-original-width="1075" height="156" src="https://4.bp.blogspot.com/-LkJAWFqH-3g/WaUixQlSjBI/AAAAAAAAEbk/CdDUcRV6YDk1yePEUJj8Ri1I4wq5RRU-ACLcBGAs/s640/tensorflowonspark_install.png" width="640" /></a></div>
</li>
</ol>
<li>참고로 위 설치 방법은 Simple 설치 방법을 공유하기 위한 목적의 설치 Guide 이므로, RDMA 를 사용하는 Advanced 설정 방법은 아님.</li>
<ol>
<li>RDMA 사용 시 훨씬 성능을 극대화 할 수 있음.</li>
</ol>
</ol>
<li>Spark및 Hadoop 에서 Tensorflow 의 Records 를 직접 읽고 쓰기위 한 Jar 라이브러리 설치</li>
<ol>
<li>아래 주소에 Spark 용 해당 Open Source 가 있음.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-D5nKLQlQgIQ/WaUxDH_JEaI/AAAAAAAAEb0/AYGA6LqvdBMv0jsrQO-FQLqpNTxvfiEyQCLcBGAs/s1600/TFRecordsRW.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="344" data-original-width="1075" height="204" src="https://2.bp.blogspot.com/-D5nKLQlQgIQ/WaUxDH_JEaI/AAAAAAAAEb0/AYGA6LqvdBMv0jsrQO-FQLqpNTxvfiEyQCLcBGAs/s640/TFRecordsRW.png" width="640" /></a></div>
<ol>
<li><a href="https://github.com/tensorflow/ecosystem/tree/master/spark/spark-tensorflow-connector">https://github.com/tensorflow/ecosystem/tree/master/spark/spark-tensorflow-connector</a></li>
<li>git clone 후 spark 디렉토리로 이동.</li>
<li>git clone https://github.com/tensorflow/ecosystem.git</li>
<li>sbt build</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-WdhprPs9hNg/WaU1WK_eKPI/AAAAAAAAEcA/lj8RsjLrT4sNvgmKg9jsXBe_6s1JUO_fQCLcBGAs/s1600/TFRecordsRW_build.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1075" height="432" src="https://1.bp.blogspot.com/-WdhprPs9hNg/WaU1WK_eKPI/AAAAAAAAEcA/lj8RsjLrT4sNvgmKg9jsXBe_6s1JUO_fQCLcBGAs/s640/TFRecordsRW_build.png" width="640" /></a></div>
<ol>
<li>build.sbt 파일이 존재하는 위치까지 이동.</li>
<li>sbt clean assembly</li>
<li>위 빌드 명령어 입력 하면 아래처럼 sbt 빌드 완료 되고, target 디렉토리 하위에 jar 파일 생성 됨.</li>
<li>Jar 파일 위치<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-XCTcpD2hdM0/WaU1uD1IxII/AAAAAAAAEcE/cWKXbJWgP54csBbBDSdonpYMexOO1y6KQCLcBGAs/s1600/TFRecordsRW_jar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="120" data-original-width="1075" height="70" src="https://3.bp.blogspot.com/-XCTcpD2hdM0/WaU1uD1IxII/AAAAAAAAEcE/cWKXbJWgP54csBbBDSdonpYMexOO1y6KQCLcBGAs/s640/TFRecordsRW_jar.png" width="640" /></a></div>
</li>
</ol>
</ol>
<li>아래는 Spark 이 아닌 Hadoop 용 InputFormat/OutputFormat 모듈 for Tensorflow Records Direct Read/Write</li>
<ol>
<li>https://github.com/tensorflow/ecosystem/tree/master/hadoop</li>
<li>위 git clone 소스에서 Hadoop 경로로 간다.</li>
<li>$TF_SRC_ROOT 는 Tensorflow 소스 루트.</li>
<li>protoc 가 설치되어 있지 않다면, https://developers.google.com/protocol-buffers/ 에서 3.3.0 버전 설치 필요 함.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-9OSlfI0gsBs/WaZsuAE30aI/AAAAAAAAEcU/rG15z6JNfNIm-AXQcx3oC613_J3v236uwCLcBGAs/s1600/protobuf_autogen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="456" data-original-width="1075" height="270" src="https://3.bp.blogspot.com/-9OSlfI0gsBs/WaZsuAE30aI/AAAAAAAAEcU/rG15z6JNfNIm-AXQcx3oC613_J3v236uwCLcBGAs/s640/protobuf_autogen.png" width="640" /></a></div>
<ol>
<li>git clone https://github.com/google/protobuf.git</li>
<li>cd protobuf</li>
<li>./autogen.sh</li>
<li>./configure</li>
<li>make # 무지오래걸림.</li>
<li>make check # 더 오래걸림. 커피 먹으러 갔다 오길 추천.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Z_QS_fkovGU/WaZ0YgWAAYI/AAAAAAAAEck/c6JTA5eYR7o1t2ptrrr6IvJtnhgFPEOygCLcBGAs/s1600/protobuf_check.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="552" data-original-width="1075" height="328" src="https://2.bp.blogspot.com/-Z_QS_fkovGU/WaZ0YgWAAYI/AAAAAAAAEck/c6JTA5eYR7o1t2ptrrr6IvJtnhgFPEOygCLcBGAs/s640/protobuf_check.png" width="640" /></a></div>
<ol>
<li>make check 완료시 화면</li>
</ol>
<li>sudo make install # 금방 끝남.</li>
<li>sudo ldconfig</li>
<li>완료 후 확인</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-6GaOcHWif0k/WaZ1ptD3ozI/AAAAAAAAEcw/YYT4D_esulcewt5UhBC9rvCQZr1yRXilgCLcBGAs/s1600/protobuf_protoc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="488" data-original-width="1075" height="290" src="https://4.bp.blogspot.com/-6GaOcHWif0k/WaZ1ptD3ozI/AAAAAAAAEcw/YYT4D_esulcewt5UhBC9rvCQZr1yRXilgCLcBGAs/s640/protobuf_protoc.png" width="640" /></a></div>
<ol>
<li>protoc 명령어를 수행하면 저런 화면이 떠야 함.</li>
</ol>
</ol>
<li>protobuf java 버전도 설치 필요</li>
<ol>
<li>소스 위치는 앞에서 다운받았던 protobuf 소스에서 java 경로 밑에 있음.</li>
<li>mvn test (maven 이 기 설치 되어 있어야 함.)</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-7Zzu0qpEs2c/WaZ9NOZajpI/AAAAAAAAEdA/Y2Q4NCoob2w7NgooYCW-tBgB68CNEG42wCLcBGAs/s1600/protobuf_java.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="552" data-original-width="1075" height="328" src="https://3.bp.blogspot.com/-7Zzu0qpEs2c/WaZ9NOZajpI/AAAAAAAAEdA/Y2Q4NCoob2w7NgooYCW-tBgB68CNEG42wCLcBGAs/s640/protobuf_java.png" width="640" /></a></div>
<ol>
<li>완료시 이런 모양.</li>
</ol>
<li>mvn install</li>
</ol>
<li>protoc --proto_path=$TF_SRC_ROOT --java_out=src/main/java/ $TF_SRC_ROOT/tensorflow/core/example/{example,feature}.proto</li>
<ol>
<li>$TF_SRC_ROOT 는 tensorflow 소스가 미리 받아져 있어야 하고 해당 경로로 set 되어 있어야 함. (.bashrc 등에...)</li>
<li>tensorflow 소스는 https://github.com/tensorflow/tensorflow.git 이곳에 있음.</li>
</ol>
<li>mvn clean package</li>
<ol>
<li>처음 default pom.xml 로 수행시 아래같은 에러 잔뜩 남.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-aEMyMUjdrYs/WaaM0d6plSI/AAAAAAAAEdQ/IheqFntRpzcvQIpAsEw86n8hNWE0-UWgACLcBGAs/s1600/mvn_error.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="616" data-original-width="1083" height="364" src="https://1.bp.blogspot.com/-aEMyMUjdrYs/WaaM0d6plSI/AAAAAAAAEdQ/IheqFntRpzcvQIpAsEw86n8hNWE0-UWgACLcBGAs/s640/mvn_error.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ol>
<li>Cannot find symbol 이라는 문구들이 error 로그에 보이는 걸로 봐서...이건 version 오류로 추정됨.</li>
<li>pom.xml 을 열어서 보면... version 이 1.6 으로 되어 있음. 이걸 1.8로 수정(내 환경에서의 Java 는 1.8 이었으므로...)</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-1D53cszgGZk/WaaNfgD1OOI/AAAAAAAAEdY/jYdNaDHQgZ0nissdiLD5WNCJjIjIHdINACEwYBhgL/s1600/mvn_version.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="440" data-original-width="1083" height="260" src="https://1.bp.blogspot.com/-1D53cszgGZk/WaaNfgD1OOI/AAAAAAAAEdY/jYdNaDHQgZ0nissdiLD5WNCJjIjIHdINACEwYBhgL/s640/mvn_version.png" width="640" /></a></div>
<ol>
<li>Java 버전 1.8로 수정했음.</li>
<li>protobuf 버전도 3.3.1 에서 내가 설치했던 버전인 3.4.0 으로 수정해 주었음.</li>
</ol>
</ol>
<li>jar 생성</li>
<ol>
<li>위 pom.xml 수정 후 빌드 성공하면 jar 생성됨.</li>
<li>빌드 성공시의 화면</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-F1fu7pYbJ3k/WaaPkxHdcpI/AAAAAAAAEdk/oq64U5f8npgD0HjbfZ-g6EmYfCm91TfJwCLcBGAs/s1600/mvn_success.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="552" data-original-width="1083" height="326" src="https://4.bp.blogspot.com/-F1fu7pYbJ3k/WaaPkxHdcpI/AAAAAAAAEdk/oq64U5f8npgD0HjbfZ-g6EmYfCm91TfJwCLcBGAs/s640/mvn_success.png" width="640" /></a></div>
<ol>
<li>jar 파일은 target 디렉토리 아래 존재</li>
</ol>
</ol>
</ol>
<li>해당 jar 를 HDFS 에 업로드</li>
<ol>
<li>hadoop fs -put tensorflow-hadoop-1.0-SNAPSHOT.jar /user/moneymall/</li>
</ol>
</ol>
</ol>
<li>Parallel MNIST 돌려보기</li>
<ol>
<li>우선 데이타 준비</li>
<ol>
<li><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;">mkdir ${HOME}/mnist
pushd ${HOME}/mnist >/dev/null
curl -O "http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz"
curl -O "http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz"
curl -O "http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz"
curl -O "http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz"
zip -r mnist.zip *
popd >/dev/null</code></pre>
</li>
<li>위 mnist.zip 파일은 local 에 존재 시키고, spark-submit 할때 인자로 넘길 예정이다.</li>
</ol>
<li>Pyspark 를 이용한 Data 병렬 전처리 후 CSV 포맷으로 저장</li>
<ol>
<li>Pyspark 를 이용해서 MNIST 데이타를 traing 셑과 test 셑으로 나누는 부분을 병렬로 수행 해보자.</li>
<li>여기에 사용되는 example 코드는 tensroflowOnSpark github 에 존재하는 코드이다.</li>
<ol>
<li>https://github.com/yahoo/TensorFlowOnSpark/blob/master/examples/mnist/mnist_data_setup.py</li>
<li>위 코드를 사용하였다.</li>
</ol>
<li>pySpark 로 data 전처리를 병렬로 수행하고 CSV 결과는 Hadoop 에 쓸 예정이다.</li>
<li>수행 Script 는 아래와 같다.</li>
<li><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 13 \
--executor-memory 22G \
--archives ./mnist/mnist/mnist.zip#mnist \
./mnist/mnist_data_setup.py \
--output mnist/csv \
--format csv</span></span><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">
</span></pre>
</li>
<li>위는 official manual 문서와 다소 다르다. 처음 수행을 하면 에러가 나는데, spark yarn cluster 를 이용하였으므로, hadoop job 모니터링 페이지를 통해 에러 로그를 확인 할 수 있다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-qHEKLHyfrEs/Wafw0MRu6wI/AAAAAAAAEd0/D94F0pDsIEQcZ1Iw_yweo7g93fBZ0KqRQCLcBGAs/s1600/mnist_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="549" data-original-width="1075" height="326" src="https://4.bp.blogspot.com/-qHEKLHyfrEs/Wafw0MRu6wI/AAAAAAAAEd0/D94F0pDsIEQcZ1Iw_yweo7g93fBZ0KqRQCLcBGAs/s640/mnist_1.png" width="640" /></a></div>
<ol>
<li> 즉, mnist 다운로드한 파일의 경로 참조를 정확히 해주지 못해서 에러가 발생하고 있음을 알수있다.</li>
<li>경로를 수행한 python 파일과의 상대경로로 정확히 지정하고 나면, 에러가 나지 않고, pyspark yarn cluster 모드로 잘 동작이 된다.</li>
</ol>
<li>또 official manual 과 내가 수행한 스크립트의 다른 부분은 아래 옵션을 나는 삭제 했다는 점이다.</li>
<ol>
<li>--archives hdfs:///user/${USER}/Python</li>
<li>우리는 앞서 모든 노드에 동일하게 Python 환경을 이미 세팅해 주었고, Path 에도 포함시켜 줬다. 때문에, 굳이 Python을 배포를 통하여 공유되게 하지 않아도 에러없이 수행이 가능하다.</li>
</ol>
<li>최종적인 결과 메시지는 아래와 같다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-wSHdDDCEXX4/WafxnCoKcsI/AAAAAAAAEd8/zgATfD0jJ604-RQGEx2pmEGZZYJA-4jHwCLcBGAs/s1600/TFRecordsWrite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="937" data-original-width="1075" height="556" src="https://3.bp.blogspot.com/-wSHdDDCEXX4/WafxnCoKcsI/AAAAAAAAEd8/zgATfD0jJ604-RQGEx2pmEGZZYJA-4jHwCLcBGAs/s640/TFRecordsWrite.png" width="640" /></a></div>
<li>hadoop 에 CSV 파일이 잘 Write 되었는지도 확인해 보자.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-mqykDViuIaM/Wafx5B7Ew0I/AAAAAAAAEeA/c04nt2lrf2QJVv-2FQN-U0Rt7siE0110wCLcBGAs/s1600/output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="280" data-original-width="1075" height="166" src="https://3.bp.blogspot.com/-mqykDViuIaM/Wafx5B7Ew0I/AAAAAAAAEeA/c04nt2lrf2QJVv-2FQN-U0Rt7siE0110wCLcBGAs/s640/output.png" width="640" /></a></div>
<ol>
<li>하이라이트 한 부분 처럼 Hadoop 에 mnist 데이타에 대한 전처리 후 결과 output 이 train 과 test 데이타로 나뉘어 잘 적재 된 것을 확인 할 수 있다.</li>
<li>이는 앞으로 대용량 데이타에 대한 Python 전처리를 병렬로 수행할 수 있음을 확인 한 부분이다.</li>
</ol>
</ol>
<li>Pyspark 를 이용한 Data 병렬 전처리 후 Tensroflow Records 포맷으로 저장</li>
<ol>
<li>CSV 로 파일을 저장하지 않고, Tenssorflow Records 포맷으로 바로 저장할 수도 있다.</li>
<li>우리는 이를 하기 위해 윗부분 설치 시점에, 4.2.8 에서 protobuf 까지 설치해가며, tensorflow ecosystem github 의 소스를 내려 받아 maven 빌드 후 tensorflow-hadoop-1.0-SNAPSHOT.jar 파일을 생성한 바 있다.</li>
<li>해당 jar 를 pyspark submit 시 인자로 넘겨주고 해당 jar 라이브러리를 이용 아래 내용을 수행 할 예정이다.</li>
<li>수행 스크립트는 아래와 같다.</li>
<li><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 13 \
--executor-memory 22G \
--archives ./mnist/mnist/mnist.zip#mnist \
--jars hdfs:///user/moneymall/tensorflow-hadoop-1.0-SNAPSHOT.jar \
./mnist/mnist_data_setup.py \
--output mnist/tfr \
--format tfr</span></span><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">
</span></pre>
</li>
<li><div>
앞서 CSV 로 HDFS에 저장해보았던 예제의 수행 스크립트 내용과 매우 유사하지만 대표적으로 --jars 옵션을 사용한것이 큰 차이점이다.</div>
</li>
<li><div>
그리고, 소스 내부에서 format 인자로 로직이 분기하므로 --format 값으로tfr 을 넘겨 주었으며, output 경로 또한 csv 가 아닌 tfr 로 변경해 주었다.</div>
</li>
<li>hadoop 에 tensorflow 포맷 records 가 잘 저장되었는지 살펴보자.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-MOKX3DgAa60/Waf0Pjb0ycI/AAAAAAAAEeM/MfxzP9jFm5E6qAYVXtrF6-rM0P25uil8QCLcBGAs/s1600/output2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="184" data-original-width="1075" height="108" src="https://2.bp.blogspot.com/-MOKX3DgAa60/Waf0Pjb0ycI/AAAAAAAAEeM/MfxzP9jFm5E6qAYVXtrF6-rM0P25uil8QCLcBGAs/s640/output2.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ol>
<li>스크립트를 수행해주자 위처럼 tfr 폴더가 생성 되었다.</li>
<li>tfr 디렉토리의 상세내용을 살펴보면 아래와 같다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-bGorj3a57JM/Waf0sqeY4lI/AAAAAAAAEeU/6-eia_Z_4k8GJtSxcqvAHuzgBFcgs4UGwCEwYBhgL/s1600/output3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="424" data-original-width="1075" height="252" src="https://1.bp.blogspot.com/-bGorj3a57JM/Waf0sqeY4lI/AAAAAAAAEeU/6-eia_Z_4k8GJtSxcqvAHuzgBFcgs4UGwCEwYBhgL/s640/output3.png" width="640" /></a></div>
<ol>
<li>역시 test 와 train 으로 구분되었으며, spark job 이 생성하는 파일 명명 규칙으로 파일이 생성 되었다. (파일 내용은 TFRecords 포맷이다.)</li>
</ol>
</ol>
</ol>
<li>MNIST 모델 돌려보기</li>
<ol>
<li>위 전처리 및 아래 Tensorlfow 병렬 모델 수행에서의 수행 스크립트는 Dev Zone 에서 테스트 된 관계로 GPU 관련 옵션이 빠져 있다. GPU 모드 병렬 수행을 위해서는 아래 옵션들이 추가되어야 한다.</li>
<ol>
<li><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;">--queue GPU</code></pre>
</li>
<li><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;">--conf spark.executorEnv.LD_LIBRARY_PATH=$LIB_CUDA:$LIB_JVM:$LIB_HDFS \
--driver-library-path=$LIB_CUDA \</code></pre>
</li>
<li><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;">#infiniband 에서의 성능 향상을 위해서는 아래 옵션도 추가하는 경우
# 큰 성능 향상을 가져올 수 있다. (설치시에도 옵션 설정 필요)
--rdma </pre>
</li>
</ol>
<li><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px; white-space: pre;">Training (using feed-dict)</span></span></li>
<ol>
<li><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px; white-space: pre;">feed-dict 을 이용한 Traing 용 수행 스크립트는 아래와 같다.</span></span></li>
<li><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;"><span style="font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;"># 재 수행시에는 아래 주석을 풀어주어야 한다. Overwrite error 방지.
# hadoop fs -rm -r mnist_model
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 13 \
--executor-memory 22G \
--py-files ./mnist/spark/mnist_dist.py \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.yarn.maxAppAttempts=1 \
--conf spark.executorEnv.LD_LIBRARY_PATH=$LIB_JVM:$LIB_HDFS \
./mnist/spark/mnist_spark.py \
--images mnist/csv/train/images \
--labels mnist/csv/train/labels \
--mode train \
--model mnist_model
# to use infiniband, add --rdma</span></span></code><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; white-space: pre; word-break: normal; word-wrap: normal;">
</code></pre>
</span></li>
<li><div>
<code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;">아래는 위 병렬 Training 이 수행되는 동안의 Yarn Batch Job 모니터링 페이지의 모습이다. 일반 Spark Yarn Cluster Job 과 동일한 모양이다.</code></div>
</li>
<li><div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-esdVGEe_GT0/Waf72_I7ysI/AAAAAAAAEeg/zAQA9eTJ6xMTvOMAP_uVsYJnMwLY3BwMwCLcBGAs/s1600/training_yarn.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="636" data-original-width="1075" height="378" src="https://4.bp.blogspot.com/-esdVGEe_GT0/Waf72_I7ysI/AAAAAAAAEeg/zAQA9eTJ6xMTvOMAP_uVsYJnMwLY3BwMwCLcBGAs/s640/training_yarn.png" width="640" /></a></div>
<div>
<code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;"><br /></code></div>
</li>
<li><div class="separator" style="clear: both; text-align: left;">
최중 수행 뒤 결과 메시지는 아래와 같다.</div>
</li>
<li><div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-9GFkdidyICw/Waf8ENM0DMI/AAAAAAAAEek/IoEv-L6qZ_A6PPPdXCdyPCCYWAiT1al0wCLcBGAs/s1600/training_yarn2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="1075" height="356" src="https://2.bp.blogspot.com/-9GFkdidyICw/Waf8ENM0DMI/AAAAAAAAEek/IoEv-L6qZ_A6PPPdXCdyPCCYWAiT1al0wCLcBGAs/s640/training_yarn2.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
</li>
</ol>
<li>inference (using feed-dict)</li>
<ol>
<li>training 이 끝났으므로, inference 즉, 모델의 학습 결과를 확인 해 보자.</li>
<li>수행 스크립트는 아래와 같다.</li>
<li><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;"># hadoop fs -rm -r mnist_model
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 13 \
--executor-memory 22G \
--py-files ./mnist/spark/mnist_dist.py \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.yarn.maxAppAttempts=1 \
--conf spark.executorEnv.LD_LIBRARY_PATH=$LIB_JVM:$LIB_HDFS \
./mnist/spark/mnist_spark.py \
--images mnist/csv/train/images \
--labels mnist/csv/train/labels \
--mode inference \
--model mnist_model \
--output predictions
# to use infiniband, add --rdma</span></span><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">
</span></pre>
</li>
<li>mode 부분과 output 부분만 차이가 있다.</li>
<li>주의할 점은 앞에서 mnist_model 을 training 과정에서 이미 수행하였다면, 상단 hadoop 명령어로 mnist_model 을 지우고 수행해야 한다는 점이다. (hadoop 에서의 경로는 적절히 수정 할 것)</li>
<li>결과는 아래와 같다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Z9C3RI-00Bw/Waf_fg1gE3I/AAAAAAAAEew/2bmuRXMhXRMyoJj_Uuxl2ERNkeiGUFX7gCEwYBhgL/s1600/inference_yarn.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="392" data-original-width="1075" height="232" src="https://1.bp.blogspot.com/-Z9C3RI-00Bw/Waf_fg1gE3I/AAAAAAAAEew/2bmuRXMhXRMyoJj_Uuxl2ERNkeiGUFX7gCEwYBhgL/s640/inference_yarn.png" width="640" /></a></div>
<ol>
<li>최종 결과는 output 으로 지정해준 predictions 안에 존재한다.</li>
<li>아래 명령어로 내용을 살펴보자.</li>
<ol>
<li>hadoop dfs -cat predictions/part-00000</li>
<li>결과는 아래와 같다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-pmB2Xe8T8HQ/WagAhprRcyI/AAAAAAAAEe4/maiHGRn2lJ8Di_bTJVnbM6K3PMoaB0UwgCLcBGAs/s1600/output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="376" data-original-width="603" height="398" src="https://2.bp.blogspot.com/-pmB2Xe8T8HQ/WagAhprRcyI/AAAAAAAAEe4/maiHGRn2lJ8Di_bTJVnbM6K3PMoaB0UwgCLcBGAs/s640/output.png" width="640" /></a></div>
</ol>
</ol>
</ol>
<li>training (using queueRunners)</li>
<ol>
<li>feed-dict 대신 I/O 병목에 더 강점이 있는 queueRunners 모드를 사용해 보자. 여기서는 TFRecords 를 이용하여 좀더 Tensorflow Low Level training 을 할 예정이다.</li>
<li>수행 스크립트는 아래와 같다.</li>
<li><pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;"># hadoop fs -rm -r mnist_model
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 13 \
--executor-memory 22G \
--py-files ./mnist/spark/mnist_dist.py \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.yarn.maxAppAttempts=1 \
--conf spark.executorEnv.LD_LIBRARY_PATH=$LIB_JVM:$LIB_HDFS \
--jars hdfs:///user/moneymall/tensorflow-hadoop-1.0-SNAPSHOT.jar \
./mnist/spark/mnist_spark.py \
--images mnist/tfr/train \
--format tfr \
--mode train \
--model mnist_model
# to use infiniband, add --rdma</span></span><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">
</span></pre>
</li>
<li>CSV 대신 tfr 즉, TensorFlow Records 를 직접 사용할 예정이다.</li>
<li><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px; white-space: pre;">기존 hadoop model output 을 제거한 후 수행하자.</span></span></li>
<li><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px; white-space: pre;">여기서 주의할 점은 2017년 8월 기준 official manual 에 --jars 옵션이 빠져 있어 에러가 난다는 점이다.
위처럼 jars 옵션으로 앞서 만들었던 tensorflow-hadoop-1.0-SNAPSHOT.jar 파일을
포함해 주어야 위 스크립트가 정상 동작 한다.</span></span></li>
<li><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px; white-space: pre;">최종 결과는 아래와 같다.</span></span></li>
<ol>
<li><span style="color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px; white-space: pre;"><a href="https://2.bp.blogspot.com/-pmB2Xe8T8HQ/WagAhprRcyI/AAAAAAAAEe4/maiHGRn2lJ8Di_bTJVnbM6K3PMoaB0UwgCLcBGAs/s1600/output.png" imageanchor="1" style="font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center; white-space: normal;"><img border="0" data-original-height="376" data-original-width="603" height="398" src="https://2.bp.blogspot.com/-pmB2Xe8T8HQ/WagAhprRcyI/AAAAAAAAEe4/maiHGRn2lJ8Di_bTJVnbM6K3PMoaB0UwgCLcBGAs/s640/output.png" width="640" /></a></span></span></li>
</ol>
</ol>
</ol>
</ol>
</ol>
<div>
<span style="color: #24292e;"><b><u style="background-color: yellow;">[결론]</u></b></span></div>
<div>
<span style="color: #24292e;"><br /></span></div>
<div>
<span style="color: #24292e;">우선, PySpark 와 Tensorflow 를 섞어 쓸 수 있는게 매우 편하다. Python 전처리 수시간 걸리던게 PySpark 로 수분안에 끝나는 묘미를 맛보면, 이전으로 돌아가기가 쉽지 않다.<br />익숙한 Jupyter Notebook 이나 Zepellin Notebook 환경 모두 tensorflowOnSpark 연동이 가능한 것도 장점이다.</span><br />
<span style="color: #24292e;"><br /></span></div>
<div>
<span style="color: #24292e;">그리고, 대부분의 기존 Tensorflow 모델을 10줄 미만으로 수정하여, 병렬화 가능하다는 장점이 돋보인다. Spark 클러스터는 Yarn Cluster Mode 만을 지원하고 있다. 그리고, CPU 병렬 뿐만 아니라 GPU 병렬도 지원한다.</span></div>
<div>
<span style="color: #24292e;"><br /></span>
<span style="color: #24292e;">또한, Spark Streaming Mode 도 지원한다. 즉, 앞에 Kafka Cluster Queue 등을 놓으면, site 전체의 Click Stream 등 초 Heavy 트래픽에 대한 input 을 염두하며, 실시간 realtime inference가 되는 사이트 실시간 개인화 모델등을 만든다고 할때, 그러한 연산에 있어서의 Spark-streaming Layer 의 강점을 Deep Learning 모델에도 적용가능하리라 여겨진다.</span><br />
<span style="color: #24292e;"><br /></span></div>
<div>
<span style="color: #24292e;">설치는 Official Document 가 그런데로 상세히 나와 있는 편이지만, Legacy 가 최신 버전일때는 약간의 에러들이 발견되었고, 그래서 위처럼 설치 과정이 좀 길어졌다, 그 경우 소스 레벨 debub 및 log 를 확인해가며 설치를 해야 마무리가 되었던 부분은 약간 아쉬웠다. 즉, 너무 최신 Legacy 버전이 아닌 Official 버전을 사용하여 설치하면 좀더 쉽게 설치가 가능 할 것이다. 그리고, github 에 답변이나 issue 해결 commit 이 거의 매일 올라오고 갱신되는 편이라, 믿음이 간다. elaphs 는 설치해서 테스트 하다가 포기한게, issue 에 대한 대응이 너무 느렸다.</span></div>
<div>
<span style="color: #24292e;"><br /></span></div>
<div>
<span style="color: #24292e;">BigDL 역시 SparkML 과 유사한 패턴으로 딥러닝을 할 수가 있어, general 한 모델을 만들때는 더 편할 수 도 있다. 그리고, 자사의 BigData Cluster 가 아직 GPU 는 없고, intel cpu 기반이라고 하다면, BigDL 이 tensorflowOnSpark 보다 좀더 성능이 잘 나올 수 있다.</span></div>
<div>
<span style="color: #24292e;">하지만, 다양한 고급 모델을 지원하지 못한다는 단점이 분명히 존재한다.</span></div>
<div>
<span style="color: #24292e;"><br /></span></div>
<div>
<span style="color: #24292e;">BigData + Deep Learning 콜라보레이션 아키텍처에 대한 고민은 거의 반년 이상 했던거 같다. 여러가지를 실험해 보았고, 결론은 BigDL 과 TensorflowOnSpark 두개로 거의 확정하였다. 둘은 장단점이 극명하여, 어느 하나로 치우칠 필요 없이, 선택적으로 사용하려고 한다.</span></div>
<div>
<span style="color: #24292e;"><br /></span></div>
<div>
<span style="color: #24292e;">좀더 실무레벨에서 많은 경험을 한 후 다시 한번 포스팅 해볼 기회가 생겼으면 하는 주제였다.</span></div>
<div>
<span style="color: #24292e;"><br /></span></div>
<ol><ol><ol><ol><ol><ol><ol>
</ol>
</ol>
</ol>
</ol>
</ol>
</ol>
</ol>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com15tag:blogger.com,1999:blog-8166686140676460430.post-58827684659842282512017-08-28T18:00:00.000+09:002020-07-02T07:02:42.945+09:00Deep Learning Text NLP with Spark Collaboration발표한지 좀 시간이 지나긴 했지만, 한 두달여 전 Korea Spark Summit Day 에서 내가 발표했던 내용의 슬라이더 전문이다.<br />
<br />
주로 아래 내용을 다루었었다.<br />
<br />
1. Machine Learning Approach vs Deep Learning Approach<br />
2. 한글 Text Classification 문제를 전통적인 Machine Learning 으로 풀어보았을때의 장단점 및 성능 수치.<br />
3. 동일한 문제를 Deep Learning 으로 풀어보았을때의 장단점 및 성능 수치.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-rUxg5LezXS0/WaPa0gZfz5I/AAAAAAAAEbA/eUorYneyQ2IIrkQANcAeYYsaO6VKQXawQCLcBGAs/s1600/alogorithm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="341" data-original-width="621" height="350" src="https://4.bp.blogspot.com/-rUxg5LezXS0/WaPa0gZfz5I/AAAAAAAAEbA/eUorYneyQ2IIrkQANcAeYYsaO6VKQXawQCLcBGAs/s640/alogorithm.png" width="640" /></a></div>
4. 한글 Text Classification 문제를 다양한 알려진(좀 유명한) Approach 로 각각 접근 했을때, 실무 데이타 기준(IMDB 등 논문에서 등장하는 데이타보다 훨씬 양이 많고, 훨씬 어려운 문제(138지 Top 1 분류)) 성능 수치 비교.<br />
5. Production Level , Real World 의 Big Data Scale Large Data Set 을 가지고 Deep Learning 프로젝트를 진행하는 경우에 접하게 되는 다양한 문제점들.<br />
6. Spark 를 활용하여 Big Data Scale Deep Learning 을 하는 방법론 소개.<br />
<br />
아래는 해당 내용의 전문이다.<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/G2nRLyttPlWUvd" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/ssusere94328/deep-learning-text-nlp-and-spark-collaboration-text-nlp-spark" target="_blank" title="Deep learning text NLP and Spark Collaboration . 한글 딥러닝 Text NLP & Spark">Deep learning text NLP and Spark Collaboration . 한글 딥러닝 Text NLP & Spark</a> </strong> from <strong><a href="https://www.slideshare.net/ssusere94328" target="_blank">hoondong kim</a></strong> </div>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-87227145946749515972017-08-05T17:37:00.000+09:002017-08-05T17:54:08.990+09:00GCP, AZURE, AWS 그리고 BigQuery, Azure ML Studio, Data Lake 에 대한 단상커뮤니에서 한분이 GCP 그리고 BigQuery 에 대하여 타 시스템과의 비교를 요청하셔서 장문의 답변을 하게 되었다. 해당 내용을 이곳에 옮겨 적어 보았다.<br />
<br />
우선, 서두는 내가 시작하였다. 대략 이런 내용이었다.<br />
<br />
<blockquote class="tr_bq">
<span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px;">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 들의 흥망성쇠 이야기들 이었다.</span></blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-hrxh86RxLYs/WYWCiHUbYvI/AAAAAAAAEZs/w9f1MfPptqIFlz0CPDnLvRvw8decAHUWQCLcBGAs/s1600/3yearsAgo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1261" data-original-width="495" src="https://4.bp.blogspot.com/-hrxh86RxLYs/WYWCiHUbYvI/AAAAAAAAEZs/w9f1MfPptqIFlz0CPDnLvRvw8decAHUWQCLcBGAs/s1600/3yearsAgo.png" /></a></div>
<span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px;"><br /></span>
<span style="background-color: white; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px;"><br /></span>
이후 여러 말들이 오가던 중 질문...<br />
<br />
Question ) <span style="background-color: #f6f7f9; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 12px;">전문가께 GCP, 빅쿼리에 대한 간단한 인상? 감상을 여쭤도 될까요? 자투리 시간에 공부해볼까 하는 중입니다.</span><br />
<br />
<br />
그리고, 답변이다. 너무 장문이었나??? 여튼 아까워서 이곳에 옮겨 적었음.<br />
<br />
Answer )<br />
<blockquote class="tr_bq">
<br />
<span style="background-color: #f6f7f9; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 12px;"><span style="font-family: inherit;">요즘 IaaS 는 AWS나 Azure 나 비슷비슷하죠. 가격도 거의 판박이구요. 단, AWS 가 커뮤니티나 3rd Party 쪽 Pre Built 이미지가 많아서, IaaS 에서는 좀 앞서는거 같구요. GCP는 셋중에 좀 밀리구요. PaaS 로 넘어가면, Azure 가 AWS 보다 종류도 많고, 완성도도 좀더 높은게 확실히 느껴지구요. GCP 의 경우는 Serverless 아키텍처에서 카날리 배포 하는 부분이랄지, Big Query 부분 등이 확실</span></span><span style="background-color: #f6f7f9; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 12px;"><span style="font-family: inherit;"><span style="font-family: inherit;">히 차별 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 에서는 대부분 돌지 않거나, 매우 느려집니다.) </span><br /><span style="font-family: inherit;">또한, 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 을 구성하면 되구요.</span></span></span><span style="background-color: #f6f7f9; color: #1d2129; font-family: "helvetica" , "arial" , sans-serif; font-size: 12px;"><span style="font-family: inherit;"><span style="font-family: inherit;">또한, 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 을 구성하면 되구요.</span></span></span></blockquote>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-gBOxypJxW7o/WYWDf_b2JUI/AAAAAAAAEZ0/JsKJ2uecdbgw5VURL0g3PIarU_vtDR6xACLcBGAs/s1600/3yearsAgo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1002" data-original-width="493" src="https://1.bp.blogspot.com/-gBOxypJxW7o/WYWDf_b2JUI/AAAAAAAAEZ0/JsKJ2uecdbgw5VURL0g3PIarU_vtDR6xACLcBGAs/s1600/3yearsAgo2.png" /></a></div>
<br />
참고로 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 하이퍼파라미터 옵티마이제이션 및 앙상블 등을 꽤할 수 있다.<br />
<br />
아래는 HDInsight 위에서 BigDL 을 쉽게 설치하는 가이드 문서 이다.<br />
<br />
<a href="https://software.intel.com/en-us/articles/deploying-bigdl-on-azure-data-science-vm">https://software.intel.com/en-us/articles/deploying-bigdl-on-azure-data-science-vm</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-d5dS3bC4dwE/WYWHIO8nUDI/AAAAAAAAEaA/rFBmwNo_RY0VZgyWZ6oi2zFN0WWVzfpHQCLcBGAs/s1600/3yearsAgo3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1063" height="640" src="https://2.bp.blogspot.com/-d5dS3bC4dwE/WYWHIO8nUDI/AAAAAAAAEaA/rFBmwNo_RY0VZgyWZ6oi2zFN0WWVzfpHQCLcBGAs/s640/3yearsAgo3.png" width="424" /></a></div>
<br />
<br />
<br />
<br />
<br />HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-5957354266051537642017-05-10T14:27:00.002+09:002017-05-10T15:49:04.380+09:00QnA Chabot (or Text Classification) 성능 향상 Tip요즘 블로깅 할시간이 없어, 대신 최근 Facebook 의 질문에 조금 장문으로 답변한 내용을 기록으로 남겨 보았다. 사실, 조금 시간이 있다면, 아래 짧게 짧게 언급했던것들이 실제로 테스트 했던 데이타로 어떻게 얼마나 성능향상에 기였 했는지, 실 사례들을 함께 공유하고 싶으나... 시간이 없어서 TT.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-kuT0Oebbqlo/WRK31zeMRYI/AAAAAAAAEWM/yyf9HRm_BHMk-L2yllJ6vMM-q85iocmTQCLcB/s1600/chatbot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-kuT0Oebbqlo/WRK31zeMRYI/AAAAAAAAEWM/yyf9HRm_BHMk-L2yllJ6vMM-q85iocmTQCLcB/s1600/chatbot.png" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-82844490747678153082017-03-14T10:39:00.000+09:002017-03-14T10:39:25.770+09:00Azure 상에서 Tensorflow GPU instance 이용하기Community 에 한분께서 아래와 같이 질문을 주셨습니다. 이에대한 답변을 Facebook 에 작성하다 보니, 글이 너무 길어지는 듯 하여, 이곳에 옮겨 적어 봅니다.<br />
<br />
<b>Q) AzureML에서 Tensorflow를 연동하는 방법을 아시는 분이 계신가요-제가 아는 범위에선 Theano 연동하는 정도만이네요 ㅠㅠ</b><br />
<br />
<b style="background-color: yellow;">A) 답변입니다.</b><br />
<br />
<div class="MsoNormal">
안녕하세요<span lang="EN-US">. Data Platform MVP </span>인 김훈동입니다<span lang="EN-US">. </span>네 <span lang="EN-US">Azure </span>상에서<span lang="EN-US">
Tensorflow </span>를 쓰는 몇가지 방법이 있습니다<span lang="EN-US">. </span>질문에서<span lang="EN-US"> AzureML </span>이라고 언급 주셨는데<span lang="EN-US">, Azure ML Studio </span>등에서의
사용이 아닌<span lang="EN-US"> Azure </span>상에서의<span lang="EN-US"> Tensorflow </span>구동
이라고 질문을 이해했습니다<span lang="EN-US">. Azure ML Studio </span>에서는<span lang="EN-US">
Tensorflow </span>를<span lang="EN-US"> Azure </span>에 구축한 별도<span lang="EN-US">
Instance </span>에 원격 실행 컴멘드를 날려서<span lang="EN-US"> Training </span>을 시키고<span lang="EN-US">, Tensorflow</span>의<span lang="EN-US"> Serving Layer </span>를 이용하여<span lang="EN-US">, Input </span>에 대한<span lang="EN-US"> Output </span>을<span lang="EN-US"> Restful </span>하게 받아 Azure ML Studio 에서 연동하는 방법이 있을 것입니다<span lang="EN-US">. </span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
아래부터는<span lang="EN-US"> Azure </span>에<span lang="EN-US"> Tensorflow Cluster(GPU 포함)</span>를 구축하는
방법론입니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(1)<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->가장쉽게<span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Azure Instance Gallery </span>에서
<span lang="EN-US">Deep Learning Toolkit for DSVM </span>이미지 <span lang="EN-US">VM</span>을
사용하는 방법<span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>i.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">OS </span>가<span lang="EN-US">
Windows 2012 RC2 </span>입니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>ii.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">GPU </span>사용이 가능합니다<span lang="EN-US">.(Region</span>을<span lang="EN-US"> east US </span>등으로 하면<span lang="EN-US"> N-Series</span>가 보입니다<span lang="EN-US">.)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>iii.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">CNTK, Keras, Tensorflow, mxnet </span>가
모두 기본 세팅되어 있고<span lang="EN-US">, MS R, Jupyter Notebook, Python Anaconda</span>등이
설치되어 있으며<span lang="EN-US">, Visual Studio </span>의<span lang="EN-US"> Data Science
</span>툴들과<span lang="EN-US"> Spyder IDE </span>등이 세팅되어 있고<span lang="EN-US">, </span>요즘
도전적인 <span lang="EN-US">Data Scientist </span>들에게 <span lang="EN-US">Hot</span>한<span lang="EN-US"> Julia Lang </span>개발환경까지 세팅되어 있습니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>iv.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Jupyter Notebook </span>을 열면<span lang="EN-US"> Tensorflow, CNTK </span>등의<span lang="EN-US"> Example </span>이 담긴<span lang="EN-US"> Notebook </span>들이 폴더 별로 정리되어 구동됩니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>v.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Ubuntu </span>에서 쓰시다가<span lang="EN-US"> Windows </span>위에서 사용하는 경우 호환문제를 걱정하시는 분들이 간혹 계시는데<span lang="EN-US">,
UTF8 </span>한글 부분과 일부 <span lang="EN-US">Old </span>스타일 <span lang="EN-US">CSV </span>핸들링
패키지를 제외하고<span lang="EN-US">, </span>문제가 되는 경우는 별로 없습니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-xcQegJaWCiM/WMdIrgRiHPI/AAAAAAAAESg/6nO82EqveMISqLVZdJWSHLGQHB5I-BPkACLcB/s1600/DSVM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="526" src="https://2.bp.blogspot.com/-xcQegJaWCiM/WMdIrgRiHPI/AAAAAAAAESg/6nO82EqveMISqLVZdJWSHLGQHB5I-BPkACLcB/s640/DSVM.png" width="640" /></a></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(2)<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Ubuntu </span>가 편하다면<span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Ubuntu Instance </span>에 기본 <span lang="EN-US">Tensorflow </span>가 세팅된 인스턴스는 아직 존재하지 않는 것으로 보입니다<span lang="EN-US">. </span>제가
하나 만들어서 올릴까봐요<span lang="EN-US">. ^^<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">B.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->하지만<span lang="EN-US">, Tensorflow </span>설치가 그리 어렵지
않으므로<span lang="EN-US">, Ubuntu VM </span>에 직접 설치하셔도 됩니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">C.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->동남아시아나<span lang="EN-US"> eastUS </span>등에 가셔서<span lang="EN-US"> N-Series </span>를 선택하시면<span lang="EN-US">, GPU Ubuntu VM </span>을 만드실
수 있습니다<span lang="EN-US">. </span>여기서 주의할점은 이상하게<span lang="EN-US"> Ubuntu VM</span>은
디스크<span lang="EN-US"> Type </span>을<span lang="EN-US"> SDD</span>가 아닌 <span lang="EN-US">HDD </span>를 선택해야<span lang="EN-US"> N-Series </span>가 보인다는 점 입니다<span lang="EN-US">. </span>그런데<span lang="EN-US">, </span>최종 만들어진<span lang="EN-US">
Information </span>을 보면<span lang="EN-US"> SSD </span>가 포함되어 있습니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(3)<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Windows10 Instance </span>에 설치하여
사용하는 방법<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Tensorflow 1.X </span>가 정식으로 릴리즈
되면서<span lang="EN-US">, Windows 10 </span>에도 꽤 쉽게 설치가 가능합니다<span lang="EN-US">. <o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">B.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->단<span lang="EN-US">, </span>현재<span lang="EN-US">
Windows </span>는<span lang="EN-US"> 64</span>비트만 지원합니다<span lang="EN-US">. <o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">C.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Anaconda 64</span>비트 설치 후 설치하면 더
쉽습니다<span lang="EN-US">. <o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">D.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->특히<span lang="EN-US"> CUDA </span>나<span lang="EN-US"> cuDNN </span>은<span lang="EN-US"> Windows </span>가 <span lang="EN-US">Linux</span>보다
훨씬 설치가 간단합니다<span lang="EN-US">. <o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>i.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">CUDA </span>와<span lang="EN-US">
cuDNN </span>설치 후 내컴퓨터<span lang="EN-US">-></span>우클릭<span lang="EN-US">-></span>속성<span lang="EN-US">-></span>환경변수 가서 <span lang="EN-US">path </span>만 잡아 주면 끝<span lang="EN-US">…<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">E.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Pip </span>로<span lang="EN-US">
GPU </span>버전 설치할 때<span lang="EN-US">, 2</span>월
말까지만 해도<span lang="EN-US">, whl </span>파일 경로가 win_<span lang="EN-US">x86_64.whl </span>요런식으로
되어 있었고<span lang="EN-US">, </span>해당 파일은 오류가 있었는데<span lang="EN-US">, </span>현재<span lang="EN-US"> win_amd64.whl </span>로 바뀌어 있구요<span lang="EN-US">. </span>그 파일이 원래<span lang="EN-US"> Windows </span>에서 오류없이 깔리는 것으로<span lang="EN-US"> Blog </span>등에서 공유되었던
파일입니다<span lang="EN-US">. </span>현재는 공식<span lang="EN-US"> install guide </span>문서가
수정되어 있습니다<span lang="EN-US">. (</span>최근에 수정되었네요<span lang="EN-US">…</span><span style="text-indent: -26.6667px;">2017년 3월 현재.</span><span style="text-indent: -20pt;">)</span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(4)<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Docker </span>사용방법<span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->영재<span lang="EN-US">MVP</span>님께서 말씀해 주신 것 처럼<span lang="EN-US"> Docker</span>를 이용할 수도 있습니다<span lang="EN-US">. Docker </span>가<span lang="EN-US"> VM</span>보다 유리한 점들이 분명 있죠<span lang="EN-US">. </span>장단점이 있는 것 같습니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US">(5)<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->좀더 고급스럽게 사용하는 방법<span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->요즘 제가 열심히 실험하고 있는 방법입니다<span lang="EN-US">. </span>실무
시나리오 사용성 검증이 끝나면 블로그 하고 공유 드리도록 하겠습니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">B.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">HDInsight </span>와<span lang="EN-US"> Spark Cluster </span>가 필요합니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>i.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">HDinsight </span>에<span lang="EN-US"> Spark Cluster </span>가 기 세팅되어 있는<span lang="EN-US"> Instance </span>를
구동합니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>ii.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->추가로<span lang="EN-US"> Tensorflow </span>와<span lang="EN-US"> Keras </span>를 설치합니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>iii.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->오픈소스인<span lang="EN-US"> elephas </span>를 설치합니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span>iv.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]-->실험해보고 있는데요<span lang="EN-US">. </span>위 조합에서는<span lang="EN-US"> Tensorflow </span>와<span lang="EN-US"> Spark </span>의 강점을 조합할 수 있고<span lang="EN-US">, </span>추가로<span lang="EN-US">, Tensorflow Model</span>에 대하여 아래와 같은 것들이
가능합니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 100.0pt; mso-list: l0 level4 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">1.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US" style="color: #24292e; font-family: "Segoe UI","sans-serif"; font-size: 12.0pt; line-height: 115%; mso-fareast-font-family: 굴림; mso-font-kerning: 0pt;"><a href="https://github.com/maxpumperla/elephas#usage-of-data-parallel-models"><span style="color: #0366d6; text-decoration: none; text-underline: none;">Data-parallel
training of deep learning models</span></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 100.0pt; mso-list: l0 level4 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">2.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US" style="color: #24292e; font-family: "Segoe UI","sans-serif"; font-size: 12.0pt; line-height: 115%; mso-fareast-font-family: 굴림; mso-font-kerning: 0pt;"><a href="https://github.com/maxpumperla/elephas#distributed-hyper-parameter-optimization"><span style="color: #0366d6;">Distributed hyper-parameter optimization</span></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 100.0pt; mso-list: l0 level4 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">3.<span style="font-family: "Times New Roman"; font-size: 7pt; font-stretch: normal; font-variant-numeric: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US" style="color: #24292e; font-family: "Segoe UI","sans-serif"; font-size: 12.0pt; line-height: 115%; mso-fareast-font-family: 굴림; mso-font-kerning: 0pt;"><a href="https://github.com/maxpumperla/elephas#distributed-training-of-ensemble-models"><span style="color: #0366d6; text-decoration: none; text-underline: none;">Distributed training
of ensemble models</span></a></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<br />
<div class="MsoNormal">
답이 잘 되었으면 좋겠네요<span lang="EN-US">. ^^<o:p></o:p></span></div>
<br />HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-27184675630723044312017-02-28T22:26:00.004+09:002017-03-04T10:19:05.942+09:00MS Cognitive Service - OCR API 활용기OCR(<span style="background-color: white; color: #222222; font-family: "apple sd gothic neo" , "arial" , sans-serif; font-size: 16px;">Optical character recognition</span>) 은 PDF ,출력 Scan 된 문서나 아날로그 Ouput , 상품 카달로그 이미지, 혹은 사진 등 에서 문자영역을 인식하고, Image Processing 이나 deep learning 기술을 이용, digital 화 가능한 문자를 추출하는 기술이다.<br />
<br />
한때(불과 몇년 전만 해도) 해당 기술은 그리 정확도가 높지 않아, Scan된 문서나, 명함에서의 Text 추출 정도에서만 사용되었으나, 최근에는 OCR에 있어서도 Deep Learning 기술이 이용되면서, 그 정확도가 매우 향상되었다.<br />
<br />
현재는 실시간 사진 업로드 및 스마트폰 카메라와 연동된 다양한 Business Model 들이 나오고 있는 추세이다.<br />
<br />
OCR 관련 하여서는 다양한 API 나 제품 솔루션이 있으며, Open Source 또한 존재한다. 뒤에서 언급하겠지만, Google API 는 Github 에 Source 가 Open 되어 있다. 하지만, OCR 은 훌륭한 Open Source 가 있어도, Open API 가 좀더 유리한 분야 중 하나이다. Training 을 위한 Data 확보가 쉽지 않은 분야이기 때문이다. <br />
<br />
Open API 및 제품 솔루션 중 가장 알려진 솔루션은 아래 세가지 이다.<br />
각각이 장단점이 있는데, 간략하게 비교해보면 아래와 같다.<br />
<ol>
<li>Google OCR </li>
<ol>
<li>github 에 소스가 오픈되어 있다.</li>
<li>적은 양이지만, Data 도 있다.</li>
<li>성능은 복합적인 이미지 내 문자의 경우 정확도 60% 정도.</li>
<li>[장점] 소스가 오픈되어 있어, 기술 자체를 내재화 하고자 할때 좋은 시작 솔루션이 될 수 있음. Open API 도 있는데, 가격대가 4단계로 세분화 되어 있음.</li>
<li>[단점] 한글의 경우 성능이 그다지 좋진 않음. 전문 솔루션 회사를 인수. 인수 시점이 꽤 되서, 해당 솔루션이 Deep Learning 기반은 아닌듯.</li>
</ol>
<li>MS OCR</li>
<ol>
<li>Open API 형태로 Cloud 사용량 Base 과금.</li>
<li>Document 화가 잘 되어 있음.</li>
<li>성능은 복합적인 이미지 내 문자의 경우 정확도 85% 정도. 스캔 문서의 경우 정확도 90% 정도.</li>
<li>[장점] 한글의 경우에도 성능이 꽤 좋은 편. 복잡한 이미지 내 문자이든, 스캔문서의 문자이든 고르게 성능이 나옴. </li>
<li>[단점] 구글이 4단계 볼륨별 과금인 반면 MS 는 3단계. 3단계 까지는 가격이 Google 과 동일하나, 4단계 초 대 용량은 Google 이 더 저렴한 요금제 제공. 소스는 없음.</li>
</ol>
<li>Abbyy</li>
<ol>
<li>설치형 제품.</li>
<li>코어당 라이센스 혹은 서버당 트랜잭션 Limit 라이센스</li>
<li>성능은 복합적인 이미지 내 문자의 경우 인식이 Skip 되는 경우 많음 정확도 70% 정도. 스캔 문서의 경우 정확도 95% 정도.</li>
<li>[장점] 스캔문서의 경우 정확도 가장 높음. 다양한 부가 Tool 제공. </li>
<li>[단점] 설치형 제품이라 비쌈. 복합적인 이미지 내부의 활자의 경우 정확도 떨어지고, 활자를 skip 해 버림. 내부 하드웨어를 구비해야 함. Linux 버전은 관리 및 개발 편의 Tool이 빈약함.</li>
</ol>
</ol>
<div>
위 3가지가 각각 장단점이 있으나, 아래는 Open API 방식을 제공하는 MS OCR 과 Google OCR 의 성능 비교 예시이다.</div>
<div>
<br /></div>
<div>
1. MS OCR API</div>
<div>
- 좌측 원본 이미지, 우측 OCR Text</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-1zvE2yjfcKc/WLoS7RMf-NI/AAAAAAAAERk/qYWq71LmJ2YzQPzle_ylJPn_umguqo9fQCLcB/s1600/K-002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="436" src="https://3.bp.blogspot.com/-1zvE2yjfcKc/WLoS7RMf-NI/AAAAAAAAERk/qYWq71LmJ2YzQPzle_ylJPn_umguqo9fQCLcB/s640/K-002.png" width="640" /></a></div>
<br />
<br /></div>
<div>
2. Google OCR API</div>
<div>
- 위 동일 이미지에 대한 OCR Text<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-ymlLRV1YZ2g/WLoS_NIL8gI/AAAAAAAAERo/x1rwq57lxbouD-MUq0yJXmSurI67RK25gCLcB/s1600/K-003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="https://2.bp.blogspot.com/-ymlLRV1YZ2g/WLoS_NIL8gI/AAAAAAAAERo/x1rwq57lxbouD-MUq0yJXmSurI67RK25gCLcB/s640/K-003.png" width="640" /></a></div>
<br />
<br /></div>
<div>
위 처럼 이미지 내에서 활자를 뽑아냄에 있어, MS 가 Google 의 그것 보다 훨씬 좋은 성능을 보여 준다.</div>
<div>
<br /></div>
<div>
MS API 는 Restful API 의 Return String 이 JSON 형태이다. 해당 JSON 으로 부터 Plain Text 뿐 아니라, 각 문자들의 그룹별(이미지 이므로 문단이 그룹단위로 표현 가능) 위치 좌표를 뽑을 수 있다.(단어 단위의 좌표 또한 제공하고 있다.)</div>
<div>
<br /></div>
<div>
아래는 각각을 Parsing 하여 추출하는 Source 이다. MSDN Example 에는 아래와 같은 Parsing Source 예시가 존재하지 않아, 간단하게 만들어 본 예이다. JSON Parser 를 써도 되겠지만, JSON Structure 구조가 패턴화 되어 있어, 아래와 같은 트리구조 loop 패턴으로 코딩 구현하면, 어떤 Language 에서든 손쉽게 원하는 정보 추출이 가능하다.</div>
<div>
<br /></div>
<div>
1. Plain Text 추출 Source (Example)</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-nhRjtemj5zo/WLoVymCrvfI/AAAAAAAAER0/z9ZZGu3HHEsC8yf5tVUUnm79AiC2ivI7ACLcB/s1600/K-004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://3.bp.blogspot.com/-nhRjtemj5zo/WLoVymCrvfI/AAAAAAAAER0/z9ZZGu3HHEsC8yf5tVUUnm79AiC2ivI7ACLcB/s640/K-004.png" width="640" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
2. 문단별 좌표 포함 Text 추출 Source (Example)</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-k3bkEDVHkVE/WLoV2hxWjLI/AAAAAAAAER4/usTCGr1lrd8tLU_1Q2jWeTlBfsyNOiinQCLcB/s1600/K-005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://2.bp.blogspot.com/-k3bkEDVHkVE/WLoV2hxWjLI/AAAAAAAAER4/usTCGr1lrd8tLU_1Q2jWeTlBfsyNOiinQCLcB/s640/K-005.png" width="640" /></a></div>
<br /></div>
<div>
<br /></div>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-79217700413912395622017-02-28T22:26:00.001+09:002017-08-05T17:59:34.717+09:00Spark Machine Learning - Deep Dive ( and Deep Learning )2017년 2월 두번의 Spark Machine Learning 및 Deep Learning 관련 Speaking 을 했다.<br />
<div>
<ol>
<li>스사모 팍스 스터디 모임.</li>
<ol>
<li>2017년 2월 20일</li>
<li>Spark 로 하는 Machine Learning 실무에서의 Pain Point 와 그 극복 방법</li>
<li>MS R on Spark, Tensorflow(+ Keras) on Spark, Python scikit-learn on Spark 등 다양한 Machine Learning 및 Deep Learning 도구들을 Spark 와 hybrid 하게 사용하는 방법</li>
</ol>
<li>대한민국 개발자 커뮤니티 데이.</li>
<ol>
<li>앞선 팍스 스터디 모임 내용과 다소 겹치지만, 좀더 고찰 내용에 치중했다.</li>
<li>빅데이타 개발자 혹은 개발자 Base 머신러닝 Data Scientist 가 AI시대에 임하는 자세. 등등...</li>
</ol>
</ol>
<div>
위 두 모임에서의 발표 내용을 Merge 하여 슬라이드로 만들어 보았다.</div>
</div>
<div>
<br /></div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/DGUz0ZX0A0TGrc" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/ssusere94328/spark-machine-learning-deep-learning" target="_blank" title="Spark machine learning & deep learning">Spark machine learning & deep learning</a> </strong> from <strong><a href="https://www.slideshare.net/ssusere94328" target="_blank">hoondong kim</a></strong> </div>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-75467964823095059742016-12-31T23:58:00.001+09:002017-01-11T09:37:53.262+09:00MS R(구 Revolution R) on Spark - 설치 및 가능성 엿보기(feat. SparkR)BigData Scale Data 분석 및 활용 업무를 하다보면, 도구나 사용 언어, 사용 기술 등에 있어 여러가지 선택의 기로에 서게 되는 경우가 종종 있다.<br />
<br />
물론 혹자는 특정 언어나 특정 기술로 많은 것을 처리하는 것을 선호하기도 하지만(전문성 증대, 기술의 장인정신 측면에서 이 방식의 유리한 점이 존재한다.), 혹자는(나를 포함) 다양한 언어나 기술을 섞어 쓰면서, 처한 상황(Problem)에 가장 최적화된 기술이나 언어로 유연하게 접근하는 것을 선호하기도 한다.<br />
<br />
그러한(후자) 측면에서 보았을때,<b style="text-decoration: underline;"> R은 다양한 기술을 섞어 쓰는 BigData Scientist</b>(혹은 BigData 개발자나 Machine learning 개발자)<b style="text-decoration: underline;"> 에게는 참 계륵 같은 기술이었다.</b> 소위 보편적인 Data 모델러들은, BigData Scientist 보다 R(SAS, Matlab, SPSS 포함)을 더 잘 다루는 것이 일반적이기도 하거니와, 그들과 Co-Work 접근을 해야 하는 경우는, 이미, R이나 SAS 로 무언가 문제가 직면되어 있는 경우가 많기 때문이다. BigData Scale을 다루는 경우이거나, Heavy 한 Machine Learning 작업이 필요하거나, Deep learning 접근이 필요한 경우가 그러한 경우의 일예라 할 수 있다.<br />
<br />
이 경우 서로가 잘하는 영역을 분담하려고 하기 시작하면, R 이외의 다양한 특화 대체 기술을 선택하는 경우가 많은데, 그럼에도 불구하고 R을 버릴수 없는 이유는(앞서 계륵이라고 표현하였다.), R로 만들어진 정교한 모델들이(비록 셈플 데이타만 수행된다 손 치더라도) R이외의 기술들에서는 구현체가 완벽하지 않거나, R에서 쉽게 구현된 모델이 다른 기술에서는 구현이 녹록치 않은 경우가 너무나도 많기 때문이다.<br />
<b><u><br /></u></b><b><u>BigData Scale 모델링 Project에서 자주 접하는 시나리오는 아래와 같다.</u></b><br />
<br />
<ol>
<li>순수 모델러들이 R이나 SAS 로 최적화된 알고리즘을 찾아낸다.</li>
<li>셈플 데이타 혹은 전수로 데이타를 돌려보고, 각종 파라미터나 로직을 거의 완성한다.</li>
<li>But, 모델이 도는데 3박 4일 이상이 걸리거나, 전수 데이타로 돌리는 것 자체가 불가능하다.</li>
<li>BigData 팀으로 Co-Work 요청이 들어온다. 즉, R 모델을 다른 기술을 이용하여 포팅하는 협의가 시작된다.</li>
<li>SparkML 으로 우선 포팅 가능성을 타진한다.</li>
<li>초대용량의 경우 수십~수백대의 Spark Cluster 위의 SparkML 로도 답이 안나오는 경우가 많은데 이때는 1차로 Mahout 의 구버전으로 Hadoop Map/Reduce 경유 수행이 가능한지 검토한다.</li>
<li>SparkML 이나 Mahout 으로 구현이 쉽지 않은 복잡한 복합 모델의 경우는 제삼의 기술을 검토한다. Weka, PredictionIO, H2O 등등... 하지만 이 프레임워크들은 좀 난잡해서 별로 선호하진 않는다. 오히려 아래 방식을 좀더 먼저 검토한다.</li>
<li>Spark, Mahout 계열에 없거나, Method 가 빈약한 경우 Python을 뒤져본다. SparkML 은 기본 메소드는 있는데, 고급 옵션들이 아예 구현이 안되어 있는 경우가 많다. 예를 들어 Spark ML의 Word2Vec 에는 기본 Method 외에 다양한 고급 활용 메소드들이 거의 존재하지 않아 일일이 구현을 해주어야 하고, FPGrowth 등은 Lift 값 관련 Method가 없어 이를 구할때, 개발자가 수식을 일일이 구현 해줘야 가능하다. 반면에 R이나 Python 들은 논문에 언급된 대부분의 기법들은 거의 구현이 되어 있는 경우가 많다. <b><u>이 시점에 R을 보지 않고, Python 을 보는 이유는, SAS 가 그러하듯이 Python 은 메모리에 올려놓고 계산하지 않고, 머신 1대가 오래 걸리더라도 꾸역 꾸역 계산을 하긴 해내기 때문이다.(뒤에 이 부분에 있어서의 R의 역습을 언급하겠다.)</u></b> 머신 1대가 담기 힘든 용량이면 Hadoop 같은 공유 저장소에 올려 놓고 loop 를 돌리면, 어쨋든 무한 루프를 돌면서도 뻗지 않고 돌아는 간다.</li>
<li>8의 기술이 죽지는 않지만, 1대라 너무 너무 오래걸릴때는 GPU 카드를 꺼내 든다. 모든 알고리즘이 GPU 버전이 존재하는 것은 아니지만, 조금 뒤져보면 github 에 다양한 공유 구현체 들이 가끔 큰 희망을 줄때가 많다. C로 최적화된 Gensim 등의 Python 라이브러리는 굳이 GPU까지 동원하지 않더라도, 1대에서 돌려도 Spark 5~7 대의 성능과 맞먹는 경우가 종종 있다. 어쨋든<b style="text-decoration: underline;"> Python 에는 Spark 에 없는 무수히 많은 알고리즘 중 상당수가 이미 구현된 경우가 왕왕 있다.</b> 그리고 대부분의 알고리즘들이 지원하는 고급 기법들이나 옵션들이 더 풍성하게 구현되어 있다.</li>
<li>Python 이 너무 느릴때도 있다. 병렬 수행이 목마를때도 있다. 이 경우 PySpark 로의 Hybrid 사용 가능성을 타진한다.</li>
<li>PySpark 로도 답이 없는 경우는 TensorFlow 카드를 꺼내 든다. Word2Vec 도 그렇지만, TensorFlow 에는 Deep Learning 류의 거의 대부분과, 상당수의 Machine Learning 알고리즘들이 기본 지원되거나, github 구현체가 이미 존재하는 경우가 왕왕 있다. (deeplearning4j 나 theano, caffe, cntk 등 다른 대안도 존재한다.)</li>
<li>이도 없을 때는 제일 마지막 방법으로 구글링 후 해당 알고리즘의 구현체, 그게 c가 되었건, java 가 되었건을 찾아 내어, scala on Spark, java on Map/Reduce, python on tensorflow 등으로 포팅 가능한지 그 타당성을 타진한다.</li>
</ol>
<br />
<br />
위 12번까지 간 적이 몇번 있었다. 몇해전 (지금은 FPGrowth 라는 걸출한 대안이 있지만..) Spark 초기 버전에서 SparkML에 Apriori 가 없어 Java 구현체를 Spark 에서 돌도록 알고리즘을 포팅했던, 별로 유쾌하지 못했던 경험이 있다. (모든 것에 은총알은 없다. SparkML의 FPGrowth 는 Apriori 알고리즘의 훌륭한 대안이지만, 중 규모의 Large 볼륨 데이타에서 빠르고 병렬성을 훌륭하게 지원하지만... Very High 규모의 데이타의 경우에, 그리고, confidence 를 조금 올려놓고 수행하는 경우, 변동성이 큰 데이타의 경우에, disk 를 쓰기 시작 하면서는 무한 loop 틱한 오랜 수행과 리소스 점유로 Production 에 큰 부하를 주는 경우가 왕왕 있다. 이런 Size 의 Data 에는 Hadoop 경유 연산 등 다른 대안을 찾아야 한다.)<br />
<br />
이쯤에서 항상 드는 생각이, 거의 모든 알고리즘(Deep Learning 류만 빼고)들이 구현되어 있는 R이 병렬 수행되면 얼마나 좋을까 라는 점이다. (위 Spark ML 의 예에서 처럼 모든 경우의 은총알을 바라는 것은 아니다. 단, R on Spark 와 R on hadoop 으로 나누어져 있다는 것 자체가 좀더 유연할 것이라는 기대를 해본다.)<br />
<br />
서두가 좀 길었는데, 아직은 미완의 진행형이긴 하지만, 이러한 측면에서 SparkR 과 MS R(구 Revolution R)의 병렬성 지원을 위한 최근의 행보는 매우 매우 응원을 하는 바이다.<br />
<br />
사실 SparkR은 1.X에서는 실무에서 사용하기가 다소 힘든 정도였고, 2.X가 되면서는 다시 실무 활용이 가능한 정도까지 그 가능성이 열리고 있는데, 하지만 여전히 병렬성을 지원하는 알고리즘들이 극히 적다는 단점을 가지고 있다.(Spark 2.X가 되면서 SparkML과의 연동성 지원이 추가되었다.) 이 측면에 있어, MS R은 과거 상용 Revolution R 을 인수한 엔진을 사용하고 있어, 훨씬 다양한 병렬 수행 메커니즘과 훨씬 다양한 병렬 알고리즘 패키지를 이미 지원하고 있으며, 발전 속도도 매우 빨라진 느낌이다.(이 분야의 대부분 솔루션들이 그러하듯이, 아직 완성형은 아니고 진행형이다.)<br />
<br />
<b><u>SparkR 과 MS R이 접근하는 병렬성 메커니즘 접근 방식(SparkR은 Spark엔진 입장에서 R에 접근해가고 있고, MS R은 R입장에서 Hadoop 과 Spark로 다가가고 있다.)이 다소 틀리고 각각의 방식에 장단점이 있는데, 더욱 좋은 점은 둘을 Hybrid 하게 쓰는 것 또한 가능 하다는 점</u></b>이다.<br />
<br />
아래부터는 On Premise Hadoop ( Apache Hadoop 2.7.1 )과 On Premise Spark ( Apache Spark 2.0.2 )위에서 설치 구동 테스트한 설치 세팅 스크립트 이다. 설치 가이드는 MSDN문서를 참고하였으나, MSDN 을 그데로 따라 설치하면 많은 난관에 봉착하게 된다. 아래는 그 부분들의 해결책 까지를 포함하고 있다.<br />
<br />
<ol>
<li><b>Download</b></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Zsjg0__CHF0/WGfD_LqJATI/AAAAAAAAEOU/ErFGhsZam18CilBQBrtteqauJyjLsMczQCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="446" src="https://2.bp.blogspot.com/-Zsjg0__CHF0/WGfD_LqJATI/AAAAAAAAEOU/ErFGhsZam18CilBQBrtteqauJyjLsMczQCLcB/s640/1.png" width="640" /></a></div>
<ol>
<li>Spark Cluster 를 이용하여 <span lang="EN-US">ScaleR</span>을 돌림에 있어<span lang="EN-US">, Linux 버전 Install</span>을 해야 하는지<span lang="EN-US">, Hadoop 버전 </span>인스톨을 해야 하는지 좀 햇갈렸는데<span lang="EN-US">… Manual </span>을
잘 보다 보면<span lang="EN-US">, for Hadoop </span>을 설치해야 함을 알 수 있다<span lang="EN-US">. </span>즉 위에서 <span lang="EN-US">2</span>번째 버전을 다운받아야 한다<span lang="EN-US">.</span></li>
</ol>
<li><b>설치 참고 메뉴얼</b></li>
<ol>
<li>Linux 버전과 <span lang="EN-US">Hadoop
</span>버전 설치 가이드는 아래 링크에 나와 있다<span lang="EN-US">.</span></li>
<ol>
<li><b><span lang="EN-US" style="color: black; font-family: "calibri" , sans-serif; font-size: 11pt;">R Server Installation for Linux Systems</span></b></li>
<ol>
<li><span lang="EN-US" style="font-family: "calibri" , sans-serif; font-size: 11.0pt;"><a href="https://msdn.microsoft.com/en-us/microsoft-r/rserver-install-linux-server">https://msdn.microsoft.com/en-us/microsoft-r/rserver-install-linux-server</a></span></li>
</ol>
<li><b><span lang="EN-US" style="font-family: "calibri" , sans-serif; font-size: 11pt;">Hadoop installation and configuration for Microsoft R Server</span></b></li>
<ol>
<li><span style="font-family: "calibri" , sans-serif; font-size: 11.0pt;"><a href="https://msdn.microsoft.com/en-us/microsoft-r/rserver-install-hadoop">https://msdn.microsoft.com/en-us/microsoft-r/rserver-install-hadoop</a></span></li>
</ol>
</ol>
<li>Spark 위에서 구동하기 위한 <span lang="EN-US">Getting
Started </span>문서는 아래 문서를 참고하면 된다<span lang="EN-US">.</span></li>
<ol>
<li><a href="https://msdn.microsoft.com/en-us/microsoft-r/scaler-spark-getting-started">https://msdn.microsoft.com/en-us/microsoft-r/scaler-spark-getting-started</a></li>
<li>처음 설치하는 경우라면<span lang="EN-US">, scaler spark getting started </span>를
따라하기 전<span lang="EN-US">, Linux </span>버전이 아닌 <span lang="EN-US">Hadoop </span>버전의
<span lang="EN-US">MS R </span>이 기 설치 되어 있어야 한다<span lang="EN-US">.</span></li>
</ol>
</ol>
<li><b>MS R on Spark 설치(본
설치에서 사용한 버전은 <span lang="EN-US"> MS R
Server for hadoop 9.0.1 </span>임.)</b></li>
</ol>
<br />
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 1. <span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;"> </span></span><!--[endif]--><span lang="EN-US">MS R on Hadoop Package </span>다운로드
후 압축 풀기<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://1.bp.blogspot.com/-KgY_vA4IJrY/WGi1UP3y_qI/AAAAAAAAEOk/U404oCpMz0AikAEJMv_vLrGP0ZG4v5BhACLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="414" src="https://1.bp.blogspot.com/-KgY_vA4IJrY/WGi1UP3y_qI/AAAAAAAAEOk/U404oCpMz0AikAEJMv_vLrGP0ZG4v5BhACLcB/s640/1.png" width="640" /></a></div>
<br /></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-para-margin-left: 0gd;">
<span lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="그림_x0020_4" o:spid="_x0000_i1046" type="#_x0000_t75"
style='width:451.5pt;height:292.5pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div>
<!--[if !supportLists]--><span lang="EN-US"> 2.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Root </span>권한으로 <span lang="EN-US">install </span>스크립트 수행해야 함<span lang="EN-US">.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-DBw8pm4c1ck/WGi1fQjiDbI/AAAAAAAAEOo/7PRt5tvob0ky3DPRR7gXkoSkjhpGFEAxACLcB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://1.bp.blogspot.com/-DBw8pm4c1ck/WGi1fQjiDbI/AAAAAAAAEOo/7PRt5tvob0ky3DPRR7gXkoSkjhpGFEAxACLcB/s640/2.png" width="640" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal" style="margin-left: 38.0pt;">
<span lang="EN-US"><!--[if gte vml 1]><v:shape id="그림_x0020_6" o:spid="_x0000_i1045"
type="#_x0000_t75" style='width:451.5pt;height:124.5pt;visibility:visible;
mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 3.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->설치는 <span lang="EN-US">install.sh -p </span>로 <span lang="EN-US">-p </span>옵션을 주고 실행 함<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US"> </span>첫번째 에러 만남<span lang="EN-US">.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Yj0FVUn33ts/WGi35GAeE9I/AAAAAAAAEO0/zdeXP-crVdYvFZNnDWsrPZTeYMwEc1YiwCLcB/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="506" src="https://4.bp.blogspot.com/-Yj0FVUn33ts/WGi35GAeE9I/AAAAAAAAEO0/zdeXP-crVdYvFZNnDWsrPZTeYMwEc1YiwCLcB/s640/3.png" width="640" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-para-margin-left: 0gd;">
<span lang="EN-US"><!--[if gte vml 1]><v:shape id="그림_x0020_7"
o:spid="_x0000_i1044" type="#_x0000_t75" style='width:451.5pt;height:357.75pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-para-margin-left: 0gd;">
<span lang="EN-US"><!--[if gte vml 1]><v:shape id="그림_x0020_8"
o:spid="_x0000_i1043" type="#_x0000_t75" style='width:451.5pt;height:357.75pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image007.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-para-margin-left: 0gd;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-tIprHc_O76A/WGi4LAB4KcI/AAAAAAAAEO4/gQVRxckSVtAedfV578wWwyqieCQ7ngfCwCLcB/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="506" src="https://4.bp.blogspot.com/-tIprHc_O76A/WGi4LAB4KcI/AAAAAAAAEO4/gQVRxckSVtAedfV578wWwyqieCQ7ngfCwCLcB/s640/4.png" width="640" /></a></div>
에러 log 에서
크게 단서를 찾을 수는 없었지만<span lang="EN-US">, MS R for Hadoop </span>인 관계로<span lang="EN-US">, Hadoop </span>관련 설치 설정 과정 중의 에러라고 여겨져<span lang="EN-US">, </span>설치하는
계정에 <span lang="EN-US">Hadoop Path </span>추가<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-para-margin-left: 0gd;">
이후
수행하니 위 에러 없이 정상 <span lang="EN-US">Install </span>되었음<span lang="EN-US">.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-s0g1qIBhGvE/WGi4eGE4i3I/AAAAAAAAEO8/mvdK-Iao-PEgh7v6gZGpsO9T_0E1-igAwCLcB/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="452" src="https://3.bp.blogspot.com/-s0g1qIBhGvE/WGi4eGE4i3I/AAAAAAAAEO8/mvdK-Iao-PEgh7v6gZGpsO9T_0E1-igAwCLcB/s640/5.png" width="640" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-para-margin-left: 0gd;">
<span lang="EN-US"><!--[if gte vml 1]><v:shape id="그림_x0020_9"
o:spid="_x0000_i1042" type="#_x0000_t75" style='width:451.5pt;height:319.5pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<div class="separator" style="clear: both; text-align: center;">
</div>
<!--[if !supportLists]--><span lang="EN-US"> 4.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->모든 <span lang="EN-US">Hadoop </span>노드에 다 설치<span lang="EN-US">. (</span>설치 과정은 위와 동일<span lang="EN-US">. dsh, pdsh, PyDSH, fabric</span>등으로
이를 병렬 수행 할 수도 있기는 함<span lang="EN-US">.)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 5.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->설치 이후 확인<span lang="EN-US"><o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-AomIuiEbevU/WGi4o9TWN9I/AAAAAAAAEPA/arGaMXsG2ist4Naw0yudjqtyrz43mX4YQCLcB/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://4.bp.blogspot.com/-AomIuiEbevU/WGi4o9TWN9I/AAAAAAAAEPA/arGaMXsG2ist4Naw0yudjqtyrz43mX4YQCLcB/s640/6.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span lang="EN-US" style="text-indent: -18pt;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span lang="EN-US" style="text-indent: -18pt;"> 6. Hadoop </span><span style="text-indent: -18pt;">폴더 생성 및 퍼미션</span></div>
</div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->한쪽 노드에서만 수행<span lang="EN-US">. Hadoop </span>은 공유
되어 있으므로<span lang="EN-US">.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-9oAYu57TADw/WGi47PnzfjI/AAAAAAAAEPE/6ajoVIAPWkwA9rHcA_r2hZFJHuC574SZgCLcB/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="98" src="https://4.bp.blogspot.com/-9oAYu57TADw/WGi47PnzfjI/AAAAAAAAEPE/6ajoVIAPWkwA9rHcA_r2hZFJHuC574SZgCLcB/s640/7.png" width="640" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-para-margin-left: 0gd;">
<span lang="EN-US"><!--[if gte vml 1]><v:shape id="그림_x0020_11"
o:spid="_x0000_i1040" type="#_x0000_t75" style='width:451.5pt;height:70.5pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image013.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 7.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->각 <span lang="EN-US">Node</span>에 로컬 공유 폴더 생성<span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->전체<span lang="EN-US"> Node </span>에서 수행<span lang="EN-US">.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-lMT1zpEGN-w/WGi5FNjV7zI/AAAAAAAAEPI/JzBZK1DTpYMV6Ms1tZ5gk1pUZ6GBGs7ngCLcB/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="52" src="https://4.bp.blogspot.com/-lMT1zpEGN-w/WGi5FNjV7zI/AAAAAAAAEPI/JzBZK1DTpYMV6Ms1tZ5gk1pUZ6GBGs7ngCLcB/s640/8.png" width="640" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-para-margin-left: 0gd;">
<span lang="EN-US"><!--[if gte vml 1]><v:shape id="그림_x0020_12"
o:spid="_x0000_i1039" type="#_x0000_t75" style='width:451.5pt;height:36.75pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image015.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><span lang="EN-US"> 8.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->아래 경로의 파일을 <span lang="EN-US">Hadoop </span>에 업로드 하여<span lang="EN-US">, Test Code </span>수행 준비<span lang="EN-US">.</span><br />
<div style="text-indent: -24px;">
<span lang="EN-US"><span lang="EN-US" style="text-indent: -20pt;"> A.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><span style="text-indent: -20pt;">아래 경로는 설치 하고 나면</span><span lang="EN-US" style="text-indent: -20pt;">, </span><span style="text-indent: -20pt;">자동 생성</span><span lang="EN-US" style="text-indent: -20pt;">.</span></span></div>
</div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span>i.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">/usr/lib64/microsoft-r/3.3/lib64/R/library/RevoScaleR/SampleData/AirlineDemoSmallSplit<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span>ii.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">But, MSDN</span>의 설치 매뉴얼의 주소와 좀
다른 위치에 있어 주의 요망<span lang="EN-US">. </span><span lang="EN-US" style="text-indent: -80pt;">9.0.1 MS R for Hadoop </span><span style="text-indent: -80pt;">에서는 위 파일
형태로 </span><span lang="EN-US" style="text-indent: -80pt;">Air Polution </span><span style="text-indent: -80pt;">셈플 데이터가 존재</span><span lang="EN-US" style="text-indent: -80pt;">.</span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">B.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->하둡에 업로드할 임시 폴더 생성<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span>i.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">hadoop fs -mkdir
/tmp/msRsamples/<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span>ii.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->셈플 파일이 있는 로컬 경로로 이동하여<span lang="EN-US">, </span>해당
셈플 파일을 <span lang="EN-US">Hadoop </span>에 업로드<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span>iii.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">hadoop fs -copyFromLocal *.csv
/tmp/msRsamples/<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">C.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->로컬의 동일 경로에도 해당 파일 복사 생성<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span>i.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->뒤에가서 <span lang="EN-US">Hadoop </span>과 로컬의 비교를 해보기
위함 임<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 80.0pt; mso-list: l0 level3 lfo1; mso-para-margin-left: 0gd; mso-text-indent-alt: -20.0pt; text-indent: -80.0pt;">
<!--[if !supportLists]--><span lang="EN-US"><span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span>ii.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">mkdir /tmp/msRsamples/</span><span style="text-indent: -80pt;"><br />cp /usr/lib64/microsoft-r/3.3/lib64/R/library/RevoScaleR/SampleData/AirlineDemoSmallSplit/*.csv
/tmp/msRsamples/</span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 9.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Revo64 </span>구동<span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">cd MRS90Hadoop<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">B.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">Revo64<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 10.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;"> </span></span><!--[endif]-->셈플
코드 수행 준비<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/--WbI8qPbtKw/WGi5o1_t1ZI/AAAAAAAAEPM/mSX4x_hrZPQaGThSgBG5lvXo2kRMC61SgCLcB/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="402" src="https://4.bp.blogspot.com/--WbI8qPbtKw/WGi5o1_t1ZI/AAAAAAAAEPM/mSX4x_hrZPQaGThSgBG5lvXo2kRMC61SgCLcB/s640/9.png" width="640" /></a></div>
<br /></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-para-margin-left: 0gd;">
<span lang="EN-US"><!--[if gte vml 1]><v:shape id="그림_x0020_13"
o:spid="_x0000_i1038" type="#_x0000_t75" style='width:450.75pt;height:283.5pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 11.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;"> </span></span><!--[endif]--><span lang="EN-US">Hadoop </span>경로 핸들링<span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]-->앞에서 생성한 경로 <span lang="EN-US">hadoop fs -ls </span>조회
잘 수행 됨<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-SYtt33KnoGY/WGi50Z1BmbI/AAAAAAAAEPQ/1yiS-n39J6U40xxMguGKM8HAL03sWxxzQCLcB/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="402" src="https://4.bp.blogspot.com/-SYtt33KnoGY/WGi50Z1BmbI/AAAAAAAAEPQ/1yiS-n39J6U40xxMguGKM8HAL03sWxxzQCLcB/s640/10.png" width="640" /></a></div>
<br /></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 12.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;"> </span></span><!--[endif]-->셈플
코드 수행<span lang="EN-US">(For Local)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">input <-
file.path("/tmp/msRsamples/AirlineDemoSmallPart1.csv")<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">B.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">colInfo <- list(DayOfWeek =
list(type = "factor", levels = c("Monday",
"Tuesday", "Wednesday",
"Thursday","Friday", "Saturday",
"Sunday")))<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">C.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">airDS <- RxTextData(file =
input, missingValueString = "M", colInfo = colInfo, fileSystem = RxHdfsFileSystem())<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">D.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">adsSummary <- rxSummary(~ArrDelay+CRSDepTime+DayOfWeek,
data = airDS)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">E.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">adsSummary<br /><o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-L6SzoB4GVTo/WGi6PRejYUI/AAAAAAAAEPY/HdQSn62mBIsqLJ-6fXcKqbm706-yukGZwCLcB/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="416" src="https://4.bp.blogspot.com/-L6SzoB4GVTo/WGi6PRejYUI/AAAAAAAAEPY/HdQSn62mBIsqLJ-6fXcKqbm706-yukGZwCLcB/s640/11.png" width="640" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<span lang="EN-US"><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 38.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US"> 13.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;"> </span></span><!--[endif]-->셈플
코드 수행<span lang="EN-US">(For Hadoop)<o:p></o:p></span></div>
<div class="MsoListParagraph" style="margin-left: 60.0pt; mso-list: l0 level2 lfo1; mso-para-margin-left: 0gd; text-indent: -20.0pt;">
<!--[if !supportLists]--><span lang="EN-US">A.<span style="font-family: "times new roman"; font-size: 7pt; font-stretch: normal; line-height: normal;">
</span></span><!--[endif]--><span lang="EN-US">rxSetComputeContext(RxHadoopMR(consoleOutput=TRUE))<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-cD5OKMahKpo/WGi6aK_rCgI/AAAAAAAAEPc/iTyWbjhRDsMOeNJ0lgryw4IEk5KlnTrnQCLcB/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://1.bp.blogspot.com/-cD5OKMahKpo/WGi6aK_rCgI/AAAAAAAAEPc/iTyWbjhRDsMOeNJ0lgryw4IEk5KlnTrnQCLcB/s640/12.png" width="564" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_16" o:spid="_x0000_i1035" type="#_x0000_t75" style='width:451.5pt;
height:511.5pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image023.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
위와 같은 에러 발생<span lang="EN-US">.</span> <br />
<br />
<b><u>4. 에러 해결</u></b><br />
<br />
위 내용 중 <span lang="EN-US">libhdfs.so </span>에 문제가 있는 듯 하여 아래처럼
<span lang="EN-US">ldd </span>로 로컬 로딩 분석해 보았음<span lang="EN-US">.</span></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_17" o:spid="_x0000_i1034" type="#_x0000_t75" style='width:451.5pt;
height:98.25pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image025.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">ldd </span>로 보면 좀 이해가 가지 않는 부분이 있음<span lang="EN-US">. </span>즉<span lang="EN-US">, </span>모듈이 모두 정상 로딩 된 것으로 보인 다는 점 임<span lang="EN-US">.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-7UAFSry60MM/WGi7IrntX1I/AAAAAAAAEPg/Kk3MHCbjTioPDwUmKG91Mr2t_5u47jVqwCLcB/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="138" src="https://2.bp.blogspot.com/-7UAFSry60MM/WGi7IrntX1I/AAAAAAAAEPg/Kk3MHCbjTioPDwUmKG91Mr2t_5u47jVqwCLcB/s640/13.png" width="640" /></a></div>
<span lang="EN-US"><br /></span>
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US">root </span>로 <span lang="EN-US">su </span>한 다음
<span lang="EN-US">root </span>권한으로도 수행해 보았음<span lang="EN-US">.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-V8kHAqWHon8/WGi7TNPVjNI/AAAAAAAAEPk/3Jlaicf6fXEZeMCaQEsYItaUEmVW0iXOQCLcB/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://2.bp.blogspot.com/-V8kHAqWHon8/WGi7TNPVjNI/AAAAAAAAEPk/3Jlaicf6fXEZeMCaQEsYItaUEmVW0iXOQCLcB/s640/14.png" width="360" /></a></div>
<span lang="EN-US"><br /></span>
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_18" o:spid="_x0000_i1033" type="#_x0000_t75" style='width:385.5pt;
height:685.5pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image027.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
위 처럼 이제는 좀전의 에러가 보이지 않음<span lang="EN-US">. </span>대신 <span lang="EN-US">Hadoop </span>에서는 <span lang="EN-US">root </span>의 권한설정이 안되어 있어 이번에는 <span lang="EN-US">Hadoop </span>에서의 에러 메시지가 발생하였음<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoNormal">
다시 밖으로 나가서 <span lang="EN-US">root </span>와 사용자 <span lang="EN-US">user </span>계정 모두 <span lang="EN-US">Hadoop </span>및 <span lang="EN-US">local User 에 대하여 공동의 SuperGrop 그룹에 속하도록 </span>퍼미션 권한을 모두 맞추어 주고 재 시도 해 보았음<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoNormal">
<br />
앞선 에러 로그의 문제는 해결되었음. 하지만, 이번엔 또 아래 같은 에러 발생<span lang="EN-US">.<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-zd7_LnfIA-E/WGi74B1jHyI/AAAAAAAAEPo/hP5X5hr2fpMyyHzxEhvXp4Ipc3-P-BE6wCLcB/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="174" src="https://1.bp.blogspot.com/-zd7_LnfIA-E/WGi74B1jHyI/AAAAAAAAEPo/hP5X5hr2fpMyyHzxEhvXp4Ipc3-P-BE6wCLcB/s640/15.png" width="640" /></a></div>
<span lang="EN-US"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-ldyTEW5qOvE/WGi7_MBMxRI/AAAAAAAAEPs/UhfKlem7SRMwBBuMd25K-ab69_a_TJ3SgCLcB/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="514" src="https://2.bp.blogspot.com/-ldyTEW5qOvE/WGi7_MBMxRI/AAAAAAAAEPs/UhfKlem7SRMwBBuMd25K-ab69_a_TJ3SgCLcB/s640/16.png" width="640" /></a></div>
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_19" o:spid="_x0000_i1032" type="#_x0000_t75" style='width:451.5pt;
height:123.75pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image029.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
</div>
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_21" o:spid="_x0000_i1031" type="#_x0000_t75" style='width:451.5pt;
height:363pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image031.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_20" o:spid="_x0000_i1030" type="#_x0000_t75" style='width:451.5pt;
height:77.25pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image033.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
</div>
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_23" o:spid="_x0000_i1029" type="#_x0000_t75" style='width:451.5pt;
height:301.5pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image035.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
앞선 문제는 해결되는데<span lang="EN-US">… tmp/ </span>폴더가 또 문제<span lang="EN-US">.. (기존에 쓰던 Map/Reduce Job의 사용자와 다른 새로운 사용자로 R 을 병렬 수행하면서 새롭게 권한 문제 발생) <o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
</div>
<span lang="EN-US"><b><u>hadoop fs -chmod -R 1777 /tmp </u></b></span>로 <span lang="EN-US">tmp </span>폴더 권한 문제 해결<span lang="EN-US">. </span>하지만 여전히<span lang="EN-US"> libjvm.so </span>를 인식하지 못하는 문제가 계속되고 있음<span lang="EN-US">. 다시 ldd 를 해보아도 로딩 잘 되고 있고...<o:p></o:p></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-1WF91gQHu88/WGi8-xVZuRI/AAAAAAAAEP0/vmlyWvlItvUTaibqpwHFeyH1I3_wp-48wCLcB/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://2.bp.blogspot.com/-1WF91gQHu88/WGi8-xVZuRI/AAAAAAAAEP0/vmlyWvlItvUTaibqpwHFeyH1I3_wp-48wCLcB/s640/18.png" width="640" /></a></div>
<span lang="EN-US"><br /></span>
<span lang="EN-US">그렇다면 드는 생각. 현재 수행중인 노드는 ldd 로딩이 잘 되는데, 다른 cluster node 는 안되는게 아닐까? 답은 Yes.</span><br />
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_24" o:spid="_x0000_i1028" type="#_x0000_t75" style='width:450.75pt;
height:141pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image037.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
최초 <span lang="EN-US">local </span>수행했던 <span lang="EN-US">MS R
Master </span>노드에는 <span lang="EN-US">libjvm.so </span>가 심볼릭 링크 존재함<span lang="EN-US">. </span>그런데<span lang="EN-US">, </span>나머지, 인스톨만 했고<span lang="EN-US">,
local </span>수행을 한번도 한적 없는 모든 노드는 <span lang="EN-US">libjvm.so </span>심볼릭 링크가 저 위치(/usr/lib64/microsoft-r/3.3/hadoop/)에
존재하지 않음 그래서 아래처럼 모든 노드에 수동 심볼링 링크 추가해줌<span lang="EN-US">. (</span>이것 때문에 삽질 엄청 했음<span lang="EN-US">. </span>아마도 각 로컬에서 local mode를 한번이라도 수행해주면 최초 한번 자동으로 설정 될 것 같긴 함<span lang="EN-US">. </span>하지만<span lang="EN-US">, </span>수십대 수백대가 존재하는 <span lang="EN-US">Yarn Cluster </span>환경에서는 모든 노드에서 <span lang="EN-US">Local </span>모드 수행을
일일이 해주기 힘듦므로 아래 처럼 심볼릭 링크 수행을 <span lang="EN-US">distributed Shell </span>로 수행하는 것이
유리<span lang="EN-US">.)<o:p></o:p></span><br />
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US"><b><u>cd /usr/lib64/microsoft-r/3.3/hadoop<o:p></o:p></u></b></span></div>
<div class="MsoNormal">
<span lang="EN-US"><b><u>su<o:p></o:p></u></b></span></div>
<div class="MsoNormal">
<span lang="EN-US"><b><u>ln -s
/data01/java/jdk/jre/lib/amd64/server/libjvm.so</u></b><o:p></o:p></span><br />
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
위 경로는 본인<span lang="EN-US"> JAVA_HOME</span>의 <span lang="EN-US">jdk </span>위치를 따라야 함<span lang="EN-US">. (</span>이를 감지하는 코드가 <span lang="EN-US">/usr/lib64/microsoft-r/3.3/Hadoop </span>경로 안의 <span lang="EN-US">getHadoopEnvVars.py
</span>인 것으로 사료 됨<span lang="EN-US">.)<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
위처럼 해주자 모든 문제가 해결되었고, 결과가 아래처럼 <span lang="EN-US">Hadoop </span>버전에서도 동일하게 나왔음<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_25" o:spid="_x0000_i1027" type="#_x0000_t75" style='width:450.75pt;
height:283.5pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image039.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-As13b30C1PE/WGi9_0xasnI/AAAAAAAAEP4/nKyPwUhAUXA0lOUXkwuTCJYZNqfeyILtQCLcB/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://3.bp.blogspot.com/-As13b30C1PE/WGi9_0xasnI/AAAAAAAAEP4/nKyPwUhAUXA0lOUXkwuTCJYZNqfeyILtQCLcB/s640/19.png" width="640" /></a></div>
<br />
<br /></div>
<div class="MsoNormal">
아래는 <span lang="EN-US">Spark </span>를 통한 수행<span lang="EN-US">.(Spark Mode 수행 전 Spark 는 Hadoop 과 연동되어 잘 설정되어 있어야 한다.) <b><u>Hadoop </u></b></span><b><u>을 통한 수행보다 약 <span lang="EN-US">4~5</span>배 더 빠름 <span lang="EN-US">^^.
</span>유레카</u></b><span lang="EN-US"><b><u>~~~~</u></b><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_26" o:spid="_x0000_i1026" type="#_x0000_t75" style='width:451.5pt;
height:153.75pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image041.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><!--[if gte vml 1]><v:shape
id="그림_x0020_27" o:spid="_x0000_i1025" type="#_x0000_t75" style='width:451.5pt;
height:326.25pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/spicc/AppData/Local/Temp/msohtmlclip1/01/clip_image043.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><span lang="EN-US"><o:p></o:p></span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-9wd6Zc0R6w4/WGi-PP-cAnI/AAAAAAAAEP8/Sy0l5ktSw-wLPzljMsayGUvdb1YMii8zQCLcB/s1600/20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://2.bp.blogspot.com/-9wd6Zc0R6w4/WGi-PP-cAnI/AAAAAAAAEP8/Sy0l5ktSw-wLPzljMsayGUvdb1YMii8zQCLcB/s640/20.png" width="640" /></a></div>
<br />
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/--LBh_pkj6Fc/WGi-Sce2QhI/AAAAAAAAEQA/o7BF_AxjyEg78xBUBnNDSm92oTKjMLUFACLcB/s1600/21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="462" src="https://1.bp.blogspot.com/--LBh_pkj6Fc/WGi-Sce2QhI/AAAAAAAAEQA/o7BF_AxjyEg78xBUBnNDSm92oTKjMLUFACLcB/s640/21.png" width="640" /></a></div>
<br />
<br />
<br />
<b><u>5. 결론</u></b><br />
<br />
우여곡절이 좀 있었지만, 일단, Hadoop Cluster + Spark Cluster 에 MS R 을 전체 노드에 설치하고, Local 수행, on Hadoop 수행, on Spark 수행이 정상적으로 잘 이루어짐을 확인하였다. 대용량 Data Handling 및 병렬 알고리즘 수행 에 대한 위 세가지 Mode 에서의 성능 수치 및 Spark R 과의 deep dive 비교는 다음번에 별도 블로그로 언급해 보도록 하겠다.<br />
<br />
당연하겠지만, MS R on Hadoop 보다 MS R on Spark 가 더 수행속도가 빠르다. 그리고, 메모리에 순식간에 로딩되는 작은양의 Sample Data 는 Local 1대 수행이 가장 빠른것도 사실이다. Spark 수행은 그래서 대용량 처리에 있어, 약간 중간계 같은 느낌이다.<br />
<br />
속도가 아닌 용량의 측면에서 보자면, local 보다는 spark memory cluster 가, 그리고 spark memory cluster 보다는 hadoop distributed File System cluster 가 훨씬 강력한 것이 사실이기 때문이다.<br />
<br />
MS R 은 그 전신인 Revolution R 을 MS가 인수하여, 일부는 Open Community 버전으로 Free 버전으로 오픈되어, 다중 쓰레드, 다중 CPU, disk 기반 iteration 등 기존 Open R의 단점을 많이 보완한 새로운 feature 를 기본 포함하고 있다. 오늘 실험했던 Hadoop 위에서의 병렬 구동, Spark 위에서의 병렬 구동은 MSDN 라이센스가 필요하지만, Azure 위에서 종량제 HDInsight Hadoop + Spark 클러스터를 구동하면, 누구나 몇분만에 클라우드 상에서 유연하게 Node 갯수를 조정해 가며 사용 가능하여, 그다지 먼나라 기술도 아니라 할 수 있다.<br />
<br />
모델러가 R 로 넘긴 소스를 BigData scale 로 포팅함에 있어, R 코드를 최대한 재 사용하면서 scale out 을 할 수 있다는 것 자체만으로도, 오늘 실험한 구성은 그 가능성이 무궁무진 하다 하겠다. R의 시각화 기능에 있어서의 막강함은 BigData 개발자들에게 선물같은 기능이 아닐 수 없다.<br />
<br />
<a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=8166686140676460430" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a>Spark 는 제트기 같은 민첩함을 제공하지만, 종합운동장 보다 큰 활주로가 있어야 한다. Hadoop 은 듬직하지만, 항공모함 역할 이상을 하긴 힘들었다. Hadoop 위에 Spark 는 항공모함 위에 제트기 처럼, 그 둘의 시너지로 막강한 화력을 제공해주는 것을 우리는 이미 경험한 바 있다. 우리는 가끔 육지에서 조용하게 정교한 작전을 수행하고 돌아오기 위해 Python 이라는 Hummer 고성능 군용 전처후 차량이 필요할 때가 있었다. 스파크보다 빠르지 않아도 된다. 대용량이 좀 힘들어도 상관 없다. 정교한 육지 수색을 할때 제트기 보다는 특공대를 태운 Hummer 차량이 더욱 믿음직한 것 처럼 그 자체로서 역할이 충분히 독보적이었다. 오늘 접한 분산 R 은 그런 측면에서 화력에 비유하자면, Apache 헬기 같은 존재라 할 수 있다. 제트기(Spark) 보다 빠르지 않아도 된다. 할주로가 없는 구석 구석 까지 수색을 하기 위해서 우리는 특공대를 태운 Hummer 차량밖에 대안이 없었으나, 이제는 Apache 헬기를 타고 한번에 더 빠르게 날라갈 수 있으며 그들을 지원사격해줄 수도 있다.<br />
<br />
Local Area 에 있어서는, 람보 1인 이면, 모든게 해결 되기도 했었다. 홀로(1대로) 외롭게 싸우던 람보(R)를 Apache 헬기에 태워 여기저기 데리고 다닐 수 있다면...?! 여러곳에 독자적으로 나누어져 있던 람보를 수송헬기에 태워 때(때거지로, 즉, 대용량으로)로 다니게 할 수 있다면...?! 하는 즐거운 상상을 해본다... 람보에 날개 달기(분산 R) 프로젝트는 아직 진행형 이지만, 그 가능성이 심상치만은 않은 이유라 하겠다.<br />
<br />
<br />
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com1tag:blogger.com,1999:blog-8166686140676460430.post-48081087863996377862016-09-27T23:11:00.003+09:002017-09-04T16:53:23.434+09:00 Python Anaconda & GPU - 세팅 및 성능 비교<span style="font-size: xx-small;">요즘 Python 의 행보가 매우 무섭다. </span><br />
<span style="font-size: xx-small;"><br /></span>
<span style="font-size: xx-small;">특히 Machine Learning 쪽에서 다양한 오픈 모듈이 나오면서 힘을 받기 시작했고, Deep Learning 쪽에서는 TensorFlow 등의 걸출한 프레임워크가 그 행보에 힘을 더해 준 느낌이다. 최근 화두가 된, microservice 또한 Python 계열에 장점이 많은 분야 중 하나이다.</span><span style="font-size: xx-small;"> </span><br />
<span style="font-size: xx-small;"><br /></span>
<br />
<div class="assistive" id="page-metadata-start" style="background-color: white; border: 0px; clip: rect(0px 0px 0px 0px); color: #333333; font-family: Arial, sans-serif; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: absolute; width: 1px;">
</div>
<div class="page-metadata" style="background-color: white; font-family: Arial, sans-serif; line-height: 1.5; margin: -15px 0px 20px; padding: 0px;">
<ul style="line-height: 16px; list-style-type: none; margin: 0px; overflow: hidden; padding: 0px;"><span style="color: #333333;"><ul style="line-height: 16px; list-style-type: none; margin: 0px; overflow: hidden; padding: 0px;"><span style="font-size: xx-small;">그리고, Python Data Platform 에선 끝판왕 같은 느낌. 바로 Anaconda.(이 안에 여러가지 것들이 짬뽕되어 있는데, Anaconda는 그것들을 잘 패키징 해놓았다.)</span></ul>
</span><span style="color: #333333; font-size: 14px;"><div>
<br /></div>
</span></ul>
<br />
<ul style="line-height: 16px; list-style-type: none; margin: 0px; overflow: hidden; padding: 0px;"><span style="color: #333333; font-size: 14px;">Anaconda 는 GPU 를 지원하고 있는데.... 해서, 최근에 확보된 GPU 장비들에 Anaconda GPU 설치 세팅 후 간단하게 CPU 대비 Anaconda + GPU 세팅 버전의 성능 비교를 해보았다. 설치 세팅 방법과 성능 비교 내용은 다음과 같다.</span></ul>
</div>
<div class="wiki-content" id="main-content" style="background-color: white; margin: 0px; padding: 0px;">
<ol style="margin: 10px 0px 0px;">
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">아나콘다 Accelerate 모듈 업데이트</li>
<div class="separator" style="clear: both; color: #333333; font-family: arial, sans-serif; font-size: 14px; text-align: center;">
</div>
<div class="separator" style="clear: both; color: #333333; font-family: arial, sans-serif; font-size: 14px; text-align: center;">
</div>
<ol style="color: #333333; font-family: arial, sans-serif; font-size: 14px; list-style-type: lower-alpha; margin: 0px;">
<li>conda update conda</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-cgUtHF-7GWo/V-qAGAYGuHI/AAAAAAAAEKU/uigcM6hxQz0uzeBRkPUoc5qT_TE1m8pnQCEw/s1600/image002%2B%25281%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="278" src="https://1.bp.blogspot.com/-cgUtHF-7GWo/V-qAGAYGuHI/AAAAAAAAEKU/uigcM6hxQz0uzeBRkPUoc5qT_TE1m8pnQCEw/s640/image002%2B%25281%2529.png" width="640" /></a></div>
<li>conda install accelerate</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-i94SBlBFE8Y/V-qAsthGX8I/AAAAAAAAEKY/S-faVFQ1_OIcz7huE5L2t5c9TSm-NZ_sgCLcB/s1600/image003%2B%25281%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440" src="https://2.bp.blogspot.com/-i94SBlBFE8Y/V-qAsthGX8I/AAAAAAAAEKY/S-faVFQ1_OIcz7huE5L2t5c9TSm-NZ_sgCLcB/s640/image003%2B%25281%2529.png" width="640" /></a></div>
<li>conda install numbapro</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-DeVOtbSQj-c/V-qAyCRTwNI/AAAAAAAAEKc/uILnoHoWQ-UIOID8nmVIxLrcE3oMS169QCLcB/s1600/image004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://2.bp.blogspot.com/-DeVOtbSQj-c/V-qAyCRTwNI/AAAAAAAAEKc/uILnoHoWQ-UIOID8nmVIxLrcE3oMS169QCLcB/s640/image004.png" width="370" /></a></div>
</ol>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">NVIDIA 드라이버 다운로드</li>
<ol style="list-style-type: lower-alpha; margin: 0px;">
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">아래처럼 NVIDIA 홈페이지에서 전용 driver 다운로드.</li>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">먼저 Tesla ... 이름에서 부터 존재감이..ㅋㅋ</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/--vL2Lh4NC54/V-qA-YkhWLI/AAAAAAAAEKg/T31az2T7XOAnC9XzToqGt_E8mfwbjGzaQCLcB/s1600/image005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://3.bp.blogspot.com/--vL2Lh4NC54/V-qA-YkhWLI/AAAAAAAAEKg/T31az2T7XOAnC9XzToqGt_E8mfwbjGzaQCLcB/s640/image005.png" width="640" /></a></div>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">다음은 Quadro ... 드라이버. 존재감이 살짝 떨어짐 TT</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-9s1w3dM57YI/V-qBDW5z0BI/AAAAAAAAEKk/bxoYx5Hdgu0ILEkT6asSiXm6M7toUzPYgCLcB/s1600/image006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://1.bp.blogspot.com/-9s1w3dM57YI/V-qBDW5z0BI/AAAAAAAAEKk/bxoYx5Hdgu0ILEkT6asSiXm6M7toUzPYgCLcB/s640/image006.png" width="640" /></a></div>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">드라이버를 각각 서버에 업로드</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-6YZIs4hO7zU/V-qBISQmRSI/AAAAAAAAEKo/Wyc3BChgSj432nWBIckvTp-7MMq_uty5QCLcB/s1600/image007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://2.bp.blogspot.com/-6YZIs4hO7zU/V-qBISQmRSI/AAAAAAAAEKo/Wyc3BChgSj432nWBIckvTp-7MMq_uty5QCLcB/s640/image007.png" width="640" /></a></div>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">위처럼 기존에 있던 Nouveau 때문에 에러 남. Nouveau 를 disable 시켜야 함.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-6FjAc7jmGgY/V-qBNBlY-rI/AAAAAAAAEKs/nlSXyhKPtUUGNZWdx-DeDvEC0SN5DwMuQCLcB/s1600/image008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://2.bp.blogspot.com/-6FjAc7jmGgY/V-qBNBlY-rI/AAAAAAAAEKs/nlSXyhKPtUUGNZWdx-DeDvEC0SN5DwMuQCLcB/s640/image008.png" width="640" /></a></div>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">친절하게도 disable script 도 만들어 준다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-wWXZbLNi8oQ/V-qBRnxU4QI/AAAAAAAAEKw/CChCbLlYkA4uJ32ye8LcMHXuVmtG2wBNgCLcB/s1600/image009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://1.bp.blogspot.com/-wWXZbLNi8oQ/V-qBRnxU4QI/AAAAAAAAEKw/CChCbLlYkA4uJ32ye8LcMHXuVmtG2wBNgCLcB/s640/image009.png" width="640" /></a></div>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">기타, 지금까지의 로그는 저 위치에 기록되어 있는 듯... 친절하기도 해라...</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-T4WBCSO584M/V-qBXDT3xqI/AAAAAAAAEK0/tztTClY21Qkx9YycjakUM0LhYeQjd4TLACLcB/s1600/image010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://3.bp.blogspot.com/-T4WBCSO584M/V-qBXDT3xqI/AAAAAAAAEK0/tztTClY21Qkx9YycjakUM0LhYeQjd4TLACLcB/s640/image010.png" width="640" /></a></div>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">위 수행하고 나면 Tesla 장비는 정상 수행되나, Quadro 장비는 nouveau 가 계속 떠 있어서 충돌 남.</li>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">메뉴얼에 하라는거 다해도 계속 좀비처럼 살아남...</li>
<ol style="color: #333333; font-family: arial, sans-serif; font-size: 14px; list-style-type: lower-roman; margin: 0px;">
<li>에이... 강제로 모듈 제거.</li>
<li>rmmod nouveau</li>
<li>다시 설치... OK 설치 됨.</li>
</ol>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">설치 후 메시지</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-NLmYkFmwNuI/V-qBjbOsaOI/AAAAAAAAEK4/v1rkCSVIvQQ1VoVFCKsx3fl4YGGMa-meACLcB/s1600/image011.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="296" src="https://2.bp.blogspot.com/-NLmYkFmwNuI/V-qBjbOsaOI/AAAAAAAAEK4/v1rkCSVIvQQ1VoVFCKsx3fl4YGGMa-meACLcB/s640/image011.png" width="640" /></a></div>
</ol>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">CUDA 툴킷으로 GPU Check</li>
<ol style="color: #333333; font-family: arial, sans-serif; font-size: 14px; list-style-type: lower-alpha; margin: 0px;">
<li>먼저 Tesla M40 장비</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-F2CzRjQd5j0/V-qBrI71OrI/AAAAAAAAEK8/CmITuZcrjBgGUB502ZC0eCCMyLGg3cP_QCLcB/s1600/image012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="376" src="https://4.bp.blogspot.com/-F2CzRjQd5j0/V-qBrI71OrI/AAAAAAAAEK8/CmITuZcrjBgGUB502ZC0eCCMyLGg3cP_QCLcB/s640/image012.png" width="640" /></a></div>
<li>정상 설정 되었음.</li>
<li>다음은 Quadro K4200 장비</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-EUmFp_X5IWw/V-qBzdX5Y6I/AAAAAAAAELA/0g1SuAdDae0BCpmwutzWeEPoBQmqnW94wCLcB/s1600/image013.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="396" src="https://4.bp.blogspot.com/-EUmFp_X5IWw/V-qBzdX5Y6I/AAAAAAAAELA/0g1SuAdDae0BCpmwutzWeEPoBQmqnW94wCLcB/s640/image013.png" width="640" /></a></div>
<li>야도 정상 설정 되었음.</li>
</ol>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">CPU 와 GPU 성능 비교를 위해 사용된 코드</li>
<ol style="color: #333333; font-family: arial, sans-serif; font-size: 14px; list-style-type: lower-alpha; margin: 0px;">
<li>CPU 버전 성능 체크를 위해 사용한 코드</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-CyG919Xcyzk/V-qB5-_ZaXI/AAAAAAAAELE/KHTc1u4NiQgYvt30lstrYn7B-_-fqCH9wCLcB/s1600/image014.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="396" src="https://2.bp.blogspot.com/-CyG919Xcyzk/V-qB5-_ZaXI/AAAAAAAAELE/KHTc1u4NiQgYvt30lstrYn7B-_-fqCH9wCLcB/s640/image014.png" width="640" /></a></div>
<li>GPU 버전 성능 체크를 위해 사용한 코드</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-muGkTv9-b4Q/V-qB-wldz9I/AAAAAAAAELI/tixqKpGkxSY4kF4Yg1aTt3QAfFy6UKmhACLcB/s1600/image015.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="396" src="https://3.bp.blogspot.com/-muGkTv9-b4Q/V-qB-wldz9I/AAAAAAAAELI/tixqKpGkxSY4kF4Yg1aTt3QAfFy6UKmhACLcB/s640/image015.png" width="640" /></a></div>
</ol>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">Python Code 로 두 장비에서 CPU vs GPU 성능 비교.</li>
<ol style="color: #333333; font-family: arial, sans-serif; font-size: 14px; list-style-type: lower-alpha; margin: 0px;">
<li>Tesla 장비</li>
<ol style="list-style-type: lower-roman; margin: 0px;">
<li>CPU 버전 코드 3번 수행 결과</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-PZWF9NCWfAI/V-qCF_nR0ZI/AAAAAAAAELM/LO4W93reZmUQnKmk1DDWH_Jhnt4lbvL-wCLcB/s1600/image016.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="146" src="https://2.bp.blogspot.com/-PZWF9NCWfAI/V-qCF_nR0ZI/AAAAAAAAELM/LO4W93reZmUQnKmk1DDWH_Jhnt4lbvL-wCLcB/s640/image016.png" width="640" /></a></div>
<li>GPU 버전 코드 3번 수행 결과</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-BaxigS1Y-3I/V-qCJ1QTznI/AAAAAAAAELQ/rhbXMqLMGYQ0YMixVYMGGrwThuJD36SdwCLcB/s1600/image017.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="https://1.bp.blogspot.com/-BaxigS1Y-3I/V-qCJ1QTznI/AAAAAAAAELQ/rhbXMqLMGYQ0YMixVYMGGrwThuJD36SdwCLcB/s640/image017.png" width="640" /></a></div>
</ol>
<li>Quadro 장비</li>
<ol style="list-style-type: lower-roman; margin: 0px;">
<li> CPU 버전 코드 3번 수행 결과</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-wgTl0d0DT9w/V-qCNbUMyGI/AAAAAAAAELU/5J77gBL8koEx1F4lxPgKBt3O90t9ZgS6gCLcB/s1600/image018.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="148" src="https://4.bp.blogspot.com/-wgTl0d0DT9w/V-qCNbUMyGI/AAAAAAAAELU/5J77gBL8koEx1F4lxPgKBt3O90t9ZgS6gCLcB/s640/image018.png" width="640" /></a></div>
<li>GPU 버전 코드 3번 수행 결과</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-viMPYfWiKZg/V-qCU1SUXCI/AAAAAAAAELY/rDsXSiAi6EEjYP143e1nVpc6xQprj3cmgCLcB/s1600/image019.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://2.bp.blogspot.com/-viMPYfWiKZg/V-qCU1SUXCI/AAAAAAAAELY/rDsXSiAi6EEjYP143e1nVpc6xQprj3cmgCLcB/s640/image019.png" width="640" /></a></div>
</ol>
<li>성능 비교상 기존에 보유하고 있던 1500만원 상당의 Legacy X86 표준 장비와도 성능 비교 해 봄.</li>
<ol style="list-style-type: lower-roman; margin: 0px;">
<li>GPU는 Support 하지 않으므로 CPU 만 수행하였음.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-RY0tXudrnh8/V-qCcGBvEiI/AAAAAAAAELc/YjafQojJAfUoHTbRSJ_S-Oo3tYIJRZiAgCLcB/s1600/image020.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="162" src="https://1.bp.blogspot.com/-RY0tXudrnh8/V-qCcGBvEiI/AAAAAAAAELc/YjafQojJAfUoHTbRSJ_S-Oo3tYIJRZiAgCLcB/s640/image020.png" width="640" /></a></div>
</ol>
</ol>
<li style="color: #333333; font-family: arial, sans-serif; font-size: 14px;">종합 결과 (일단, 가격 요소를 제외하고, 성능 부분만 정리하였음. ps. Legacy 장비대비 GPU 2개씩 꼳힌 장비들이 약 3배 비쌈.)<br /><span class="confluence-embedded-file-wrapper" style="display: inline-block; max-width: 100%; position: relative;"></span></li>
</ol>
<div class="separator" style="clear: both; color: #333333; font-family: arial, sans-serif; font-size: 14px; text-align: center;">
<a href="https://2.bp.blogspot.com/-3t42jzw68ug/V-p9spmMX1I/AAAAAAAAEKI/TmCJoUjv07Qef44ZqIbao8dOZRi3vL1_gCLcB/s1600/blog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://2.bp.blogspot.com/-3t42jzw68ug/V-p9spmMX1I/AAAAAAAAEKI/TmCJoUjv07Qef44ZqIbao8dOZRi3vL1_gCLcB/s640/blog.png" width="634" /></a></div>
<div class="separator" style="clear: both; color: #333333; font-family: arial, sans-serif; font-size: 14px; text-align: center;">
</div>
<div style="color: #333333; font-family: arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
이상.<br />
<br />
위처럼 GPU 가 CPU 에 비하여 월등한 컴퓨팅 파워들 보여주고 있다. </div>
<div style="color: #333333; font-family: arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
<br /></div>
<div style="color: #333333; font-family: arial, sans-serif; font-size: 14px; margin-top: 10px; padding: 0px;">
ps. 물론 실제 Production 환경에서 저정도 차이가 나거나 하지는 않는데, 모든 연산위 위에서 실험한 GPU 지원 백터 연산만 있는 것은 아니기 때문이다.</div>
</div>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-62550028185731764172016-09-02T16:20:00.001+09:002016-09-27T23:12:51.690+09:00최신 IT 트랜드(Language on Data Platform 측면)의 "왕좌의 게임"Data 를 다루는 언어들, 기술들이 최근 하루가 다르게 발전하고, 또 변화하고 있습니다. 특정 기술들은 이쪽 라인에 붙어 있다가, 저 쪽 라인에 붙는가 하면, 잘나가다가 어느새 훅 사라져버리기도 하죠. 주인공들이 픽픽 죽어나가는 것이, 마치 미드 "왕좌의 게임"을 보는 듯 합니다.<br />
<br />
어느 한 기술을 고수하다 보면(국지전에 너무 매진하다 보면), 자칫 커다랗게 밀려오는 큰 흐름을 놓치고, 그 흐름을 따라가는데 힘이 겨워 질 수도 있을 것입니다.(곧 다가올 겨울에 대한 대비를 간과하게 될 지도 모릅니다.)<br />
<br />
그런 측면에서, 얼마전 사내 BigData 기술 전파를 위한 공지 메일에서 경각심 부각 용으로 작성했던, "최신 IT 트랜드(Language on Data Platform 측면)의 왕좌의 게임 비유"를 블로그에 옮겨 보았습니다.<br />
<br />
<div class="MsoNormal">
<br /></div>
<table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; mso-padding-alt: 0cm 0cm 0cm 0cm; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="height: 17.65pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;">
<td style="border: solid windowtext 1.0pt; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.2pt;" valign="top" width="170"><div class="MsoNormal">
<b><span style="background: yellow; mso-highlight: yellow;">언어<span lang="EN-US"><o:p></o:p></span></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 5.0cm;" valign="top" width="189"><div class="MsoNormal">
<b><span style="background: yellow; mso-highlight: yellow;">주요
지원 프레임워크<span lang="EN-US"><o:p></o:p></span></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<b><span style="background: yellow; mso-highlight: yellow;">왕좌의
게임<span lang="EN-US"><o:p></o:p></span></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<b><span style="background: yellow; mso-highlight: yellow;">비고<span lang="EN-US"><o:p></o:p></span></span></b></div>
</td>
</tr>
<tr style="height: 35.3pt; mso-yfti-irow: 1;">
<td style="border-top: none; border: solid windowtext 1.0pt; height: 35.3pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.2pt;" valign="top" width="170"><div class="MsoNormal">
<span lang="EN-US">Java<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 35.3pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 5.0cm;" valign="top" width="189"><div class="MsoNormal">
<span lang="EN-US">Spring,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Netty,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">MapReduce<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 35.3pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-OHvbDvqTFJ4/V8khOz1s_aI/AAAAAAAAEIY/_GSp-v0ibr4SD80ZTVVFva0ieook1RnewCLcB/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-OHvbDvqTFJ4/V8khOz1s_aI/AAAAAAAAEIY/_GSp-v0ibr4SD80ZTVVFva0ieook1RnewCLcB/s320/1.jpg" width="300" /></a></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 35.3pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<span lang="EN-US">Korea 국민 </span>언어<span lang="EN-US"> Java. <o:p></o:p></span></div>
<div class="MsoNormal">
저도 빅데이타하면서<span lang="EN-US"> 3~4</span>년전에는<span lang="EN-US">
Java </span>로<span lang="EN-US"> Spring Data </span>위에서<span lang="EN-US">
MapReduce </span>쓰다가 흰 머리가 많이 났었습니다<span lang="EN-US">.조금 더 그 좋지 않았던 경험이 반복되었다면, 신생 언어를 만들어 낼뻔 한 순간, 트위터 애들이 먼저 그짓을 마무리 해주었었죠. 잠시나마 cascading 위에서 clojure 랭귀지를 다루거나, Riak 언어를 기웃거리던 계기를 Java가 제공하기도 했었습니다.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">그렇게 개발자들에게 무관심하던 Java </span>는 왕좌의 게임의 라니스터 가문입니다<span lang="EN-US">. </span>천하를 통일했던 옛 명성이 있지만<span lang="EN-US">, </span>요즘은 왠지 좀 불안불안
합니다<span lang="EN-US">. </span>최근<span lang="EN-US"> 1.8 </span>이 나오면서<span lang="EN-US">, </span>서세이가 다시 녹색 물폭탄을 터트리고<span lang="EN-US">, </span>존재감을 드러내긴 했습니다만…<span lang="EN-US"> C# </span>처럼 상위 프레임워크 지향<span lang="EN-US"> Legacy </span>호환성이 있는 것이
아니므로<span lang="EN-US">, </span>여러<span lang="EN-US"> Enterprise </span>기업들은<span lang="EN-US"> 1.8</span>을 구경하기조차 쉽지 않습니다<span lang="EN-US">.<o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 17.65pt; mso-yfti-irow: 2;">
<td style="border-top: none; border: solid windowtext 1.0pt; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.2pt;" valign="top" width="170"><div class="MsoNormal">
<span lang="EN-US">Scala<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 5.0cm;" valign="top" width="189"><div class="MsoNormal">
<span lang="EN-US">Play 2,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Spark<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Zeppelin Notebook<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-Q9hJNiH-gZU/V8khSsfJakI/AAAAAAAAEIc/UrRctjrQ7N4f7rclnuRS_-DcAnsji9LiwCLcB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-Q9hJNiH-gZU/V8khSsfJakI/AAAAAAAAEIc/UrRctjrQ7N4f7rclnuRS_-DcAnsji9LiwCLcB/s320/2.png" width="266" /></a></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<span lang="EN-US">Play2 </span>가 살짝 다시 각광을 받고 있기도 하지만<span lang="EN-US">, Scala.js </span>가 여기저기 조금씩 보이기도 하지만<span lang="EN-US">, </span>그 무엇보다<span lang="EN-US"> Scala </span>의 성장은<span lang="EN-US"> Spark </span>의 성장과 땔래야 땔 수가 없습니다<span lang="EN-US">. Scala </span>는 비록 한때 아무런 존재감이 없었으나<span lang="EN-US">, Spark </span>의<span lang="EN-US"> Dragon </span>급 존재감에 힘입어<span lang="EN-US">, </span>현재 막강 화력을 자랑하고 있습니다<span lang="EN-US">. Spark</span>는 이미<span lang="EN-US"> BigData Eco </span>시스템의 춘추전국 국지전에서<span lang="EN-US"> Map/Reduce </span>나<span lang="EN-US"> Cascading, Pig </span>등을 제치고<span lang="EN-US">, </span>국지전 승리를 거둔바 있습니다<span lang="EN-US">. Spark </span>의 요즘 기세는 하늘을
나는 용과도 흡사합니다<span lang="EN-US">. <o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 17.65pt; mso-yfti-irow: 3;">
<td style="border-top: none; border: solid windowtext 1.0pt; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.2pt;" valign="top" width="170"><div class="MsoNormal">
<span lang="EN-US">R<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 5.0cm;" valign="top" width="189"><div class="MsoNormal">
<span lang="EN-US">SparkR,<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">RevolutionR(MS R Server)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-dd90ocxpiTg/V8khczX7w_I/AAAAAAAAEIg/1gqYbcaCMF4pJNX94A6Kz1eWfBFJ9VHWACLcB/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-dd90ocxpiTg/V8khczX7w_I/AAAAAAAAEIg/1gqYbcaCMF4pJNX94A6Kz1eWfBFJ9VHWACLcB/s1600/3.jpg" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<span lang="EN-US">R </span>은 사실 매우 똑똑합니다<span lang="EN-US">. </span>세상의
모든 알고리즘이 다 있는 것 같습니만<span lang="EN-US">, </span>그런데 너무 작습니다<span lang="EN-US">.
Small Data </span>밖에 다루지 못하는 것이<span lang="EN-US">, </span>마치 티리온 라니스터 같습니다<span lang="EN-US">. </span>라니스터에서 독립되어 최근<span lang="EN-US"> Python</span>에도 밀리는 형국이지만<span lang="EN-US">, Spark </span>가 손을 벌려<span lang="EN-US"> SparkR </span>병렬성을 지원하고 있고<span lang="EN-US">, </span>최근<span lang="EN-US"> MS </span>가<span lang="EN-US">
Revolution R </span>을 인수하고 커뮤니티를 지원하면서<span lang="EN-US">, </span>다시금 조금씩 병렬<span lang="EN-US"> R</span>의 시대가 열릴 것 만 같습니다<span lang="EN-US">. </span>여전히 피는 다르지만<span lang="EN-US">, </span>아직<span lang="EN-US"> Spark </span>진영에 붙어 있는 것도 안전해 보이네요<span lang="EN-US">. </span>시즌<span lang="EN-US">6</span>에서 용<span lang="EN-US">(Spark)</span>과
친근함을 보여주기도 했었죠<span lang="EN-US">.<o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 17.65pt; mso-yfti-irow: 4;">
<td rowspan="2" style="border-top: none; border: solid windowtext 1.0pt; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.2pt;" valign="top" width="170"><div class="MsoNormal">
<span lang="EN-US">Python<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 5.0cm;" valign="top" width="189"><div class="MsoNormal">
<span lang="EN-US">DJango, Flask, </span>기타 등등<span lang="EN-US">..<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Jupyter Notebook<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-QmWsc5scQe0/V8khhvPlMLI/AAAAAAAAEIk/S1g06kGpbqQ81fmiSA26WfnBpt-Ah0NFACLcB/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-QmWsc5scQe0/V8khhvPlMLI/AAAAAAAAEIk/S1g06kGpbqQ81fmiSA26WfnBpt-Ah0NFACLcB/s320/4.png" width="218" /></a></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<span lang="EN-US">Java </span>의 라니스터 가문만큼이나 오래된<span lang="EN-US">, </span>그러나 항상 변방의<span lang="EN-US"> 2</span>인자였던<span lang="EN-US">,
Python</span>은 마치 스타크 가문 같습니다<span lang="EN-US">. </span>더구나<span lang="EN-US">,
2010</span>년 전후로는 거의 맛이 갈 정도로 존재감이 하락했던 적이 있습니다<span lang="EN-US">. </span>느려 터지기도
했었구요<span lang="EN-US">. </span>이제 몇 명 남지도 않았어요<span lang="EN-US">. </span>하지만<span lang="EN-US">, </span>그래서 소수의 몇몇은 여전히 매우<span lang="EN-US"> Agile </span>하죠<span lang="EN-US">. </span>더구나 시즌<span lang="EN-US"> 6 </span>마지막에 북부 연합은 스타크를 위한 대동단결의
결의를 보여 주었습니다<span lang="EN-US">. </span>이는 마치<span lang="EN-US"> Python</span>의 개발자
생태계를 보는 듯 합니다<span lang="EN-US">. </span>요즘은 개발자들이 직접 만들어 서로 공개<span lang="EN-US">, </span>공유 하고<span lang="EN-US">, </span>패키지를 주고 받는<span lang="EN-US"> pip </span>모듈 생태계가<span lang="EN-US">, </span>집단지성의 힘으로 재 조명되어<span lang="EN-US">, Java </span>나<span lang="EN-US"> C# </span>의 공룡 프레임워크의 그것을 위협하고 있습니다<span lang="EN-US">. <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Spring </span>이나<span lang="EN-US"> .NET
Framework </span>같은 공룡 가문은 없지만<span lang="EN-US">, </span>수많은<span lang="EN-US">
100</span>만 지방 호족의 힘을 합치면<span lang="EN-US">, </span>라니스터를 쉽게 위협하고도 남습니다<span lang="EN-US">.<o:p></o:p></span></div>
</td>
</tr>
<tr style="height: 17.65pt; mso-yfti-irow: 5; mso-yfti-lastrow: yes;">
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 5.0cm;" valign="top" width="189"><div class="MsoNormal">
<span lang="EN-US">TensoFlow (Deep Learning Framework By
Google),<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">SyntaxNet On TensorFlow ( for NLU, NLP By
Google)<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Anaconda ( for Machine Learning &
Deep Learning )<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-EoLPD7pPDZU/V8khvVvKfGI/AAAAAAAAEIo/I6yffss-a3oztJpVeY8VM43PMtUXnP0KQCLcB/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://1.bp.blogspot.com/-EoLPD7pPDZU/V8khvVvKfGI/AAAAAAAAEIo/I6yffss-a3oztJpVeY8VM43PMtUXnP0KQCLcB/s320/5.jpg" width="213" /></a></div>
<div class="MsoNormal">
<br /></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 17.65pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 248.55pt;" valign="top" width="331"><div class="MsoNormal">
<span lang="EN-US">Google </span>이 만들어내는<span lang="EN-US">
TensorFlow , SyntaxNet </span>같은 프레임워크는<span lang="EN-US"> GPU</span>도 지원되고<span lang="EN-US">, </span>병렬 분산 컴퓨팅도 지원하며<span lang="EN-US">, </span>엔진 코어가<span lang="EN-US"> C/C++ </span>이라 무지 빠르기 까지 합니다<span lang="EN-US">. </span>그리고<span lang="EN-US">, </span>개발자들은<span lang="EN-US"> Python </span>으로 코딩합니다<span lang="EN-US">. Google </span>이라는 한개 회사가 붙었을 뿐인데도<span lang="EN-US">.. </span>그 존재감은
“존 스노우” 급 입니다<span lang="EN-US">. </span>우리의 알파고도<span lang="EN-US"> Lua </span>언어의<span lang="EN-US"> Torch </span>에서<span lang="EN-US"> python </span>의<span lang="EN-US">
TensorFlow </span>로 갈아 탄바 있습니다<span lang="EN-US">. Python </span>입장에서는 존 스노우 처럼
죽다 살아난 말도 안 되는 존재감의 우군입니다<span lang="EN-US">.<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">Python Anaconda </span>는 아직은 약하지만<span lang="EN-US">, </span>뒤에 큰 활약이 예감되는 브랜이나 아리아 스타크 같습니다<span lang="EN-US">. </span>아직은
혼자<span lang="EN-US">(</span>병렬처리 안됨<span lang="EN-US">) </span>놀지만<span lang="EN-US">, GPU </span>를 달아주면<span lang="EN-US">, </span>그 퍼포먼스가 장난이 아닙니다<span lang="EN-US">.<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<br />
<div class="MsoNormal">
<br /></div>
<br />
<br />
<br />
<br />HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-28175661597573631482016-07-18T18:42:00.002+09:002018-01-26T08:11:21.130+09:00Word2Vec Vector Algebra Comparison - Python(Gensim) VS Scala(Spark)요즘 각종 내외부 Text 데이타들이, 새롭게 재 조명 되며, 다양한 형태로 분석 활용 되고 있다. 대표적인 예가 Text Classification , Sentiment Analysis , Opinion Mining 등 일것이다. (이 용어들 또한 많이 겹치는 의미들 이다.) 이러한 기법들을 이용하면, 고객센터나 이메일로 접수되는 내용들을 자동분류 하고, 실시간 Dash Board 화 하여, 문제가 되는 부분을 빠르게 파악 하고 대처할 수 있다. 또한, SNS나 게시판, 댓글등을 분석하여, 평판분석을 할 수 있고, 문제 상황을 좀더 빨리 인지하여 대응 할 수 있으며, 경쟁사의 평판과도 비교해 볼 수도 있다. 좀더 적극적으로는 Chat봇 이나 토픽 검색, 추천 고도화 등으로 확장되어 활용되는 사례도 많이 보이고 있다.<br />
<br />
<b>오늘 정리해본 내용은 그러한 Text 처리에 있어, 전처리 Word Embedding 기법 중 간단하면서도 뛰어난 효율을 보이는 Word2Vec 에 대한 내용이다. </b><br />
<br />
<ol>
<li>Word2Vec 알고리즘에 대하여?</li>
<ol>
<li>정의는 Learning4j 에서의 정의를 인용하였다.</li>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ol>
<li><span style="background-color: white; color: #505458; font-family: "noticia text" , "georgia" , serif; font-size: 15px; line-height: 26.25px;">"데이터의 양이 충분하면 Word2vec은 단어의 의미를 꽤 정확하게 파악합니다. 그리고 이를 이용하면 단어의 뜻 뿐만 아니라 여러 단어의 관계를 알아냅니다. 예를 들어 단어의 관계를 이용해 ‘남자’:’소년’ = ‘여자’:x 같은 관계식을 주면 x=’소녀’라는 답을 구할 수 있습니다. 단어 뿐만 아니라 더 큰 단위의 텍스트인 문장이나 문서를 분류하는데에도 Word2vec을 사용합니다. 예를 들어 문서를 군집화한 뒤에 결과를 이용하면 검색 엔진에서 문서의 분야별 검색(과학, 법률, 경제 등)이나 </span><a href="http://deeplearning4j.org/sentiment_analysis_word2vec.html" style="background-color: white; box-sizing: border-box; color: #337ab7; font-family: "Noticia Text", Georgia, serif; font-size: 15px; line-height: 26.25px; text-decoration: none !important; transition: all 400ms ease-in-out;">문장의 감정 분석</a><span style="background-color: white; color: #505458; font-family: "noticia text" , "georgia" , serif; font-size: 15px; line-height: 26.25px;">, 추천 시스템을 만들 수 있습니다."</span></li>
</ol>
<li>Word2Vec 은 텍스트를 처리하는 인공 신경망이며, 두 개의 층으로 구성되어 있다. 심층 신경망은 아니지만, 심층 신경망의 전처리 단계로 많이 쓰인다. </li>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://2.bp.blogspot.com/-HEkZbM405k4/V4ySb5IkwYI/AAAAAAAAEGE/bRs-rPCaQo0lVPL5KHekoStJfKieRCGmQCEw/s1600/word2vec_diagrams.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="372" src="https://2.bp.blogspot.com/-HEkZbM405k4/V4ySb5IkwYI/AAAAAAAAEGE/bRs-rPCaQo0lVPL5KHekoStJfKieRCGmQCEw/s640/word2vec_diagrams.png" width="640" /></a></div>
<ol>
<li>인공 신경망 작동 방식은 크게 위 2가지로 나뉜다.</li>
</ol>
<li>Word2Vec 알고리즘에 대하여 좀더 자세한 내용을 알고싶어 하는 분들은 이 글을 참고하면 될것 같다.</li>
<ol>
<li>자연어 기계학습의 혁명적 진화! (나프다에 기재된 글)</li>
<li><a href="http://www.moreagile.net/2014/11/word2vec.html">http://www.moreagile.net/2014/11/word2vec.html</a> </li>
</ol>
<ol>
</ol>
</ol>
</ol>
<br />
<br />
오늘 내가 정리하는 내용은 Word2Vec 을 실제 구현하는 2가지 큰 방법( Python vs Scala )에 대하여 비교 분석한 내용이다.<br />
<br />
<br />
<ol>
<li><b><u>구현방법 1</u></b></li>
<ol>
<li><b><u>Python 계열로 구현해 보기</u></b>.</li>
<ol>
<li>Gensim 으로 구현하면, Word2Vec 구현하기가 너무 쉽다.</li>
<li>게다가 다음과 같은 장점이 있다.</li>
<ol>
<li>Python 계열은 우선 설치도 간단하다.</li>
<ol>
<li>Anaconda 를 설치하자. 이거 하나로 모든게 해결된다.</li>
<li><a href="https://docs.continuum.io/anaconda/install">https://docs.continuum.io/anaconda/install</a></li>
</ol>
<li>Word2Vec 에서 생각해볼 수 있는 거의 모든 내용이, 매우 쉽게 사용가능한, 잘 정리된 메소드로, 거의 다 만들어져 있다.</li>
<li>사용예, 셈플도 매우 많다.</li>
<li>한글의 경우 좀 쓸만한 형태소 분석기들은 죄다, R이나 Python 계열이다. 때문에, 자연어 처리에 있어, Python으로의 선택은 이런 모듈들과 궁합이 좋아, 우선 가장 안전한 접근 일 수 있다.</li>
<ol>
<li>특히, Konlp 나 Konlpy 가 좋다.</li>
</ol>
<li>요즘 Python 은 GPU 를 쓰기도 좋고, CPython 등으로 인하여 속도도 매우 빠르다.</li>
</ol>
<li>물론 다음과 같은 단점도 있다.</li>
<ol>
<li>초 대용량으로 가는 경우 답이 없다.</li>
<li>기본적으로 아직 까지는 Single 머신으로 돌리는 것이 Default 이다. 물론 병렬로 돌리기 위한 몇몇 마이너한 방법들이 있으나, 아직 까지 그 길은 최적화 되어 있지 못하다.</li>
</ol>
<li>기본적인 코드들은 인터넷에 널려 있다.</li>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ol>
<li>참고로 너무 쉽고, 매우 짧다.</li>
<li>살짝 드려다 보자면...</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-LJGa23YgShg/V4yOKjjwxOI/AAAAAAAAEF8/NlqVC4uVRKEbg4lXgbO-PrjkTbHFrDFlgCEw/s1600/python_model_save.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="86" src="https://3.bp.blogspot.com/-LJGa23YgShg/V4yOKjjwxOI/AAAAAAAAEF8/NlqVC4uVRKEbg4lXgbO-PrjkTbHFrDFlgCEw/s640/python_model_save.png" width="640" /></a></div>
</ol>
<li>학습을 위해 준비한 데이타.</li>
<ol>
<li>나무위키 데이타, 위키피디아 데이타, 그리고 모사의 블로그 크롤링 데이타 등이 사용되었다.</li>
<li>데이타를 조사제거하고, 의미없이 너무 긴단어 제거하고, 몇몇 전처리를 해 줘야 하는데, 이 역시 Konlpy 등을 이용하면, 어렵지 않게 전처리 가능하다. (물론 Data가 매우 매우 클 때는 Python 으로는 매우 오래 걸리는 작업이긴 하지만..)</li>
</ol>
<li>대표적인 Vector Algebra 인 King:Man = Queen:Woman 예제를 돌려 보자. </li>
<ol>
<li>참고로 이 예제는 한글에서는 잘 맞지 않다. 그 이유는 왕 이라는 단어가, 한글에서는 동음 이의어가 존재하기 때문이다. (왕서방, 왕짜장, 왕 좋다. 킹 왕짱 등등 때문에 그렇다.)</li>
</ol>
<li>그래서 <span style="background-color: yellow;"><b>중국:북경 = 대한민국:서울</b></span> 의 Algebra로 실험을 해 보았다.<br /><span style="background-color: yellow; font-weight: bold;">중국 - 북경 = X - 서울</span><span style="background-color: white;"> 요렇게 표기하는 것도 가능할것이다.</span>답은 대한민국이 나와야 한다. X 를 구하기 위해 위 식을 아래처럼 다시 바꾸어 보았다.<br /><b style="background-color: yellow;">X = 중국 - 북경 + 서울</b></li>
</ol>
<li>Algebra 수식 부분 수행코드는 아래와 같다.</li>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://3.bp.blogspot.com/-3Ob9u7S2hRA/V4s1KTuAkXI/AAAAAAAAEFY/UCx4yOSOwpAlb_3B7GAhGlCH1JmxLRkNACLcB/s1600/python_algebra.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="134" src="https://3.bp.blogspot.com/-3Ob9u7S2hRA/V4s1KTuAkXI/AAAAAAAAEFY/UCx4yOSOwpAlb_3B7GAhGlCH1JmxLRkNACLcB/s640/python_algebra.png" width="640" /></a></div>
<ol>
<li>코드는 허무하게시리 간단하다.</li>
<li>위 결과에서처럼 대한민국과 한국이 1, 2등 이다. 놀랍지 아니한가??? 나는 처음 이 결과 봤을때 깜짝 놀랐었는데...</li>
</ol>
</ol>
<li><b><u>구현방법2</u></b></li>
<ol>
<li><b><u>Scala On Spark 로 구현해 보기.</u></b></li>
<ol>
<li>Spark 로 구현해 보자. Spark ML 안에 Word2Vec 이 있으니, 망설일 필요가 없다.</li>
<li>Spark 는 Mesos Cluster 로 구동하였고, 모든 데이타는 Hadoop 내 공유 저장소에 존재한다.</li>
<li>하지만, 막상 구현을 해보니, 일단 학습하고, 저장하고, 로드하는 Spark 가 제공하는 Example 외에, 실무에서 활용할 만한 Sample 이 너무 너무 없다.게다가, 메뉴얼이 매우 빈약하다.</li>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://2.bp.blogspot.com/-4RcRMnDM1Ws/V4ybJggBkgI/AAAAAAAAEGg/xbgos4spZysphDlQApv7Cj6PJCAISdV5QCLcB/s1600/spark_save_load.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="https://2.bp.blogspot.com/-4RcRMnDM1Ws/V4ybJggBkgI/AAAAAAAAEGg/xbgos4spZysphDlQApv7Cj6PJCAISdV5QCLcB/s640/spark_save_load.png" width="640" /></a></div>
<ol>
<li>여튼 코드는 간단하다. Sample을 찾긴 힘들지만...</li>
</ol>
<li>Algebra 예제는 2시간을 Goggling 해도 제대로 수행된는 Code를 찾기가 힘들다. 몇몇 Code가 stackoverflow 사이트 등에 메뉴얼 Base, 답변 글 형태로 Code가 존재하긴 하는데 작동하지 않는다. (아래에서 좀더 상세 설명)</li>
<li>API Document 를 보고 Algebra 구현을 시도해 보았다.</li>
<ol>
<li>1차 시도<a href="https://1.bp.blogspot.com/-mwaCfPaupOY/V4r3z1TEj2I/AAAAAAAAEFA/r0c-5vQkVYAgaOHJ4tXVomsA2fYLRMv8QCLcB/s1600/1%25EC%25B0%25A8%25EC%258B%259C%25EB%258F%2584.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="78" src="https://1.bp.blogspot.com/-mwaCfPaupOY/V4r3z1TEj2I/AAAAAAAAEFA/r0c-5vQkVYAgaOHJ4tXVomsA2fYLRMv8QCLcB/s640/1%25EC%25B0%25A8%25EC%258B%259C%25EB%258F%2584.png" width="640" /></a></li>
<ol>
<li>메뉴얼만 보면, 위처럼 하면 되야만 한다. </li>
<li>하지만 위처럼 하면, model.getVectors() 쪽에서 인자가 없다고 에러가 난다. 분명 API Doc 에는 getVectors() 가 인자 없는 메소드 인데 말이다.</li>
<li>() 를 하지 말고 그냥 가져오면 되긴 한다. </li>
<ol>
<li>val w2v_map = model.getVectors # 메뉴얼상의 getVectors() 메소드는 존재하진 않는다.</li>
<li>소스를 까보면 getVectors 가 <span class="pl-en" style="background-color: white; box-sizing: border-box; color: #795da3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">Map</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">[</span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">String</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">, </span><span class="pl-en" style="background-color: white; box-sizing: border-box; color: #795da3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">Array</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">[</span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">Float</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">]] 형태의 자료 구조이다.
즉, 뒤에서 다시 언급하겠지만, 그냥 Map 이라고 생각하고 getVectors(key:String) 으로 변수를
끄집어 낼수는 있지만, getVectors()(key:String)는 에러가 난다.</span></li>
<li><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 20px; white-space: pre;">위에서 getVectors()를 getVectors 로 고치면 위 에러는 해결 되지만, 사칙연산이 안되는 새로운
에러가 발생한다. 이는 뒤에서 다시 언급...</span></li>
</ol>
</ol>
<li>2차 시도.<a href="https://2.bp.blogspot.com/-_iikSFqJ5Rk/V4r4J-YFyUI/AAAAAAAAEFE/Yyd9gi8xn9wDarNq0cTDOehPZnc37b_cgCLcB/s1600/2%25EC%25B0%25A8%25EC%258B%259C%25EB%258F%2584.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="78" src="https://2.bp.blogspot.com/-_iikSFqJ5Rk/V4r4J-YFyUI/AAAAAAAAEFE/Yyd9gi8xn9wDarNq0cTDOehPZnc37b_cgCLcB/s640/2%25EC%25B0%25A8%25EC%258B%259C%25EB%258F%2584.png" width="640" /></a></li>
<ol>
<li>메뉴얼을 보면 이렇게 해도 되야 될거 같은데, 일단, 에러...</li>
<li>Vectors 를 사칙연산 가능하게 breeze Vector로 형변환 해주면 되긴 한다. 맨 뒤에서 다시 언급...</li>
</ol>
<li>IDE 로 가 보았다. (개인적으로 서버에서 Scala 코딩은 zepplin 이나 sbt 로 바로 코딩 하고 확인 하는걸 선호 하는데... 이런 경우는 IDE에서의 확인이 필요하다.)</li>
<ol>
<li>확인 결과 getVectors 는 메소드가 아니었다. 공식 API Document 에는 getter method 처럼 되어 있음에도 말이다...</li>
</ol>
<li>Github 의 소스 코드를 직접 확인해 보니 아래와 같다.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-yLxlr8oIa78/V4tLwiDK4wI/AAAAAAAAEFo/UNg7CFun9Hkq6wbJYonSpvxHfCxev0lxgCLcB/s1600/getVectors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://2.bp.blogspot.com/-yLxlr8oIa78/V4tLwiDK4wI/AAAAAAAAEFo/UNg7CFun9Hkq6wbJYonSpvxHfCxev0lxgCLcB/s640/getVectors.png" width="640" /></a></div>
<ol>
<li>getVectors 의 형이 요런식이다. 확실히 메소드가 아니다.TT</li>
</ol>
<li>3차시도</li>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ol>
<li>getVectors 자체에 args(N)을 인자로 주고, vector algebra 연산을 해보았다.</li>
<li>역시나.... algebra 연산에서 에러가 난다. Python 이 아니니까...</li>
<li>linear Algebra 를 위한 breeze Vector 로 형변환을 하고 시도하였다. 성공!</li>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://2.bp.blogspot.com/-lM6CrHLDXrU/V4yZRStRdKI/AAAAAAAAEGU/Qv4oJUeFRcQEWXwzQ56yAELFle4bW6VIwCEw/s1600/vector_algebra.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="https://2.bp.blogspot.com/-lM6CrHLDXrU/V4yZRStRdKI/AAAAAAAAEGU/Qv4oJUeFRcQEWXwzQ56yAELFle4bW6VIwCEw/s640/vector_algebra.png" width="640" /></a></div>
<ol>
<li>findSynonmys 안에 넣을때는 다시 dense 로 형변환이 필요하다. Python 이 얼마나 편한지... 비교 되는 부분이다. </li>
</ol>
</ol>
<li>Algebra 를 수행한 결과는 아래와 같다. Python 의 경우와 Data Set 이 살짝 달라서 결과도 약간 다르다.(시점 차이로..) 여튼 요런식으로 결과가 나온다.</li>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://4.bp.blogspot.com/-jn_savsQcRE/V4ydck53y5I/AAAAAAAAEGs/V7DdFcQfTnMJT0HhKdH9MGxTIXuU88wnwCLcB/s1600/scala_result.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://4.bp.blogspot.com/-jn_savsQcRE/V4ydck53y5I/AAAAAAAAEGs/V7DdFcQfTnMJT0HhKdH9MGxTIXuU88wnwCLcB/s640/scala_result.png" width="640" /></a></div>
</ol>
</ol>
</ol>
</ol>
<br />
최종 결론은 다음과 같다.<br />
<br />
<br />
<ol>
<li>Word2Vec 을 구현하기 위해</li>
<ol>
<li>Gensim + Python</li>
<ol>
<li>구현을 하기 위한 가장 손쉽고 빠른 접근 방법이다.</li>
<li>왠만한 모든 가공 처리가 일사천리로 진행 가능하다..막히는 부분이 거의 없다.</li>
<li>데이타 전처리 부 또한 걸출한 Open 모듈들이 매우 많다.</li>
<li>단, 데이타 크기가 수십기가가 넘어가면, 단일머신에서는 고사양이 아닌 경우 급격히 느려 진다.</li>
<li>GPU 를 사용하여 한번 더 성능을 점프 업 할 수 있으나, 이 역시 한계가 있다.</li>
<li>최고사양의 GPU 머신이라 할지라도 수백기가가 넘는 텍스트는 불가능 한 것으로 보여진다. (각종 변태 같은 다른 방법은 고려하지 않음.)</li>
</ol>
<li>Spark + Scala (or Python) : (실험에 사용한 환경은 Spark + Mesos + Hadoop)</li>
<ol>
<li>Spark 의 MLlib 를 이용하는 것이므로, Scala 가 아닌 Python 으로도 가능하다. </li>
<li>Python on Spark 인 경우 형태소 분리 등 전처리는 Python 의 모듈을 그대로 활용 할 수 있으며, Python 형태소 분리 등의 전처리를 Gensim 과 달리 병렬 처리 구현 하기 수훨해 진다.</li>
<li>단일 머신에서 돌릴때, Gensim 에 비하여 매우 느리다. 일단, Spark 는 분산처리를 위한 소잡는 칼이기 때문일 것으로 위안을 삼아 본다.</li>
<li>gensim 고사양 1대 vs Spark 고사양 5대를 비교 했는데, 극한의 Spark 튜닝을 하기 전에는 기본 비교 시 gensim 이 좀 더 빨랐다.</li>
<li>하지만 여러가지 튜닝을 해주니, 중사양 Spark 20대가 고사양 Gensim 1대보다 5배 정도 빠른 결과를 내 주었다. (이 부분은 별도로 Posting 을 해보겠다. 속도를 끌어 올리는데 매우 많은 실험과 극한의 config 설정 튜닝이 필요하였다.)</li>
<li>무엇보다, Gensim 고성능 서버 1대에서 절대 돌지 않는 양 (수백 GB 이상)의 데이타가 Spark Dev 클러스터 중사양 20대에서는 그런데로의 속도로 도는 것이 가능하였다. ( 이 부분도 별도로 Posting 해 보도록 하겠다. 각종 Memory 관련 이슈가 등장하는데, 이 부분을 해결하는것 또 한 매우 많은 실험과 극한의 설정 튜닝이 필요하였다. 속도도 속도 지만, 대 용량을 Spark ML 로 돌릴때에는 Memory 의 제약으로 인하여 각종 Trick 이 필요한데. 이 부분의 작업은 매우 지난한 작업 이었다.)</li>
<li>수 ~ 수십 TB 단위의 데이타로의 실험을 해보진 않았는데, 돌지 않을지도 모른다는 생각이 든다, 실험결과 Spark Submit 수행시 주는 옵션인 Driver Memory가 학습할 Text 데이타의 크기에 비례하여 많이 필요하였기 때문이다. </li>
</ol>
<li>결론</li>
<ol>
<li>작은 양의 데이타는 Gensim + Python Win!</li>
<li>중간 이상 크기의 데이타는 어쩔 수 없이 Spark!</li>
<li>그 이상 크기의 데이타는, 곧 훨씬 더 큰 데이타와 훨씬 고사양의 훨씬 많은 Spark 노드에서 다시 한번 테스트 해볼 예정이지만, 위 2-7의 가설이 맞다면, 어쩔 수 없이... deeplearning4j! (물론 deeplearning4j 도 내부에서 Spark를 이용하고는 있지만..)</li>
<li>어느정도 이상의 데이타는 도메인을 나누어 학습을 시켜도 될 듯 싶다.</li>
<ol>
<li>어느정도 이상의 데이타는 표본이 전수를 대표하는 성격을 가질 것이기 때문이다. 굳이 이세상의 모든 데이타를 하나의 model 로 합쳐서 학습할 필요가 없다는 생각이 든다.</li>
<li>백과 사전 몇개를 학습하여, 일반어 간의 거리를 관리하는 모델을 하나 만들어 놓고, 이후부터는 특정 도메인 별로 데이타를 수집하여 별개로 학습해도 될 것 같다.</li>
<ol>
<li>예를 들어, 네이버 요리 카테고리 블로그를 따로 쭉 학습해서 요리 단어에 대한 학습을 하고 나면, 요리 박사가 될 수 있다.</li>
<li>상품명을 가지고 크롤링 하여 쭉 학습을 하고 나면 또 상품 박사가 될 수 있다.</li>
<li>결국은 중간 Classification 분류 대표명이 중요하다. 중분류 대표명이 있다면, 세상의 모든 단어에 해당하는 백과사전 Model 과 특정 분야에 특화된 Domain 사전 간에 중분류 대표 단어를 매개로 거리 Mapping 을 통하여, 다양한 조합 쿼리가 가능하기 때문이다. (단, 방향성 연산은 이 시나리오가 통하지 않는다. 복수 모델을 조합할때는 similarity 연산만 유용하다.)</li>
<li>백과사전 Model 로 부터 다양한 형태의 자연어 대화 질문을 Classification 대표 질문으로 분류해주고, Classfication 대표 질문으로 부터 해당 Class 에 맞는 Domain 특화 model 에 질의 하여 정확한 전문 용어를 끄집어 내는 것이 가능 할 것이기 때문이다.</li>
</ol>
</ol>
</ol>
</ol>
</ol>
<br />
<br />HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com5tag:blogger.com,1999:blog-8166686140676460430.post-75316235133164708232016-04-25T13:23:00.001+09:002016-04-25T13:52:54.257+09:00TensorFlow - TensorBoard 로 Tensor Graph 및 각종 정보 시각화 해보기TensorFlow 는 명령형 인터페이스 이외에도, 웹상에서 상태를 볼 수 있는 TensorBoard 를 제공한다. TensorBoard를 이용하면, TensorFlow Graph 를 시각화 해 볼 수도 있고, Quantitative metrics 를 차트(plot) 형태로 볼 수도 있으며, understand, debug, optimize 등에 활용 가능하다. <br />
<br />
아래는 TensorBoard 를 구동 및 활용하는 방법이다.<br />
<br />
<br />
<ol>
<li>TensorBoad 데몬 구동</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-G2hn0j7i3xs/Vx1z1GOMCsI/AAAAAAAAEAU/T537-Uv6vtQtY6X0LWnZLoMV6Lj36fxXgCLcB/s1600/TensorBoard1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="128" src="https://1.bp.blogspot.com/-G2hn0j7i3xs/Vx1z1GOMCsI/AAAAAAAAEAU/T537-Uv6vtQtY6X0LWnZLoMV6Lj36fxXgCLcB/s640/TensorBoard1.png" width="640" /></a></div>
<ol>
<li>sudo tensorboard --logdir=/home/spiccato/tensorboard &</li>
</ol>
<li>OS 내부 방화벽 해제 </li>
<ol>
<li>iptables -F : 걍 귀찮으니까 다 끈다...</li>
</ol>
<li>외부에서 접속해 보자.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-xenpmULg7Ic/Vx10b3sXOkI/AAAAAAAAEAc/obcq8czi5W44C9fLRAvxqH1ZO0KXmDTTQCLcB/s1600/TensorBoard2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="https://2.bp.blogspot.com/-xenpmULg7Ic/Vx10b3sXOkI/AAAAAAAAEAc/obcq8czi5W44C9fLRAvxqH1ZO0KXmDTTQCLcB/s400/TensorBoard2.png" width="400" /></a></div>
<ol>
<li>http://서버URL:6006</li>
</ol>
<li>소스에서 로그를 남겨보자.</li>
<ol>
<li>TensorBoard 는 자동으로 모든 Training 이나 Test 를 시각화 해주진 않는다. 원하는 Log 를 Serialize ( TensorBoard 는 구글 답게 Protobuf 객체로 Serialize 한다. ) 하여 적절하게 객체에 담아 Disk 에 써 주면, 해당 Serialize Data 가 존재하는 위치를 LogDirectory 로 인지하여 데몬이 구동되어야, 시각화가 가능하다.</li>
<li>한가지 다행인 것은 디렉토리 관리가 가능하다는 점이다.</li>
<li>복수의 모델을 TensorBoard 로 관리하고자 할때, LogDirectory 안에 모델별로 디렉토리가 존재하고 해당 디렉토리를 내려가야 파일이 존재한다면, 해당 ParentDirectory 를 지정하는 경우 메뉴화 접근이 가능하다.</li>
<li>소스에서 로그를 남기는 부분에 대한 설명은 아래에 잘 명기 되어 있음.</li>
<ol>
<li>https://www.tensorflow.org/versions/r0.8/how_tos/summaries_and_tensorboard/index.html</li>
<li>Log 의 Summary Write 메소드 수행시 경로 직정을 적절하게 잘 해주어야 함.</li>
<ol>
<li>train_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/train', sess.graph)</li>
<li>test_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/test')</li>
</ol>
</ol>
</ol>
<li>위에서 지정한 logdir 로 tensorboard 구동</li>
<ol>
<li>아래 처럼 TensorFlow Graph 시각화 가능.</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-huYKNioRJDM/Vx2az2EynhI/AAAAAAAAEAs/D_Ho5vMLb58SwgVzBwlFv6vSY075rtyvQCLcB/s1600/TensorBoard3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="https://1.bp.blogspot.com/-huYKNioRJDM/Vx2az2EynhI/AAAAAAAAEAs/D_Ho5vMLb58SwgVzBwlFv6vSY075rtyvQCLcB/s400/TensorBoard3.png" width="400" /></a></div>
<ol>
<li>CNN알고리즘 for MNIST</li>
<li>Hidden Node 를 (+)클릭하여 Drill Down 상세화 해보기</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Y0nBRL865Z4/Vx2ikaSy9TI/AAAAAAAAEBE/8saEUSXaDL0imhtxk92tEZdeSNtP-pODgCLcB/s1600/TensorBoard5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://2.bp.blogspot.com/-Y0nBRL865Z4/Vx2ikaSy9TI/AAAAAAAAEBE/8saEUSXaDL0imhtxk92tEZdeSNtP-pODgCLcB/s400/TensorBoard5.png" width="228" /></a></div>
<li>아래는 x entropy mean 값 polt 그래프</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-gcep6mlF37E/Vx2bg5mo5hI/AAAAAAAAEA0/Sg0M4SchankYGKeK5C918QObhflyQ0lJgCLcB/s1600/TensorBoard4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="292" src="https://2.bp.blogspot.com/-gcep6mlF37E/Vx2bg5mo5hI/AAAAAAAAEA0/Sg0M4SchankYGKeK5C918QObhflyQ0lJgCLcB/s400/TensorBoard4.png" width="400" /></a></div>
</ol>
</ol>
</ol>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-48061603592237483212016-04-22T16:23:00.002+09:002016-04-27T02:15:20.201+09:00TensorFlow - CNN 모델 for MNIST<br />
TensorFlow를 이용한 Deep Neural Network 의 Hellow World 격인 MNIST....<br />
(Hellow World 라고는 했지만, 쉬운 알고리즘과 어려운 알고리즘이 있는데, 오늘 다루는 알고리즘은 알파고에서도 쓰였을 정도로, 간단하지만은 않은 알고리즘이다. 그러나, TensorFlow가 많은것을 추상화 해 주어 이 마저도 매우 간단하다.)<br />
<br />
MNIST 는 손필기체를 인식하여 숫자를 알아맞추는 일종의 이미지 Classification 문제이다. 여러가지 알고리즘이 존재하는데.... SoftMax , SVM 등도 가능하고... 오늘 수행해본 CNN(Convolutional Neural Networks) 도 가능하다.<br />
<br />
아래는 설치시 기 제공하는 convolutional.py example 파일로 MNIST 를 학습 수행시키는 학습 과정이다.<br />
<br />
SoftMax 알고리즘을 가지고 training 을 수행하고(training data set으로), test 를 돌리면(test data set으로) 정확도가 약 93% 정도가 나온다. (소스 코드는 20~30줄 정도밖에 안된다.)<br />
<br />
그리고, oeverfit 을 피하기 위한 dropout, <span style="background-color: white; color: #141823; font-family: "helvetica" , "arial" , sans-serif; font-size: 14px; line-height: 19.32px;">gradient vanishing 문제의 해결책으로 나온 ReLU, 그리고 </span>max pooling 등 여러가지 트릭 알고리즘들을 추가로 수행 시켜 주면 성능이 99.2% 정도까지 바로 향상이 된다. ( 모두 tensorflow 안에 기 구현되어 있어 한두줄 메소드 실행으로 수행 가능한 기법 들이다. 이 기법들을 모두 적용해도 전체 소스라인이 60~70줄 정도이다.)<br />
<br />
TensorBoard 로 코드를 시각화 해보면 아래와 같다. (정말 God! Google 이다.)<br />
데몬을 띄우고 브라우저로 볼수 있으며, URL은 http://서버URL:6006 이다.<br />
(<a href="http://hoondongkim.blogspot.kr/2016/04/tensorflow-tensorboard-tensor-graph.html">TensorFlow - TensorBoard 로 Tensor Graph 및 각종 정보 시각화 해보기</a>)<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-OLB_VSlQ0VE/Vx7FDGKCWoI/AAAAAAAAEBg/UhlZOzYuiDserkX5pnm2_Sx4GbvgW35ZQCLcB/s1600/TensorBoard3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="https://1.bp.blogspot.com/-OLB_VSlQ0VE/Vx7FDGKCWoI/AAAAAAAAEBg/UhlZOzYuiDserkX5pnm2_Sx4GbvgW35ZQCLcB/s400/TensorBoard3.png" width="400" /></a></div>
<br />
사실 아래 링크에서 MNIST알고리즘들의 정확도 랭킹을 확인 할 수 있다.<br />
<a href="http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html">http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html</a><br />
아래 랭크에서도 상당히 Top 레벨에 해당하는 매우 정확도 높은 결과임을 확인 할 수 있다.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-U_14G6rBi50/VxnQeif027I/AAAAAAAAEAA/b_i0oyNmipIQvu_J4_2exMGkijMmyCk_QCLcB/s1600/%25EC%2595%258C%25EA%25B3%25A0%25EB%25A6%25AC%25EC%25A6%2598%25EB%259E%25AD%25ED%2582%25B9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-U_14G6rBi50/VxnQeif027I/AAAAAAAAEAA/b_i0oyNmipIQvu_J4_2exMGkijMmyCk_QCLcB/s320/%25EC%2595%258C%25EA%25B3%25A0%25EB%25A6%25AC%25EC%25A6%2598%25EB%259E%25AD%25ED%2582%25B9.png" width="313" /></a></div>
<br />
아래는 CNN 모델 수행 및 Training 과정이다.<br />
<br />
<ol>
<li>모듈 위치 확인 및 모듈 import</li>
<ol>
<li>메뉴얼과 다르게 나의 머신의 tensorflow 라이브러리들 위치 경로는 아래와 같았다.</li>
<ol>
<li>/usr/lib/python2.7/site-packages/tensorflow</li>
</ol>
<li>모듈 import</li>
<ol>
<li>python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'</li>
</ol>
</ol>
<li>CNN 모델 수행</li>
<ol>
<li>모델 수행</li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-QsStRwJX7gg/VxC-OVglICI/AAAAAAAAD88/FwD_CX04sfo1QoHieYyC7QCwgf5tnJpZwCLcB/s1600/CNN1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="416" src="https://3.bp.blogspot.com/-QsStRwJX7gg/VxC-OVglICI/AAAAAAAAD88/FwD_CX04sfo1QoHieYyC7QCwgf5tnJpZwCLcB/s640/CNN1.png" width="640" /></a></div>
<ol>
<li>CNN 수행</li>
</ol>
<li>최종 학습 결과</li>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-jhjY6J40Oek/VxC-_eSW6tI/AAAAAAAAD9Q/ZMwfZTihapUoToOdt8-3GTNCCU7k8ZqtACLcB/s1600/CNN2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="392" src="https://3.bp.blogspot.com/-jhjY6J40Oek/VxC-_eSW6tI/AAAAAAAAD9Q/ZMwfZTihapUoToOdt8-3GTNCCU7k8ZqtACLcB/s640/CNN2.png" width="640" /></a></div>
<ol>
<li>최종 학습 결과</li>
<li>러닝이 진행되면서 error 율이 점점 줄어 들었음.</li>
</ol>
</ol>
</ol>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-69318512368636283032016-04-15T10:19:00.002+09:002016-04-15T17:17:15.539+09:00TensorFlow - CentOS 6.X 구버전에 설치기TensorFlow는 CentOS 7 최신 버전에서는 그나마 쉽게 설치가 된다. 하지만, CentOS 6 후반 버전에서는 Dependency 모듈 버전 업 해줄게 많아 설치가 좀 귀찮은 작업들이 수반된다.TT<br />
<br />
그래서, 누군가가 CentOS 6.X 에 TensorFlow를 설치한다고 한다면, 만약 테스트 목적이라면, Docker 를 쓰거나 Python 의 Virtualenv를 쓰라고 권장하고 싶다. 그렇지 않고, 실제 머신에 Fully 깔고자 한다면, CentOS 6.X 는 과감하게 포맷하고 OS 부터 버전업 하라고 권하고 싶다.<br />
<br />
여튼 메모해놓은 내용을 정리해 보았다.<br />
<ol>
<li>Python 환경 정비</li>
<ol>
<li>기본 설치 버전 확인</li>
<ol>
<li>python -V 로 버전 확인. TensorFlow는 2.7 이나 3.3이상의 Python 이 필요함.</li>
<li>버전이 낮은 경우 설치.(아래는 2.7 기준)</li>
<ol>
<li>sudo yum install gcc</li>
<li>소스로 깔자!. 2.X 의 최신버전은 2.7.11이넹.</li>
<li>wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz</li>
<li>tar xvzf Python-2.7.11.tgz</li>
<li>cd Python-2.7.11</li>
<li>./configure</li>
<li>구버전 Overwrite 방지하면서...</li>
<ol>
<li>sudo make altinstall</li>
</ol>
<li>잘 설치 되었나 확인</li>
<ol>
<li>python2.7 -V</li>
<li>python -V</li>
<ol>
<li>아직 python 컴멘드는 옛날 버전으로 연결 됨.</li>
</ol>
</ol>
</ol>
<li>python 구 버전 dependancy 완전 없애고 Gracefully 하게 update 하기.(CentOS 7.1 기준)</li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px; line-height: inherit;">yum groupinstall -y "Development tools"</span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px; line-height: inherit;">yum install -y zlib-devel</span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">yum install -y openssl-devel</span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">yum install -y ncurses-devel</span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">yum install -y sqlite-devel</span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">Which python </span></span></li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">/usr/bin/python</span></span></li>
</ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">아래 명령 수행</span></span></li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;">ln -s /usr/local/bin/python2.7/usr/local/bin/python</span></li>
</ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">다시 which python</span></span></li>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">/usr/local/bin/python</span></span></li>
</ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">나갔다 들어와서 python 이라고 날려보면 정상적으로 반영된걸 볼 수 있음.</span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-U8s25dYrjLg/VwtetWrVVnI/AAAAAAAAD3k/qrEyG_7mHqIpqxdhlavwktpS4ZkRg7UNw/s1600/tensorflow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="70" src="https://2.bp.blogspot.com/-U8s25dYrjLg/VwtetWrVVnI/AAAAAAAAD3k/qrEyG_7mHqIpqxdhlavwktpS4ZkRg7UNw/s640/tensorflow.png" width="640" /></a></div>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">python 버전 변경 완료</span></span></li>
</ol>
</ol>
</ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">Pip Upgrade</span></li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">pip 또한 구 버전이 설치 되어 있음.</span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">pip 버전 확인 </span></span></li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">pip --version</span></span></li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">구버전 2.6 이라고 나옴.</span></span></li>
</ol>
</ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">신 버전 설치</span></span></li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">wget https://bootstrap.pypa.io/get-pip.py</span></span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">python get-pip.py</span></span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">ls -al /usr/local/bin/pip* 를 해보면 새로 설치 된 2.7 버전 확인 가능.</span></span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">역시 나갔다 들어오거나 bash 갱신 해주면, 정상적으로 pip --version 확인 시 2.7로 바뀐 것을 확인 할 수 있게 됨.</span></span></li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">pip 버전 변경 완료<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-dO-3V3DXvog/Vwt7uWm79BI/AAAAAAAAD30/E17UG3f6x6ghFjUmCCykLamEQafiG1nIw/s1600/pip.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="42" src="https://4.bp.blogspot.com/-dO-3V3DXvog/Vwt7uWm79BI/AAAAAAAAD30/E17UG3f6x6ghFjUmCCykLamEQafiG1nIw/s640/pip.png" width="640" /></a></div>
</span></span></li>
</ol>
</ol>
</ol>
</ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px;">TensorFlow Install</span></li>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">CPU Only</span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-g5xO6YrhNFA/Vwt9J1J99XI/AAAAAAAAD4A/nI92p1GMOWwPC99lv2hMdYcNWEwxtiKKA/s1600/install.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="244" src="https://1.bp.blogspot.com/-g5xO6YrhNFA/Vwt9J1J99XI/AAAAAAAAD4A/nI92p1GMOWwPC99lv2hMdYcNWEwxtiKKA/s640/install.png" width="640" /></a></div>
<ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;"></span></span></li>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;">pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl</span></li>
</ol>
<li><span style="color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">GPU enabled</span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-Ug_X9g0TU9Q/Vwt98JXRRYI/AAAAAAAAD4I/IaxdYxS7n4Qf1rwlDsvEo1nG_KAzq9E3Q/s1600/gpu-enabled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://3.bp.blogspot.com/-Ug_X9g0TU9Q/Vwt98JXRRYI/AAAAAAAAD4I/IaxdYxS7n4Qf1rwlDsvEo1nG_KAzq9E3Q/s640/gpu-enabled.png" width="640" /></a></div>
<ol>
<li></li>
<li style="color: #333333; font-family: consolas, 'liberation mono', menlo, courier, monospace; font-size: 13.6px;">pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl</li>
<li style="color: #333333; font-family: consolas, 'liberation mono', menlo, courier, monospace; font-size: 13.6px;">Cuda 인스톨</li>
<ol style="color: #333333; font-family: consolas, 'liberation mono', menlo, courier, monospace;">
<li style="font-size: 13.6px;">링크로 대신.</li>
<li><span style="font-size: 13.6px;">https://www.tensorflow.org/versions/r0.7/get_started/os_setup.html#optional-install-cuda-gpus-on-linux</span></li>
</ol>
<li style="color: #333333; font-family: consolas, 'liberation mono', menlo, courier, monospace;"><span style="font-size: 13.6px;"><span style="color: black; font-family: "source code pro" , monospace; font-size: 16px; line-height: 26px;">~/.bash_profile 안에 cuda 아래 환경 변수 추가</span></span></li>
<ol>
<li style="color: #333333; font-family: consolas, 'liberation mono', menlo, courier, monospace;"><span style="font-size: 13.6px;"><span style="color: black; font-family: "source code pro" , monospace; font-size: 16px; line-height: 26px;">LD_LIBRARY_PATH</span></span></li>
<ol style="color: #333333; font-family: consolas, 'liberation mono', menlo, courier, monospace;">
<li><span style="font-size: 13.6px;"><span style="color: black; font-family: "source code pro" , monospace; font-size: 16px; line-height: 26px;">/usr/local/cuda 추가</span></span></li>
</ol>
<li><span style="color: #333333; font-family: "source code pro" , monospace; line-height: 26px;">CUDA_HOME</span></li>
<ol>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">/usr/local/cuda 추가</span></span></li>
</ol>
</ol>
</ol>
</ol>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">TensorFlow 수행</span></span></li>
<ol>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">TensorFlow 로딩 해보기</span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-TkUgZzJGqkQ/VwvLqw9XwCI/AAAAAAAAD4c/Xq5zjEgzf08pY4gtq6wE_MzcQhr5abj9w/s1600/hello_tensorflow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://1.bp.blogspot.com/-TkUgZzJGqkQ/VwvLqw9XwCI/AAAAAAAAD4c/Xq5zjEgzf08pY4gtq6wE_MzcQhr5abj9w/s640/hello_tensorflow.png" width="640" /></a></div>
<ol>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">우선 라이브러리 import</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">위와 같은 에러 남.</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">GLIBC_2.14 설치 하자!</span></span></li>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ol>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">wget http://mirror.bjtu.edu.cn/gnu/libc/glibc-2.14.tar.xz</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">tar xvf glibc-2.14.tar.xz</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">cd glibc-2.14</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">mkdir build</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">cd build</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">../configure --prefix=/opt/glibc-2.14</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">make -j4</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">make install</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">cd ~</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">vi .bash_profile</span></span></li>
<li><span style="font-family: "source code pro" , monospace; line-height: 26px;">export LD_LIBRARY_PATH=/opt/glibc-2.14/lib:$LD_LIBRARY_PATH</span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">source .bash_profile</span></span></li>
</ol>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">초기 에러는 해결 되었으나, 뒤이어 아래 에러 발생</span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-darOhzlts7Y/VwvWRP_iKWI/AAAAAAAAD4s/JvbZ3KahUMYKSEH8skS3tGPm8Izic5rTg/s1600/error2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="318" src="https://2.bp.blogspot.com/-darOhzlts7Y/VwvWRP_iKWI/AAAAAAAAD4s/JvbZ3KahUMYKSEH8skS3tGPm8Izic5rTg/s640/error2.png" width="640" /></a></div>
<ol>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">이번에는 GLIBCXX_3.4.14 모듈 필요.</span></span></li>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">rpmfind 에서 libstdc 모듈 설치</span></span></li>
</ol>
<li><span style="font-family: "source code pro" , monospace;"><span style="line-height: 26px;">기타, CentOS6.X 버전에따라 좀더 추가 모듈 Dependency 가 날 수 있으나, 일단, CentOS6.X 후반 버전에서는 위 정도로 설치 완료...</span></span></li>
</ol>
<li><span style="font-family: source code pro, monospace;"><span style="line-height: 26px;">Hello, TensorFlow!</span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-zPjaxM0O2nc/VxCjZUQvyhI/AAAAAAAAD8s/9bRwWXgcU2MOqwrqNCg_UKru-TCWMf_SgCLcB/s1600/hello_tensorflow2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://3.bp.blogspot.com/-zPjaxM0O2nc/VxCjZUQvyhI/AAAAAAAAD8s/9bRwWXgcU2MOqwrqNCg_UKru-TCWMf_SgCLcB/s640/hello_tensorflow2.png" width="640" /></a></div>
<ol>
<li><span style="font-family: source code pro, monospace;"><span style="line-height: 26px;"><br /></span></span></li>
</ol>
</ol>
</ol>
<ol><ol><ol><ol>
</ol>
</ol>
</ol>
</ol>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-53246384871030182822016-02-24T13:41:00.000+09:002016-02-24T13:41:05.848+09:00Spark Job On Mesos - Log HandlingSpark 스탠드얼론 모드에서는 Conf 디렉토리 안의 log4j.properties 정보를 수정하면, 로그 핸들링을 개별 프로그램안에서 해주지 않아도, Log 핸들링이 가능하다.<br />
<br />
문제는 Spark Job 을 Mesos 위에서 구동할 때 인데..<br />
<br />
Spark 의 log4j 옵션과 Mesos 의 Log 관련 옵션을 모두 수정해 주어도, Log 핸들링이 잘 안된다. ( 아직 내가 찾지 못한 다른 이유가 있을 지도 모른다.)<br />
<br />
여하튼, 혹시나 하고, Programmatic 하게 소스에서 로그 레벨 수정을 해보았더니...<br />
역시 된다.<br />
<br />
사실, 일반적인 Java 프로그램이었다면, 되는게 당연한 거지만, Scala Job 이 Spark 엔진 위에서 구동되는데, 그게 또다시 Mesos 로 추상화 된 리소스 관리하에 구동되는 상황에서 이옵션이 먹다니.....<br />
<br />
역시, Conf 보다 Source 가 앞서는 일반적인 Spark 옵션들과 마찬가지로, Log 또한 Source 에서 잡아 주니 모든 중간 Tier 와 무관하게 전면 적용이 되었다.<br />
(부연하자면, Spark-submit 의 옵션이나 Conf 파일보다.. Source 상의 new SparkConf().set() 옵션이 최 우선 적용되는 다른 옵션과 같은 맥락이다는 뜻이다.)<br />
<br />
여하튼....Spark Job 을 Mesos 위에서 구동시 Log 해들링 하는 방법은 그냥 Java 에서 하듯이 아래처럼 하면 된다.<br />
<br />
[1] import<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-f1BtfJtIC7Y/Vs0zxjP1xuI/AAAAAAAADzg/15Q_EQRUm40/s1600/log-handling.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="70" src="https://3.bp.blogspot.com/-f1BtfJtIC7Y/Vs0zxjP1xuI/AAAAAAAADzg/15Q_EQRUm40/s640/log-handling.png" width="640" /></a></div>
<br />
[2] set<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-4wCUut8p72I/Vs0z3A6M9MI/AAAAAAAADzk/cbKSSknC9qE/s1600/log-handling2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="84" src="https://2.bp.blogspot.com/-4wCUut8p72I/Vs0z3A6M9MI/AAAAAAAADzk/cbKSSknC9qE/s640/log-handling2.png" width="640" /></a></div>
<br />
<br />
저렇게 하면... 네임스페이스에 따라 완전 깨끗하게 지울수도 있고....<br />
위처럼 org.apache.spark 까지 주면, spark 관련된 로그만 깨끗하게 지울수가 있음.<br />
<br />
<br />
<br />
<br />
<br />
<br />HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com0tag:blogger.com,1999:blog-8166686140676460430.post-36195607769838820852016-01-05T15:36:00.003+09:002016-01-05T15:56:28.988+09:00SparkR 설치 사용기 1 - Installation Guide On Yarn Cluster & Mesos Cluster & Stand Alone ClusterSparkR은 설치 및 사용기, 기타 내부 작동방식 등에 대한 자료가 너무 부족한거 같다. 내부 작동 방식에 대하여 너무 궁금했었는데, 여러가지 Mode 로 설치해보고 다양한 삽집을 거친 후, 조금씩 돌아가는 코드들을 만들어 돌려 보고 나서야, 조금씩 내부 구조가 감이 잡히기 시작했다.<br />
<br />
사용을 해보기 전 가졌던 의문들은 다음과 같다. 의문에 대한 답은 정답이 아닐지도 모른다. 아직 코드 레벨에서 SparkR Core Code 까지는 까보고 확인해 보진 않았기 때문이다. 하지만, 실제 돌아가는 코드들을 하나 둘 만들어 수행해가며 실험을 해보니, 아래와 같은 유추가 가능하였다.<br />
<br />
<ol>
<li><b>Spark 는 Yarn 이나 Mesos 위에서 구동시 Spark 엔진을 모든 노드에 깔아줄 필요가 없다. R도 그럴가?</b></li>
<ol>
<li>SparkR은 R없이 동작되지 않는다. Local R과 Spark 엔진 사이에는 Layer 가 잘 나누어져 있는듯 하다. SparkR 모듈에서 R의 모든것을 처리하는 것이 아니라 인터페이스도 한다는 의미이다. 즉, bin 디렉토리에서 sparkR 을 수행하면, 로컬의 R이 반드시 있어야 그 위에서 무언가가 sparkR로서 완벽한 구동이 가능하다.</li>
</ol>
<li><b>R에서 사용하는 외부 Package 들은 모든 노드에 직접 설치 수행해 주어야 하나?</b></li>
<ol>
<li>실험해 보니... 그렇다. 모든 노드에 설치해주지 않으면, 해당 모듈이 설치되지 않는 노드에서 계산 시 해당 노드에서만 에러가 난다.</li>
<li>외부 Package 설치는 일반적인 R의 그것과 동일하였다. SparkR 이 아닌 그냥 R 콘솔에서 install.package("패키지명") 하여 설치하면, SparkR 에서도 잘 인식 한다.</li>
</ol>
<li><b>경로 참조는 어떤식으로 이루어 지나?</b></li>
<ol>
<li>여러가지 메소드를 사용해보았는데, 동작 방식이 다소 차이가 있었다.</li>
<li>어떤 메소드는 해당 노드의 로컬경로를 찾는 것이 있다. (주로 R 고유 메소드 들..)</li>
<li>그리고, 어떤 메소드는 Hadoop 에서 해당 경로를 찾는 것도 있었다. (옵션 인자 를 확인해보진 않았지만, default 옵션이 그렇게 동작하는 것들이 있었다.)</li>
<li>SparkR 이 제공하는 특화 메소드들은 몇몇 Hadoop 이 default 인것들이 보인다.</li>
</ol>
<li><b>전통적인 R 스타일의 코드는 동작하지 않나? 예를 들어 R이 제공하는 data.frame 을 모두 SparkR 이 제공하는 dataframe(RDD Base) 로 일부 코드레벨로 치환해주어야만 동작하나?</b></li>
<ol>
<li>답은 아니다 이다.</li>
<li>전통적인 R 스타일 코드도 동작하고, SparkR 스타일로 치환한 스타일 코드 또한 당연히 잘 동작한다.</li>
<li>단, 전자는 병렬처리가 안되는 것을 확인하였다. 후자는 병렬 처리가 이루어 진다.</li>
</ol>
<li><b>Production Level 의 실용적인 R코드를 SparkR 로 치환하는 대 진입장벽은 어느정도 인가?</b></li>
<ol>
<li>계산 로직을 처음부터 만드는 경우이거나, Primitive 한 계산 로직 혹은 데이타 가공 처리 위주의 Legacy R 코드는 SparkR 스타일로 치환하기가 크게 어렵진 않다. </li>
<li>단, data.frame 이나 data.read 부분의 메소드 들을 SparkR 스타일로 변경해주는 약간의 작업이 필요하다. 해당 코드들은 그러나 대부분 Legacy 코드의 5% 미만인 경우가 대부분일 것이다.</li>
<li>외부 Package 를 그대로 사용하는 경우는 약간 제약이 따른다. 일부 그래프 패키지 등은 SparkR 스타일로 계산을 끝내고, 자료구조에 최종 결과 Dataframe 만을 남긴 이후, 해당 data 를 R스타일 자료로 옮기고 그대로 사용가능하다. (sparkR 의 dataframe 을 input 으로 받아주지 못하는 Package 가 대부분이므로...) 초기 계산 data가 매우 크다 할지라도, 계산이 끝난 데이타는 양이 작아질 수 있으므로, 이 시나리오는 그런데로 available 할 수 있다.</li>
<li>하지만, 외부 Package 로 마이닝 로직을 거대 Input 데이타에 데고 수행해야 하는 경우, SparkR 의 DataFrame 은 병렬성을 지원하지만, 해당 패키지가 해당 자료구조를 Input 으로 받지 못하여 Package 사용에 제약이 따른다. 이경우 현재까지는 아래와 같은 우회 해결책 외에는 해결 방법이 없어 보인다.</li>
<ol>
<li>우선은 Spark ML 등에서 제공하는 다른 유사 알고리즘. 혹은 Mahout 등이 제공하는 외부 모듈을 사용하여 해당 연산 Job 을 분리 수행 시키는 방법이 있을 것이다. (널리 알려진 알고리즘들은 대부분 이 방법으로 수행이 가능할 것이다.)</li>
<li>하지만, R 에서만 존재하는 알고리즘을 꼭 써야 하는 경우는.... 어쩔 수 없이, 패키지를 그대로 사용하지 못하고, 해당 패키지의 Primitive 한 소스 코드를 열어서 자료구조를 SparkR 스타일로 치환해주는 작업이 필요하다. (패키지의 소스 난이도에 따라 available 한 방법이 아닐 수도 있다.)</li>
</ol>
</ol>
</ol>
<br />
아래는 우선 각 Compute Node 에 R 설치하는 과정이다.<br />
우선 CentOS6 장비들과 CentOS7 장비들의 설치 과정이 다소 차이가 있었다.<br />
<br />
<ol>
<li><b>centos 6 에서 Install</b></li>
<ol>
<li><span style="font-size: 9pt;">wg</span><span style="font-family: "courier new"; font-size: 9pt;">et </span><span style="background-color: white; font-family: 돋움; font-size: 12px; line-height: 18px; white-space: normal;"><span style="font-family: "courier new"; font-size: 9pt;">http://mirror.us.leaseweb.net/epel/6/x86_64/epel-release-6-8.noarch.rpm</span></span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: consolas, 'liberation mono', courier, monospace; font-size: 13px; line-height: 19px; white-space: pre;">wget https://www.fedoraproject.org/static/0608B895.txt</span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: consolas, 'liberation mono', courier, monospace; font-size: 13px; line-height: 19px; white-space: pre;">sudo mv 0608B895.txt /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 <-폴더생성됨</span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: consolas, 'liberation mono', courier, monospace; font-size: 13px; line-height: 19px; white-space: pre;">sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6</span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: consolas, 'liberation mono', courier, monospace; font-size: 13px; line-height: 19px; white-space: pre;">rpm -qa gpg*</span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: consolas, 'liberation mono', courier, monospace; font-size: 13px; line-height: 19px; white-space: pre;">sudo rpm -ivh epel-release-6-8.noarch.rpm</span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: consolas, 'liberation mono', courier, monospace; font-size: 13px; line-height: 19px; white-space: pre;">sudo yum install -y npm </span></li>
<li><span style="color: #666666; font-family: consolas, liberation mono, courier, monospace;"><span style="background-color: #f8f8f8; font-size: 13px; line-height: 19px; white-space: pre;">sudo yum install -y R</span></span></li>
</ol>
<li><span style="background-color: #f8f8f8; color: #666666; line-height: 19px; white-space: pre;"><b><span style="font-family: inherit;">centos 7 에서 Install</span></b></span></li>
</ol>
<ol>
<ol>
<li style="font-size: 13px; line-height: 19px; white-space: pre;"><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;">epel-release & npm 최신 버전 설치</span></li>
<ol style="font-size: 13px; line-height: 19px; white-space: pre;">
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent; color: #c20cb9; font-weight: bold; margin: 0px; padding: 0px; word-wrap: break-word;">wget</span><span style="background-color: transparent;"> https://dl.fedoraproject.org/pub/epel/epel-release-latest</span><span style="background-color: transparent; color: black; margin: 0px; padding: 0px; word-wrap: break-word;">-7</span><span style="background-color: transparent;">.noarch.rpm</span></span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;">sudo rpm -ivh <span style="background-color: transparent;">epel-release-latest</span><span style="background-color: transparent; color: black; margin: 0px; padding: 0px; word-wrap: break-word;">-7</span><span style="background-color: transparent;">.noarch.rpm</span></span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">sudo yum install -y npm</span></span></li>
</ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="font-size: 13px; line-height: 19px; white-space: pre;">이후 R설치 시도</span></span></li>
<ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="font-size: 13px; line-height: 19px; white-space: pre;">이 경우 몇가지 Dependency 에러가 나는 경우가 있음. 각각을 rpm 찾아서 수동 설치</span></span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">wget ftp://ftp.muug.mb.ca/mirror/centos/7.1.1503/os/x86_64/Packages/blas-devel-3.4.2-4.el7.x86_64.rpm</span></span></li>
<ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="font-size: 13px; line-height: 19px; white-space: pre;">sudo yum install -y blas (버전이 devel 과 일치해야 함. 일치안할때는 rpm찾아서 깔아주면 됨.)</span></span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="font-size: 13px; line-height: 19px; white-space: pre;">sudo yum install -y gcc-gfortran</span></span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="font-size: 13px; line-height: 19px; white-space: pre;">sudo rpm -ivh </span><span style="background-color: transparent;">blas-devel-3.4.2-4.el7.x86_64.rpm</span></span></li>
</ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.1.1503/os/x86_64/Packages/lapack-devel-3.4.2-4.el7.x86_64.rpm</span></span></li>
<ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;">sudo yum install -y lapack </span><span style="background-color: #f8f8f8; color: #666666; font-family: consolas, 'liberation mono', courier, monospace; font-size: 13px; line-height: 19px; white-space: pre;">(버전이 devel 과 일치해야 함. 일치안할때는 rpm찾아서 깔아주면 됨.)</span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="font-size: 13px; line-height: 19px; white-space: pre;">sudo rpm -ivh </span><span style="background-color: transparent;">lapack-devel-3.4.2-4.el7.x86_64.rpm</span></span></li>
</ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">http://rpm.pbone.net/index.php3/stat/4/idpl/26647268/dir/centos_7/com/texinfo-tex-5.1-4.el7.x86_64.rpm.html 요기에서 texinfo-tex 모듈 다운로드 하여 인스톨</span></span></li>
<ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">sudo yum install -y tex</span></span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">sudo yum install -y texinfo</span></span></li>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">http://rpm.pbone.net/index.php3/stat/4/idpl/29077368/dir/centos_7/com/texlive-epsf-svn21461.2.7.4-32.el7.noarch.rpm.html 요기에서 tex(epsf) 모듈 다운로드 하여 인스톨</span></span></li>
<ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">sudo rpm -ivh texlive-epsf-svn21461.2.7.4-32.el7.noarch.rpm</span></span></li>
</ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: transparent;">sudo rpm -ivh texinfo-tex-5.1-4.el7.x86_64.rpm</span></span></li>
</ol>
</ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: #f9f9f9; font-family: monospace, 'courier new'; line-height: 16.9px;">Dependency 모듈 모두 설치 후 R설치 재 시도</span></span></li>
<ol>
<li><span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace;"><span style="background-color: #f9f9f9; font-family: monospace, 'courier new'; line-height: 16.9px;">sudo yum install -y R</span></span></li>
</ol>
</ol>
</ol>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><br /></span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;">앞서 질문과 자답에서 언급한 것 처럼 SparkR 병렬 구동에 앞서 위와 같이 R 을 모든 Compute Node 에 설치 해주어야 한다.</span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><br /></span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;">그리고 나면, 아래처럼 Spark Submit 으로 R 코드를 수행 할 수 있다.</span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><br /></span></span></div>
<div>
<ol>
<li><b style="color: #666666; font-family: monospace, 'courier new'; line-height: 16.9px;">SparkR 실행 On Yarn</b></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-B5yHq46FkyU/VotiTcWD8qI/AAAAAAAADw0/_ULSIH03ViQ/s1600/SubmitOnYarn.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="http://2.bp.blogspot.com/-B5yHq46FkyU/VotiTcWD8qI/AAAAAAAADw0/_ULSIH03ViQ/s640/SubmitOnYarn.png" width="640" /></a></div>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>SparkR 실행 On Mesos</b></span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-dxCmHxAFM3I/VotiTXV-KmI/AAAAAAAADxA/3hralfYGS8w/s1600/SubmitOnMesos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="http://2.bp.blogspot.com/-dxCmHxAFM3I/VotiTXV-KmI/AAAAAAAADxA/3hralfYGS8w/s640/SubmitOnMesos.png" width="640" /></a></div>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>SparkR 실행 On StandAlone</b></span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-TJJuD-XY0AY/VotiTefSc5I/AAAAAAAADw8/2LkJmV2ntu0/s1600/SubmitOnStandAlone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="http://1.bp.blogspot.com/-TJJuD-XY0AY/VotiTefSc5I/AAAAAAAADw8/2LkJmV2ntu0/s640/SubmitOnStandAlone.png" width="640" /></a></div>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>병렬 수행 후 결과 Output</b></span></span></li>
<ol>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>Legacy R 스타일 Code 수행</b></span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-_6ZAQ8Bv5MM/VotkWNsfGLI/AAAAAAAADxQ/lHzQ9IEqkd0/s1600/result1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://4.bp.blogspot.com/-_6ZAQ8Bv5MM/VotkWNsfGLI/AAAAAAAADxQ/lHzQ9IEqkd0/s640/result1.png" width="360" /></a></div>
<ol>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>내부 Cat 한 로그 위주로 출력.</b></span></span></li>
</ol>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>Spark R 스타일 Code 수행</b></span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-bVO3PWyYXFk/VotkWPdX9vI/AAAAAAAADxU/LkO4RKl3oGA/s1600/result2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="416" src="http://1.bp.blogspot.com/-bVO3PWyYXFk/VotkWPdX9vI/AAAAAAAADxU/LkO4RKl3oGA/s640/result2.png" width="640" /></a></div>
<ol>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>병렬 수행을 위한 Shuffle 로그도 함께 출력.</b></span></span></li>
</ol>
</ol>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>R 콘솔</b></span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Qn-uRhAlbd8/Voto8lpBolI/AAAAAAAADxk/jPx40VlnKX4/s1600/R_Console.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="244" src="http://1.bp.blogspot.com/-Qn-uRhAlbd8/Voto8lpBolI/AAAAAAAADxk/jPx40VlnKX4/s640/R_Console.png" width="640" /></a></div>
<li><span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b>SparkR 콘솔</b></span></span></li>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-9puv9edoGR4/Voto8irnQkI/AAAAAAAADxo/F-jqOnbbk0E/s1600/sparkR_Console.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="268" src="http://2.bp.blogspot.com/-9puv9edoGR4/Voto8irnQkI/AAAAAAAADxo/F-jqOnbbk0E/s640/sparkR_Console.png" width="640" /></a></div>
<ol><ol>
</ol>
</ol>
</ol>
</div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b><br /></b></span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><b><br /></b></span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><br /></span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><br /></span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><br /></span></span></div>
<div>
<span style="color: #666666; font-family: monospace, courier new;"><span style="line-height: 16.9px;"><br /></span></span></div>
<span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace; font-size: 13px; line-height: 19px; white-space: pre;"><br /></span>
<span style="background-color: #f8f8f8; color: #666666; font-family: "consolas" , "liberation mono" , "courier" , monospace; font-size: 13px; line-height: 19px; white-space: pre;"><br /></span>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com1tag:blogger.com,1999:blog-8166686140676460430.post-78974788441612183742015-12-29T18:26:00.003+09:002015-12-30T16:00:54.995+09:00Mesos 0.26.0 - 기본 설치 세팅 On CentOS7.X최근 들어 Mesos 버전업이 매우 빠른 듯 하다.<br />
약 4개월 전 TO-BE Cluster 에 최신 버전 업그레이드를 한 바 있었는데.. 금일 TO-BE 클러스터에 0.26.0 으로 다시 클러스터 버전을 업그레이드 해보았다. 고세 TO-BE 클러스터의 갯수가 3배 이상 늘어 났기도 하고...<br />
(*주의* : 2015년 12월 30일 현재 Spark 1.5.1과 본 Mesos 버전에는 일부 so모듈상에 호환성 문제가 발견되고 있음.)<br />
<br />
DevOps 환경인지라...TO-BE 라고는 하지만, 부분 적으로 AS-IS 운영 모드로도 사용 중인 지라, 당분간 Adhoc 배치 위주로 버전 업 된 Mesos 환경에서 여러가지 AS-IS 모듈들을 돌려 보아야 하겠다. 아래는 디테일한 튜닝 작업 전 기본 세팅 버전의 설치 스크립트 이다.<br />
<br />
무슨 일기 쓰는 느낌이네...<br />
<ol>
<li>Download 및 설치 준비</li>
<ol>
<li>wget http://apache.mirror.cdnetworks.com/mesos/0.26.0/mesos-0.26.0.tar.gz</li>
<li>tar xvzf mesos*.tar.gz</li>
<li>cd mesos-0.26.0</li>
<li>sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo</li>
<li>epel-release 설치</li>
<li><pre style="background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; overflow: auto; padding: 9.5px; word-break: break-all; word-wrap: break-word;"><code style="background-color: transparent; border-radius: 0px; box-sizing: border-box; color: inherit; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: inherit; padding: 0px; word-wrap: normal;">sudo yum install -y epel-release</code></pre>
</li>
</ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">Mesos dependency 모듈 설치</span></span></li>
<ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">dependency 프로그램을 위한 추가 설정</span></span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;"><pre style="background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; line-height: 1.42857; margin-bottom: 10px; overflow: auto; padding: 9.5px; word-break: break-all; word-wrap: break-word;"><code style="background-color: transparent; border-radius: 0px; box-sizing: border-box; color: inherit; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: inherit; padding: 0px; word-wrap: normal;">$ sudo cat > /etc/yum.repos.d/wandisco-svn.repo <<EOF
[WANdiscoSVN]
name=WANdisco SVN Repo 1.9
enabled=1
baseurl=http://opensource.wandisco.com/centos/7/svn-1.9/RPMS/$basearch/
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
EOF</code></pre>
</span></span></li>
<li><span style="font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="line-height: 22.8571px; white-space: pre;"><pre style="background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; overflow: auto; padding: 9.5px; word-break: break-all; word-wrap: break-word;"><code style="background-color: transparent; border-radius: 0px; box-sizing: border-box; color: inherit; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: inherit; padding: 0px; word-wrap: normal;">sudo yum update systemd</code></pre>
</span></span></li>
<li><pre style="background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; overflow: auto; padding: 9.5px; word-break: break-all; word-wrap: break-word;"><code style="background-color: transparent; border-radius: 0px; box-sizing: border-box; color: inherit; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: inherit; padding: 0px; word-wrap: normal;">sudo yum groupinstall -y "Development Tools"</code></pre>
</li>
<li><pre style="background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; overflow: auto; padding: 9.5px; word-break: break-all; word-wrap: break-word;"><code style="background-color: transparent; border-radius: 0px; box-sizing: border-box; color: inherit; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: inherit; padding: 0px; word-wrap: normal;">sudo yum install -y apache-maven python-devel java-1.8.0-openjdk-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel subversion-devel apr-util-devel</code></pre>
</li>
</ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">Mesos 설치</span></span></li>
<ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">cd mesos폴더</span></span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">./bootstrap</span></span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">mkdir build</span></span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">cd build</span></span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">../configure</span></span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">make -j (core갯수) V=0</span></span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">make check</span></span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">sudo make install</span></span></li>
</ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">Master Node Running Script</span></span></li>
<ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">work_dir 설정</span></span></li>
<ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">mkdir /data02/mesos</span></span></li>
</ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">build/bin 아래에 run script 만듦.</span></span></li>
<ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; line-height: 18.5714px; white-space: pre;">/data01/mesos/mesos-0.26.0/build/bin/mesos-master.sh --ip=서버IP --work_dir=/data02/mesos &</span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">구동.</span></span></li>
</ol>
</ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">Slave Node Running Script</span></span></li>
<ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">build/bin 아래에 run script 만듦.</span></span></li>
<ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; line-height: 18.5714px; white-space: pre;">/data01/mesos/mesos-0.26.0/build/bin/mesos-slave.sh --master=서버IP --work_dir=/data02/mesos &</span></li>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">구동</span></span></li>
</ol>
</ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">Web 관리 콘솔 구동</span></span></li>
<ol>
<li><span style="color: #333333; font-family: Menlo, Monaco, Consolas, Courier New, monospace;"><span style="font-size: 13px; line-height: 18.5714px; white-space: pre;">http://masterNo_IP:5050</span></span></li>
</ol>
</ol>
HoonDong Kimhttp://www.blogger.com/profile/00470004459268852878noreply@blogger.com1