텐서플로우의 최대의 약점을 하나 꼽자면 아마도 병렬처리 부분일 것 입니다. 텐서플로우는 여래개의 멀티코어 CPU, GPU를 지원하지만 여러대의 머신에서 병렬로 모델을 학습시킬 수가 없습니다. 마이크로소프트가 CNTK를 발표하면서도 텐서플로우와의 차별점으로 이 점을 부각시켰었습니다.
물론 구글 내부에서 사용하는 텐서플로우는 분명 병렬처리가 가능한 버전일 것입니다. 하지만 오픈소스에는 이 부분이 포함되어 있지 않습니다. 그런데 곧 이 약점이 메꾸어질 수 있을 것 같습니다. 미국 에너지부의 산하 연구기관인 Pacific Northwest National Laboratory(이하 PNNL)이 텐서플로우에 병렬처리 기능을 더한 소프트웨어를 올 봄에 릴리즈 하겠다고 발표하였습니다.
https://plus.google.com/100922732508111452182/posts/RW4yhz8QvWu?iem=4&gpawv=1&hl=ko-US
이와 관련된 논문을 PNNL에서 한달 전 쯤 발표했습니다. 이 논문에서 텐서플로우의 병렬 처리를 위해 어떤 방법을 사용하였는 가와 성능의 향상이 얼만큼 되었는지를 보여주고 있습니다. 병렬 처리를 위한 서버간 통신을 위해서는 메세지 패싱 인터페이스(MPI)를 사용했고 학습을 위한 데이터를 쪼개어 각 서버에서 독립적으로 모델을 학습하였습니다.
학습된 모델의 가중치(Weight)와 바이어스(Bias)를 동기화 시킬 때는 알고리즘이 복잡해지고 MPI 프로토콜이 충분히 빠르기 때문에 비동기적(asynchronous)인 방법을 쓰지 않고 동기적인 방법을 채택했다고 합니다.
MPI 대신 맵리듀스(Map-Reduce) 스타일의 하둡(Hadoop)이나 스파크(Spark)를 선택할 수 있었지만 높은 I/O 와 고성능 네트워크 인터페이스에 대한 지원이 부족하여 제외하였다고 기술되어 있습니다.
논문에 있는 결과 리포트 중 MNIST와 CIFAR10 데이터셋을 이용한 DNN(Deep Neural Network), CNN(Convolution Neural Network)테스트 결과는 아래와 같습니다. x 축은 core의 수를 나타냅니다.
그래프에서 알 수 있듯이 병렬화에 의한 성능 향상이 선형적으로 증가하지는 않았습니다. 하지만 이 실험은 제약적 환경에서 운영된 것으로 좀 더 향상될 여지는 있어 보입니다. 다만 병렬화가 크면 클 수록 코어당 처리할 수 있는 일의 양은 상대적으로 줄어드는 것은 피할수 없을 것 같습니다.
이번 달 혹은 다음 달에 정식 릴리즈가 되면 다시 포스팅하도록 하겠습니다.
(추가) Jeff Dean은 텐서플로우 깃허브에 올라온 분산 처리에 대한 이슈에 코멘트를 달았었습니다. 여기에서 텐서플로우의 분산(병렬) 기능은 구글 내부 인프라에 밀접하게 연관되어 있어서 깃허브에 올리지 못하고 싱글 머신 버전 먼저 올린 것이라고 합니다. 연관된 코드를 정리하고 있지만 아직 남아있는 것이 있습니다. 하지만 가장 높은 우선순위를 두고 있다고 밝혔습니다.
핑백: TensorFlow 0.8 – Distributed! | 텐서플로우 코리아 (TensorFlow Korea)