태그 보관물: PNNL

TensorFlow 0.8 – Distributed!

오늘 구글은 텐서플로우의 0.8 버전 업데이트를 발표하였습니다. 이번 버전은 그 동안 텐서플로우의 단점으로 지적되어왔던 분산(distributed) 처리 기능을 추가한 것 입니다. 이전 포스트에서 미국 에너지부의 산하 연구기관인 PNNL에서도 텐서플로우의 분산처리 버전을 공개할 것이라고 발표했었는데 구글의 이번 발표로 기대감이 좀 줄어들게 되었습니다.

아래 그래프는 GPU 갯수를 늘려 분산처리를 했을 때 속도 향상에 대한 그래프입니다. PNNL에서 발표한 자료에서도 분산 처리를 한 만큼 선형적으로 성능이 향상되지는 않았습니다. 텐서플로우 0.8 버전에서도 GPU 코어수가 늘어남에 따라 대략 50% 정도 성능 향상에 수렴하는 것으로 보입니다.

image00

분산 처리를 위해 PNNL은 MPI(메세지 패싱 인터페이스)를 사용했다고 했는데 구글은 gRPC를 이용했다고 합니다. 그 외 눈에 띌만한 변경사항으로는 랜덤 포레스트(Random Forest) 알고리즘이 추가되었고 분리되어 개발되던 skflow가 텐서플로우 레파지토리 안으로 들어왔습니다. 따라서 skflow를 사용하시려면 Python의 import 문이 조금 바뀌게 됩니다.

from tensorflow.contrib.learn.python import learn

0.8 버전을 이용하여 텐서플로우 튜토리얼을 업데이트 하도록 하겠습니다.

텐서플로우 0.8 버전을 설치하시려면 파이썬 패키지 매니저인 pip 를 통해 손쉽게 업그레이드 하실 수 있습니다.

# for Linux
# Python 2.x and GPU
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0rc0-cp27-none-linux_x86_64.whl
# Python 2.x and CPU
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0rc0-cp27-none-linux_x86_64.whl
# Python 3.x and GPU
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0rc0-cp34-cp34m-linux_x86_64.whl
# Python 3.x and CPU
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0rc0-cp34-cp34m-linux_x86_64.whl

# for Mac
# Python 2.x
$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0rc0-py2-none-any.whl
# Python 3.x
$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0rc0-py3-none-any.whl

그외 주요 변경 사항은 아래 페이지에서 참고하실 수 있습니다.

https://github.com/tensorflow/tensorflow/releases/tag/v0.8.0rc0

(추가) 업그레이드가 아니고 텐서플로우를 처음 설치하시는 경우에는 pip 명령에서 ‘–upgrade’ 옵션을 빼셔야 합니다.

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

텐서플로우의 최대의 약점을 하나 꼽자면 아마도 병렬처리 부분일 것 입니다. 텐서플로우는 여래개의 멀티코어 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 와 고성능 네트워크 인터페이스에 대한 지원이 부족하여 제외하였다고 기술되어 있습니다.

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

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

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

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