안녕하세요. "생각의 웹"입니다.


요즘 핫 이슈인 TensorFlow의 백서(white paper)를 기반으로 속살(source code)을 파헤쳐 보고 정리한 자료를 다음과 같이 공유합니다.

잘못된 분석이 있다면 댓글로 남겨주시면 감사드리겠습니다.





아래는 각 슬라이드 별 내용을 간략히 설명한 것입니다. 참고하시기 바랍니다.


TensorFlow의 주요 특징 


  1. Dataflow 형태의 모델을 기반으로 손쉽게 딥러닝 프로그래밍할 수 있도록 제공 
  2. 모델을 다양한 디바이스(CPU, GPU, 원격)에서 효율적으로 분산 처리
전자를 통해 분석할 데이터를 효과적으로 처리(Extract, Transform, Load - ETL)하고 다양한 학습 모델을 활용할 수 있으며 추후 손쉽게 도식화할 수 있도록 초상위 프로그래밍 언어(VHLL)인 python API를 제공하고, 학습된 모델을 안드로이드와 같은 embedded system 에서 수행할 수 있는 C++ API를 제공합니다. 
후자의 경우는 계산 비용(computation cost)이 많이 드는 학습(training) 과정을 가용한 리소스를 효과적으로 활용하여 빠르게 분산처리할수 있습니다. 

TensorFlow의 기본 개념 


 Tensor, Operation, Attribute, Kernel, Device, Variable, Session, Client, Server 등이 있는데 간략히 요약하면 다음과 같습니다.
  • Tensor: 원래 의미는 2차원 이상의 배열이지만 여기에서는 임의의 차원을 가진 배열을 뜻합니다. TensorFlow는 방향성이 있는 그래프 구조로써 모델을 구성하는데 이때 이 그래프는 0개 이상의 입출력을 갖는 노드들의 연결체이며 노드는 operation의 instance 라고 할 수 있습니다.   
  • Operation: 임의의 계산을 수행하는 것으로 다양한 속성 값(attribute)을 가질 수 있습니다.
  • Kernel: 커널은 operation을 디바이스 별로 실제 구현한 것으로 가속화를 위해 다양한 분산 최적화 알고리즘을 활용하고 있습니다. 실제 코드 상에서는 처리되는 곳이 CPU인지, GPU 인지에 따라 다른 구현을 활용하도록 되어 있습니다.
  • Variable: 변수란 학습을 통해 변화하는 배열 값을 저장하기 위한 operation입니다. TensorFlow가 학습할 때 다양한 디바이스에 분산하여 처리하는 구조를 띄기 때문에 명시적으로 type을 지정해 줍니다. 
  • Session: TensorFlow 그래프를 구성한 후 실제 수행을 할 때 다양한 실행 환경(CPU, CPU/GPU, 원격 분산처리) 하에서 처리하기 위해서 Client 에서 session을 만들어 전달하는 개념입니다. 

Sample TensorFlow Code and Graph 



상단 좌측의 예제의 코드처럼 Python으로 구현하면 해당 코드가 상단 우측과 같은 그래프 형태의 구조로 구성되게 됩니다. 그리고 Session을 이용해 하나의 디바이스 혹은 여러 개의 디바이스로 수행됩니다.


Previous Work 



TensorFlow는 google의 대용량 분산 ML 서비스 (구글 이미지 등)에 활용된 바 있는 DistBrief의 개발 경험을 바탕으로 핵심 기술인 Downpour SDG (Stochastic Gradient Descent) 와 Sandbluster L-BFGS 알고리즘을 활용하고 MS 연구소의 Project Adam과 Parameter Server Project를 참고하였습니다.


Feature Comparison 



백서에 따르면 표와 같이 TensorFlow 와 유사 플랫폼의 기능을 비교해 두었으나 시간에 따라 다른 플랫폼들 역시 기능을 추가하고 있는 관계로 최신 비교는 wikipedia를 참고하기 바랍니다.


Execution Mode 



