Search
🌍

deer.8.1_2. title: TensorFlow 의 XLA 개념, tf.function 의 관계

🚀 prev note
♻️ prev note
🚀 next note
♻️ next note
17 more properties
TensorFlow 는 모든 연산에 대해서 미리 계산 방식들을 구현해 두었다. 덧셈, 곱셈, 나눗셈과 같이 자주 사용될 것 같은 연산들이 당연히 이에 속할 것이다 (참고2). TensorFlow binary 를 나의 컴퓨터에 설치하면 이미 나의 MAC OS 라는 플랫폼에 맞게 컴파일된 실행 파일이 다운로드되는 것일테고, 소스코드로 설치하면 C 형태로 존재하던 소스코드가 Bazel 에 의해 나의 컴퓨터 플랫폼에 맞게 컴파일되어 사용될 것이다 (참고1). 하지만 XLA 는 기존에 미리 정의되어 있는 컴파일된 단위 덩어리의 계산 방식 대신 완전히 새로운 하나의 덩어리를 정의한다. 정의된 연산의 부연산들 사이에 메모리 병목을 (op dispatch overhead) 없애고 연산을 최적화시키는 등 새로운 연산으로 여겨 이들을 최적화시킬 수 있다 (참고3,4,9). 심지어 XLA 는 TensorFlow 의 이기종디바이스 지원 철학에 맞게 (참고8) 런타임 플랫폼이 CPU 인지, GPU 인지, TPU 인지를 모두 고려할 수 있도록 설계되어 있다 (참고7). TensorFlow2 의 경우에는 tf.function 데코레이터가 존재한다. 이것은 내부를 XLA 라는 JIT 컴파일러로 최적화시키는데 (참고6,7), 이 내용을 통해 왜 작은 연산이 많은 함수 최적화가 거대한 연산 한두개의 최적화보다 더 높은 효과를 만드는지 (참고5) 이해할 수 있게 된다.
예를 들어 x+y*z 을 연산해야 한다고 생각해 보자. 결과를 만들기 위해서는 y*z 가 먼저 계산되어야 한다. 먼저 계산되어야 한다는 말은, y*z 가 x 와 더해지기 위해 계속 메모리에 올려두고 잃어버리면 안 되는 값이 된다는 것이다. XLA 는 이런 부분을 한방에 계산되도록 만들어줄 수 있다. a^5 같은 연산을, (a*a)*a ... 같이 차례차례 하는 것이 아니라 a*a*a*a*a 로 펼쳐내는 연산같은 것도 예로 들어볼 수 있다. 1/b(b+3) 을 계산하기 위해 b+3 을 먼저 계산하지 않고 컴파일러단에서 1+3/b 를 계산하도록 최적화시키는 예 또한 들어볼수도 있겠다.
참고