태그 보관물: CNTK

Chainer, MXNet, CNTK, TF benchmarking

체이너(Chainer)는 일본에서 만들어져 널리 사용되는 딥러닝 프레임워크입니다. 지난 1월 샌프란시스코에서 열린 딥러닝 서밋을 통해 발표한 체이너의 분산버전의 체이너(Chainer Multi-Node)를 이용해 다른 프레임워크와 비교를 한 결과가 체이너 블로그에 올려졌습니다. 블로그에서도 언급했지만 이는 완벽하게 공정한 벤치마킹이 아닐 수 있습니다. 비교적 체이너가 실험 환경에 최적화되어 있고 다른 프레임워크는 그러지 못했을 수도 있습니다. 그렇더라도 GPU가 증가함에 따라 거의 선형적으로 퍼포먼스가 증가하는 그래프는 대단한 것 같습니다. 이 벤치마킹의 결과는 텐서플로우가 CNTK나 MXNet 과 비교해도 많이 성능이 뒤쳐진 것을 보여 줍니다.

dlsummit_06_framework-samples-per-second

체이너 멀티 노드 프레임워크는 Nvidia 의 니켈(NCCL) 라이브러리를 사용하여 GPU간 데이터 전송을 직접 처리합니다. MXNet과 CNTK가 단일 서버(4 코어까지는 단일 서버입니다)에서 조금 더 높은 성능을 내는 이유는 C++ 구현이기 때문이고 체이너는 파이썬 구현이라는 차이 때문으로 보고 있습니다. CNTK는 체이너 멀티노드처럼 니켈 라이브러리를 사용하지만 서버가 늘어남에 따라 MXNet과 성능 차이가 엇갈리고 있습니다. 텐서플로우가 느린 주된 요인으로는 분산 모드에서 파라미터 서버와 워커 서버간의 gRPC 통신의 오버헤드로 추측하고 있습니다. 스탠드얼론(standalone)일 경우엔 이와 다른 결과가 나올 수 있습니다. 이 벤치마킹에는 분산 기능이 내장되지 않은 씨아노(Theano)나 토치(Torch)는 포함되지 않았습니다.

최근에 나온 또 다른 벤치바킹 자료들에서도 텐서플로우의 성능은 그다지 뛰어나게 평가되지는 못하고 있습니다. 하나는 DyNet 의 페이퍼 ‘DyNet: The Dynamic Neural Network Toolkit‘ 이고 또 다른 하나는 ‘Benchmarking State-of-the-Art Deep Learning Software Tools‘ 입니다. 파이토치를 포함한 더 광범위한 벤치마킹이 진행되길 기대해 봅니다.

OpenAI + Microsoft

OpenAI 가 딥러닝을 위한 플랫폼으로 마이크로소프트의 Azure 를 사용하기로 협약했다는 발표가 OpenAI 블로그마이크로소프트의 블로그에 각각 실렸습니다. OpenAI 는 그 동안 시라스케일(Cirrascale)을 사용하고 있는 것으로 알려졌었는데요. 아마존이 AWS 에 새로운 GPU 인스턴스를 출시했음에도 불구하고 동일한 K80 GPU 를 쓰고 있는 Azure 를 택한 것은 다소 의외인 것 같습니다. 마이크로소프트가 뭔가 파격적인 제안을 했을까요?

OpenAI 블로그에 따르면 Azure 에서 수천에서 수만대 까지 인스턴스를 사용할 것 같다고 합니다. 마이크로소프트가 이번 계기로 자사의 딥러닝 툴킷 CNTK 의 저변을 넓히는 데 힘을 얻을 수 있을까요. 깃허브의 딥러닝 인기도 조사(?)를 하고 있는 프랑소와 숄레(François Chollet)의 최근 트윗을 보면 바이두의 패들패들이 CNTK 보다 조금 더 활발히 움직이고 있는 것으로 보입니다.

cxutsrnucaebsg4

CNTK 2.0 with Python

