3. TensorFlow LOC
Module LOC 비 고
core 211,610 C++ 로 작성된 TensorFlow 코어 코드
stream_executor 28,056 GPU CUDA 관련 코드
python 103,113 Python 환경 지원을 위한 파이썬 코드
etc 68,368 contrib, models, tensorbard, tools, user_ops
total 411,147
commit : 005386dc198220601293d4821e6de63246527b0c
4. 내 용
• 하고자 하는 것
• 코드 레벨에서의 TensorFlow 동작 방식을 살펴보려고 합니다.
• 하지 않는 것
• 딥러닝 이론 자체를 다루지 않습니다.
• TensorFlow 사용법을 다루지 않습니다.
8. TensorFlow Language
• Python
• 그래프 구성은 Python API 를 이용하여 작성할 것을 권장합니다.
• 이 외에도 TensorFlow 를 손쉽게 사용하기 위한 기능들을 제공합니다.
• C++
• 성능을 요구하는 실제 연산 작업은 모두 C++ 환경으로 작성됩니다.
9. Python API 로 하는 일
• 그래프를 작성합니다. • Session 을 관리합니다.
10. 그래프 작성
• Python 구문을 이용하여 연산에 사용할 그래프를 구성합니다.
• 함수가 호출되는 즉시 내부 연산이 수행되는 것은 아닙니다.
• 오로지 연산 그래프가 작성되는 과정을 거치게 됩니다.
11. Session의 역할
• Session은 TensorFlow 그래프 연산을 수행하기 위한 사용자 인터페이스 입니다.
• Graph를 생성하고 Operation을 수행하며 Tensor를 평가(eval)합니다. (C++ Session)
• tf.Session 은 반드시 한 개의 tf.Graph 객체를 포함합니다.
• 특정 tf.Graph 를 명시하지 않은 경우 default graph 가 사용됩니다.
13. Google Protocol buffer
• 앞서 본 내용에서는 tf.Graph 정보를 C++로 넘기는 부분이 없습니다.
• tf.Graph 또한 Python 객체이므로 바로 C++ 전달은 불가능합니다.
• tf.Graph 를 Protocol Buffer 타입의 자료형으로 변환한 뒤 전달하게 됩니다.
• 그래프 구성 자체를 기술한 정보가 Serialize된 데이터라고 생각하시면 쉽습니다.
14. Overview (in C++)
Session 그래프 연산 작업 관리
Device 디바이스 정보를 담고 있는 객체
Graph 연산(op)과 값(tensor)을 그래프 구조로 저장
Executor 그래프 연산을 실제로 수행
OpKernel 그래프 노드에 지정된 연산 (Functor)
15. Session
• 사용자가 요청한그래프 연산을
실제로 수행하는 객체입니다.
• 현재 2가지 Session이 제공됩니다.
• 로컬 환경 : DirectSession
• 분산 환경 : GrpcSession
• 먼저 로컬 환경부터 살펴봅시다.
Di r ect Sessi on
Sessi on
Gr pcSessi on
Di r ect Sessi on
Fact or y
Gr pcSessi onFact or y
Fact or y
new( ) new( )
Sessi onFact or y
17. Session : 그래프 생성
• Session::Run() 호출시 가장 먼저 GraphDef 를 Graph 객체로 변환합니다.
18. Rewrite Graph
sess.Run([“relu”], {image:xs})
fetch feed
그런데 Run() 실행시마다 이런 많은 작업을 반복한다고요 ???
i mage
hddn
w1
ReLU
w2
scor e pr ob l oss
l abel
f eed
f et ch
i mage
hddn
w1
ReLU
w2
scor e pr ob l oss
l abel
19. Rewrite Graph (cont’d)
Sessi on
“ xs, ys- >l oss: st ep/ ”
“ i ni t ” gr aphexecut or
gr aphexecut or gr aphexecut or
20. Node에 device 설정하기
• 그런데 TensorFlow 는 GPU 환경에서 돌려볼 수 있나요?
• 많은 딥러닝 라이브러리에서 Process 단위 CPU/GPU 모드를 제공합니다.
• 하지만 TensorFlow 에서는 Node 단위로 Device를 선택할 수 있습니다.
• Node 단위 실행을 위해 Graph 객체는 분할될 수 있습니다.
21. Node에 device 설정하기 (Cont’d)
• 사용자가 명시적으로 코드 상에서 device를 지정할 수 있습니다.
• 이런 구문을 사용하면 해당 Node에 device 정보가 기록됩니다.
• Node에 device 정보가 없는 경우 TensorFlow가 알아서 device를 지정합니다.
22. Device 할당 제약 사항
• Node에 device를 지정할 때의 제약 사항입니다.
1. 사용자가 코드 상에 명시적으로 device 를 기술한 경우
• 반드시 해당 device 로 노드를 할당해야 합니다.
2. 어떤 노드가 다른 노드의 참조 타입으로 생성된 경우
• 이 경우 두 노드는 동일한 device 로 할당해야 합니다.
3. A와 B노드가 주어지고 B노드에 @A와 같은 colocation이 사용된 경우
• 이 경우도 A와 B 노드는 동일한 device 로 할당되어야 합니다.
23. SimplePlacer
Di r ect Sessi on
Gr aphSi mpl ePl acer
Devi ceSet
devi ce_set
devi ces
Devi ce
devi ces
Devi ceMgr
LookupDevi ce( )
Li st Devi ces( )
devi ces devi ce_mgr
24. SimplePlacer (Cont’d)
• 이름대로 간단한 방식으로 작업합니다.
• TensorFow White Paper 에 따르면,
• 노드 할당시 Cost 기반 할당을 수행한다고 되어 있습니다.
• 하지만 현실은 ?
• 일단 device를 할당할 노드는 부모 노드의 device 정보를 얻어 자신의 device 정보로 사용합니다.
• 이 때 부모 노드의 device가 지정되어 있지 않은 경우, 사전 고려된 순서에 따라 할당됩니다.
• 따라서 GPU 장비가 설치되어 있는 장비의 경우 대개 GPU:0 이 할당됩니다.
• 즉, 할당 정책은 형편없다는 뜻입니다. (이후에 더 좋은 Placer 가 나올거라 생각합니다.)
GPU: 0 GPU: 1
CPU: 0
i mage
hddn
w1
ReLU
w2
scor e
pr ob
l oss
l abel
25. Graph partitioning
• Device 단위로 파티셔닝을 수행합니다.
• 그래프 분할을 완료하기 위해서는 추가 작업이 필요합니다.
• 접점이 되는 노드에 recv, send 노드를 추가하여 그래프 분할을 완성합니다.
• 이 때 서브그래프에서 recv가 여러 노드에서 사용된다면 하나로 치환합니다.
GPU: 0 GPU: 1
CPU: 0
i mage
hddn
w1
ReLU
w2
scor e
pr ob
l oss
l abel
send
r ecv send r ecv
send
r ecv
27. Executor
• Executor는 서브-그래프 하나마다 생성됩니다.
• Executor는 개별적인 Thread 작업으로 구성됩니다.
• Executor는 서브-그래프의 시작 노드를 찾아 그래프 연산을 수행합니다.
• 모든 Executor의 작업이 끝날 때까지 ExecutorBarrier가 막아줍니다.
• Executor가 하는 일은 좀 더 복잡하지만 이 정도만 알고 넘어갑시다.
28. 랑데뷰 (Rendezvous)
• 서브-그래프 사이의 send와 recv 노드 데이터를 동기화하는 객체입니다.
• 각 Executor 들은 자신의 서브 그래프 내의 send와 recv 객체를 Rendezvous 객체에 등록합니다.
• Send()
• send 노드에 속한 Tensor 데이터를 다른 그래프로 보내줄 때 사용합니다.
• Send() 호출시 이미 다른 Executor 가 해당 노드의 데이터를 요구한 사실이 있다면 바로 데이터를 전달합니다.
• RecvAsync()
• recv 노드에 속한 Tensor 데이터를 다른 그래프로부터 얻어올 때 사용합니다.
• RecvAsync() 호출시 이미 다른 Executor 가 해당 노드를 등록해 놓았다면 바로 데이터를 얻어옵니다.
I nt r aPr ocess
Rendezvous
Send( )
RecvAsync( )
l ocal
Local RendezvousI mpl Rendezvous
Send( )
RecvAsync( )
30. Device 사이의 데이터 전달
• 앞서 살펴보았지만 각각의 그래프는 device 단위로 나누어집니다.
• 그래프가 서로 주고 받는 데이터는 send와 recv 노드에 속한 Tensor 타입의 자료구조입니다.
• 여기서 Tensor란 차원(dimension) 정보를 가진 메모리 데이터 블록입니다.
• 서로 다른 device 사이의 데이터 복사는 어떻게 해야 할까요?
• Device 라는 객체에는 자신의 Device 타입과 메모리 할당용 Allocator를 가지고 있습니다.
• InterProcessRendezvous 객체에서 Device 타입을 조회하여 적절한 Copy 함수를 호출해 줍니다.
CPU GPUCPU CPU GPUGPU
31. 서브 그래프의 실행
• Executor가 Graph를 실행한다고 했는데 도대체 뭘 실행시키는 걸까요?
• 사실 하나의 노드는 하나의 Operation을 의미하게 됩니다.
• 그리고 이 Operation에는 적절한 연산들이 정의되어 있습니다.
• 입출력 데이터는 Operation에 설정된 Tensor 를 사용합니다.
• 동일한 연산이라도 Device 에 따라 구현이 달라질 수 있습니다.
• 예로 CPU 와 GPU 환경에서 add 연산의 구현은 다릅니다.
32. Operation
• 노드에 설정된 실제 실행해야 할 작업입니다.
• 사용자가 직접 Operation 을 추가할수도 있습니다. (TensorFlow Tutorial 참고)
• 상황에 따라 Device 별 Operation을 작성해야 하는게 일반적입니다.
• 그리고 특정한 Device 에서만 동작하는 Operation 을 Kernel 이라고 합니다.
• Op는 Math 연산을 위한 Op와 Control Flow를 위한 Op로 나눌 수 있습니다. (사실은 더 있어요.)
• 이 중 Math연산을 위한 기능은 TensorFlow도 다른 라이브러리를 활용합니다.
• CPU : 선형대수 라이브러리인 Eigen을 사용합니다.
• GPU : Cuda 라이브러리 (Cublas/CuDNN/CuFFT 혹은 Cuda Kernel)나 Eigen 을 사용합니다.
34. TensorFlow 분산 버전
• 2016년 3월에 TensorFlow 분산 버전 초안이 공개되었습니다.
• gRPC를 이용한 분산 버전입니다.
• 아직 초기 버전이라 변경 사항이 아주 많습니다.
• 여기서는 아주 개략적인 개념만을 살펴보도록 하겠습니다.
35. gRPC
• 구글이 만든 RPC 프로토콜입니다. (http://www.grpc.io/)
• 기존 RPC 방식과는 약간 다릅니다.
• 입출력 자료형으로 protocol buffer 데이터 타입을 받습니다.
• 함수 선언을 protocol buffer message 로 정의합니다.
• 실제 네트워크 프로토콜은 SPDY (HTTP2.0)를 사용합니다.
37. GrpcServer
• GrpcServer는 그래프 연산 Process 시작 전에 이미 각 장비에서 구동되어 있어야 합니다.
• Binary 명령어로 실행할수도 있고, python 코드로도 구동 가능합니다. (Binary 는 숨겨져 있어요.)
Mast er
ser vi ce
Mast er St ubRPC Wor ker St ub RPC
Wor ker
ser vi ce
Gr pcSer ver
Local Devi ce I nf o
38. Distributed Computation Graph
• Client : Master로 GraphDef 객체를 전송합니다.
• Master : Graph 객체를 구성하고 분할하여 Worker에게 전달합니다.
• Worker : 로컬 머신에서 처리한 것과 동일하게 Graph 를 연산합니다.
Cl i ent
Gr pcRemot eMast er
st ub
Mast er 0
Gr pcMast er Ser vi ce
st ubRPC
Gr aphDef
Mast er Sessi on
gr pc_sessi on Wor ker 0
Gr pcRemot eWor ker
st ub
Gr pcWor ker Ser vi ce
st ub
Wor ker 1
Gr pcWor ker Ser vi ce
st ub
RPC
RPC
Gr aphDef
Gr aphDef
Gr aphDef
39. Cluster example
ember
Gr pcSer ver
ember 0: : 2222
/ j ob: ember / t ask0
pol y
Gr pcSer ver
pol y0: 2222
/ j ob: pol y/ t ask0
ember cpu: 0
gpu: 0
gt x980
gpu: 1
gt x980
pol y cpu: 0
gpu: 0
t i t an x
gpu: 1
t i t an x
41. 그래프 전달
[마스터 서버]
1. SimplePlacer로 각 노드에 디바이스 할당
2. Task 서버 단위 파티셔닝 (recv, send 없음)
3. 생성된 GraphDef 를 각 task 서버에 전달
[워커 서버]
1. Task 서버에서는 각 그래프 개별 실행
2. 결과 반환