앞서 언급한 바와 같이 TensorFlow의 특장점은 다양한 디바이스에서 수행된다는 점입니다. Single Device (CPU only), Multiple Devices (CPU & GPU), 분산 환경(distributed)에서 자원을 효과적으로 활용하여 수행할 수 있습니다. 이를 위해 operation을 어느 디바이스에 할당할 것인가에 대한 전략부터 디바이스 간 오류 없는 커뮤니케이션을 제공하기 위핸 기능들이 활용되고 있습니다. 특히 분산환경에서는 Multiple Devices의 고려 사항 외에도 오류 발생 시 대응하기 위해 메시지가 손상되었을 때의 복구, worker process의 상태 점검 기능들을 추가 고려하였습니다.



Programming Idioms 



내부적으로 최적의 수행 방안을 찾기 위한 기능들이 구현되어 있지만 사용자가 딥러닝 알고리즘의 특성에 따라 적절한 형태로 분산처리 되도록 코드를 구현할 것을 제안합니다.  예를 들어 학습 모델에 따라 데이터나 모델을 적절히 쪼개 병렬 처리하거나 비동기 함수를 이용해 동시성 처리할 수 있도록 하면 좋습니다.


Source Code Metrics 



github에 공개된 v0.8를 기준으로 코드 사이즈는 약 114 MB 수준이며 대부분 C++과 python으로 구현되어 있습니다. cloc 도구로 분석하면 이외에도 다양한 개발 언어 (bash, HTML, javascript, typescript, object C 등등) 이 등장하는데 process/언어 간 data communication (IPC, RPC)으로 활용하고 있는 Protocol Buffer에 속한 코드입니다.


How It Works 


핵심 코드인 C++과 python은 SWIG 인터페이스를 통해 상호 호출할 수 있도록 구현되어 있습니다. SWIG wrapper은 *.i 파일에 인터페이스 연결 고리를 명시해 두면 compile time에 관련 코드를 생성해 연결합니다. C++과 python 간의 형(type) 과 C++ 인터페이스를 연결하기 위한 코드도 볼 수 있습니다. 추후 설명하겠지만 모델을 통해 학습하는 선언 부(declaration)는 python에서, 실제 수행하는 부분은 C++ 에서 처리하고 있습니다. 


C++ Code Structure   



먼저 기반 프레임워크와 알고리즘이 실제 수행되는 코드를 담고 있는 core 부분은 대부분 C++로 구현되어 있습니다.


C++ Framework 



TensorFlow의 데이터 구조의 기반이 되는 클래스들과 dynamic allocation이 필요한 구성요소에 대해  smart pointer 를 활용한 Reference Counter 를 상속 받아 활용합니다. C++ 코드의 대부분을 차지하는 kernel 코드의 기반 클래스 역시 여기에 구현되어 있습니다. 가장 기본이 되는 Tensor 클래스에서는 배열 연산의 편의를 위한 다양한 메소드가 구현되어 있음을 볼 수 있습니다.


C++ Kernels 


   

이 폴더에는 알고리즘을 CPU/GPU를 통해 고속처리하기 위한 다양한 구현체가 존재하며 CUDA를 활용한 알고리즘은 별도의 {알고리즘 명}_op.cc 파일에 구현하고 있습니다. 고속 알고리즘을 구현하는 개발자들을 위해 이 영역에서만 따로 빌드하고 테스트할 수 있도록 구성되어 있습니다. 자세한 내용은 How To에서 확인할 수 있습니다.


Python Code Structure 



/python 폴더 아래 대부분의 *.py 파일들이 존재하며 operation이 있는 ops/ 와 training/ 에 가장 많은 코드가 존재합니다. 일부 SWIG 을 통해 C++ 간의 연결을 위한 C++ 코드들도 보입니다.


Python Implementation 



Operation에는 tensor 연산을 빠르게 수행할 수 있는 다양한 함수를 제공하고 있으며 Trainings 에는 알려진 다양한 ML 알고리즘과 분산처리를 위한 코드들이 존재합니다. 


Code Summary 



요약하면 python code에는 operation과 training 관련 코드들이 대부분이고 그래프를 만들어 훈련하기 위한 손쉬운 python API들이 제공됩니다.

반면 C++ code에는 기초 프레임워크 코드와 디바이스에서 고속 배열 연산이 가능하도록 구현된 코드들이 있습니다. 또한 임베디드 환경에서 테스트를 수행할 수 있도록 간단한 C++ API를 제공합니다.


 

+ Recent posts