마이크로소프트의 딥러닝 라이브러리인 CNTK의 2.0 베타가 배포되었습니다. 브랜딩도 Microsoft Cognitive Toolkit 으로 바꾸고 홈페이지도 새로 개편했네요. CNTK는 버전 번호가 크게 변하는 편인데요. 이번에는 2.0으로 바꾸면서 많은 기능이 추가된 것 같습니다. 대표적인 것인 파이썬 API를 지원하고 있어 넘파이(numpy)와 함께 섞어 쓸 수 있다는 점입니다. 다양한 파이썬 예제와 주피터 노트북도 깃허브 레파지토리에서 확인할 수 있습니다. 마이크로소프트 블로그에서는 CNTK의 큰 장점 중에 하나로 대량 데이터를 사용한 머신러닝에 사용할 수 있도록 분산 처리에 강하다는 점을 설명하고 있습니다. CNTK는 여전히 가장 강력한 오픈소스 라이센스 정책을 가지고 있습니다. 윈도우 환경에서 텐서플로우나 씨아노(Theano) 같은 딥러닝 라이브러리를 제치고 자리매김할 수 있을지 많은 기대가 됩니다.

딥러닝 패키지 비교

comparison_of_deep_learning_package

위키피디아에 딥러닝 패키지를 비교하는 페이지가 있어 소개해 드립니다. 현재 비교하고 있는 소프트웨어는 Caffe, CNTK, Deeplearning4j, MXNet, Neural Designer, OpenNN, SINGA, SystemML, TensorFlow, Theano, Torch 입니다. 이외에도 더 많은 패키지들이 있지만 점차 추가되지 않을까 합니다. 대표적인 툴들을 한 눈에 볼수 있어 참고자료로 사용하시면 좋을 것 같습니다.

텐서플로우(TensorFlow)의 병렬 처리 버전이 곧 나온다.

텐서플로우의 최대의 약점을 하나 꼽자면 아마도 병렬처리 부분일 것 입니다. 텐서플로우는 여래개의 멀티코어 CPU, GPU를 지원하지만 여러대의 머신에서 병렬로 모델을 학습시킬 수가 없습니다. 마이크로소프트가 CNTK를  발표하면서도 텐서플로우와의 차별점으로 이 점을 부각시켰었습니다.

물론 구글 내부에서 사용하는 텐서플로우는 분명 병렬처리가 가능한 버전일 것입니다. 하지만 오픈소스에는 이 부분이 포함되어 있지 않습니다. 그런데 곧 이 약점이 메꾸어질 수 있을 것 같습니다. 미국 에너지부의 산하 연구기관인 Pacific Northwest National Laboratory(이하 PNNL)이 텐서플로우에 병렬처리 기능을 더한 소프트웨어를 올 봄에 릴리즈 하겠다고 발표하였습니다.

이와 관련된 논문을 PNNL에서 한달 전 쯤 발표했습니다. 이 논문에서 텐서플로우의 병렬 처리를 위해 어떤 방법을 사용하였는 가와 성능의 향상이 얼만큼 되었는지를 보여주고 있습니다. 병렬 처리를 위한 서버간 통신을 위해서는 메세지 패싱 인터페이스(MPI)를 사용했고 학습을 위한 데이터를 쪼개어 각 서버에서 독립적으로 모델을 학습하였습니다.

학습된 모델의 가중치(Weight)와 바이어스(Bias)를 동기화 시킬 때는 알고리즘이 복잡해지고 MPI 프로토콜이 충분히 빠르기 때문에 비동기적(asynchronous)인 방법을 쓰지 않고 동기적인 방법을 채택했다고 합니다.

MPI 대신 맵리듀스(Map-Reduce) 스타일의 하둡(Hadoop)이나 스파크(Spark)를 선택할 수 있었지만 높은 I/O 와 고성능 네트워크 인터페이스에 대한 지원이 부족하여 제외하였다고 기술되어 있습니다.

논문에 있는 결과 리포트 중 MNISTCIFAR10 데이터셋을 이용한 DNN(Deep Neural Network), CNN(Convolution Neural Network)테스트 결과는 아래와 같습니다. x 축은 core의 수를 나타냅니다.

그래프에서 알 수 있듯이 병렬화에 의한 성능 향상이 선형적으로 증가하지는 않았습니다. 하지만 이 실험은 제약적 환경에서 운영된 것으로 좀 더 향상될 여지는 있어 보입니다. 다만 병렬화가 크면 클 수록 코어당 처리할 수 있는 일의 양은 상대적으로 줄어드는 것은 피할수 없을 것 같습니다.

이번 달 혹은 다음 달에 정식 릴리즈가 되면 다시 포스팅하도록 하겠습니다.

(추가) Jeff Dean은 텐서플로우 깃허브에 올라온 분산 처리에 대한 이슈에 코멘트를 달았었습니다. 여기에서 텐서플로우의 분산(병렬) 기능은 구글 내부 인프라에 밀접하게 연관되어 있어서 깃허브에 올리지 못하고 싱글 머신 버전 먼저 올린 것이라고 합니다. 연관된 코드를 정리하고 있지만 아직 남아있는 것이 있습니다. 하지만 가장 높은 우선순위를 두고 있다고 밝혔습니다.

마이크로소프트(Microsoft), 바이두(Baidu)도 딥러닝 프레임워크를 오픈소스로 공개했다.

작년 말에 마이크로소프트가 머신러닝 툴킷 DMTK를 공개하였습니다.

https://tensorflowkorea.wordpress.com/2015/11/16/마이크로소프트-머신러닝-툴킷-dmtk-오픈소스로-배포/

이에 이어 딥러닝 프레임워크 CNTK(Computational Network Toolkit)를 오픈 소스로 공개하였습니다. CNTK는 마이크로소프트가 코타나(Cortana)나 Skype 번역 어플리케이션에 사용하는 인공신경망 알고리즘 프레임워크로 구글의 텐서플로우(TensorFlow)에 대응하는 제품이라고 볼 수 있습니다.

http://www.wired.com/2016/01/microsoft-tries-to-one-up-google-in-the-open-source-ai-race/

놀라운 것은 CNTK 가 구글의 텐서플로우와는 다르게 완전 무료라는 점 입니다. 수정, 복사는 물론 재배포, 판매까지 상업적이던 아니던 아무런 제약없이 사용할 수 있습니다. 사실 구글의 텐서플로우를 상업적 목적으로 사용하기에는 라이센스에 제약이 있다는 점을 잘 파고든 것 같습니다.

https://github.com/Microsoft/CNTK

마이크로소프트 과학자의 말을 인용하면 구글이 공개한 텐서플로우 버전을 여러개의 머신에서 병렬로 딥러닝을 수행하기에는 부족하다고 합니다. 토치(Torch) 프레임워크를 제외하고는 CNTK가 거의 유일한 대규모의 인공신경망 분석을 할 수 있는 완제품 이라고 합니다. 현재는 C++ 만을 지원하지만 곧 Python 을 지원할 계획이라고 합니다.

또 불과 일주일 전에는 중국의 최대 검색엔진인 바이두(Baidu)의 AI 랩에서 Warp-CTC(Connectionist Temporal Classification) 라는 CTC 교사학습(Supervisored Learning) 알고리즘을 구현한 소프트웨어를 공개하였습니다.

https://github.com/baidu-research/warp-ctc

2년전 구글의 딥러닝 프로젝트를 이끌던 스탠포드 대학교의 앤드류응(Andrew Ng) 교수가 바이두 AI 랩 수장으로 옮긴 일이 화제가 되기도 했었습니다. 아마도 바이두는 머신러닝 주도권 싸움이 구글과 마이크로소프트간의 경쟁으로만 남게 두지는 않을 것 같습니다.

자 다음에는 누구 차례일까요? 아마도 페이스북이 아닐까 합니다. 물론 딥러닝을 위한 GPU 기반의 하드웨어 설계를 공개했지만 구글과 마이크로소프트에 비하면 조금 밀리는 것 같습니다. 언젠가 페이스북이 발표할 그 무엇을 기대해 봅니다.