한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
TensorFlow용 컴파일러인 XLA를 소개합니다.
2017년 3월 27일 월요일
<블로그 원문은
여기
에서 확인하실 수 있으며, 블로그 번역 리뷰는 Justin Hong(Google)님이 참여해 주셨습니다.>
게시자: Google XLA 팀(TensorFlow 팀 공동 게시)
TensorFlow의 디자인 목표와 핵심 강점 중 하나는 바로 유연성입니다. TensorFlow는 임의 데이터 흐름 그래프를 정의하고 이를 이기종 컴퓨팅 기기(예: CPU 및 GPU)를 사용하여 분산된 방식으로 효율적으로 실행하기 위해 유연성과 확장성이 뛰어난 시스템으로 설계되었습니다.
하지만 유연성은 종종 성능과 양립하기 어렵습니다. TensorFlow는 모든 종류의 데이터 흐름 그래프를 정의할 수 있도록 지원하는 것을 목표로 하는 반면, TensorFlow가 각각의 연산을 개별적으로 최적화하기 때문에 모든 그래프를 효율적으로 실행하기란 어려운 일입니다. 효율적으로 구현된 연산이 존재하거나 각 연산이 상대적으로 무겁게 실행되는 연산의 경우라면 그래도 괜찮습니다. 그렇지 않은 경우 사용자는 여전히 더 낮은 수준의 연산들을 사용해서 연산을 합성해야 하는데, 이러한 합성의 경우 가장 효율적인 방식으로 실행된다는 보장이 없습니다.
이것이 바로 Google에서 TensorFlow용 컴파일러인
XLA
(Accelerated Linear Algebra)를 개발한 이유입니다. XLA는 CPU, GPU 및 맞춤형 액셀러레이터(예: Google의 TPU)와 같은 기기에 대해 JIT 컴파일 기법을 사용하여 런타임에 사용자가 생성한 TensorFlow 그래프를 분석하고 실제 런타임 차원과 유형에 맞게 최적화하며, 여러 연산을 함께 합성하고 이에 대한 효율적인 네이티브 기계어 코드를 내보냅니다.
성능 향상을 위해 합성 가능한 연산의 합성
예를 들어
tf.nn.softmax
연산을 살펴보겠습니다. 이 연산에서는 다음과 같이 softmax 매개변수 활성화를 계산합니다.
Softmax는 원시 TensorFlow 연산(지수, 감소, 요소별 나누기 등)의 합성으로 구현될 수 있습니다.
softmax = exp(logits) / reduce_sum(exp(logits), dim)
이는 연산 외부에서는 필요하지 않은 일시적인 결과의 산출과 추가 데이터 이동으로 인해 느려질 가능성이 있습니다. 게다가, GPU와 같은 코프로세서에서 이러한 분해를 구현하면 여러 차례 “커널 실행”을 일으킬 수 있고 이에 따라 연산 속도가 훨씬 더 느려집니다.
XLA는 TensorFlow가 원시 연산들의 조합을 자동으로 최적화하는데 도움을 주는 컴파일러 기술입니다. XLA로 강화된 TensorFlow는 런타임에 그래프를 분석하고 연산들을 적절히 합성하고 합성된 하위 그래프에 대한 효율적인 기계어 코드를 생성함으로써 런타임 성능 저하 없이 뛰어난 유연성을 유지합니다.
예를 들어, 위에 표시된 것처럼 softmax의 분해 구현은 수동으로 최적화한 복합 연산만큼 빨라지도록 XLA로 최적화됩니다.
나아가, XLA가 TensorFlow 연산의 전체 하위 그래프를 대상으로 효율적인 루프 형태로 합성함으로써 필요한 커널 실행수를 최소화할 수 있습니다. 예를 들면 다음과 같습니다.
이 그래프에서 많은 연산을 단일 요소별 루프로 합성할 수 있습니다. 예를 들어, biases의 단일 요소를 matmul 결과의 단일 요소에 더하는 경우를 살펴보겠습니다. 이 덧셈의 결과는 0(ReLU의 경우)과 비교 가능한 단일 요소입니다. 비교 결과는 거듭제곱된 후 모든 입력 값의 지수 합으로 나누어질 수 있고, 그 결과, softmax의 출력 값이 생성됩니다. 메모리에 matmul, 더하기 및 ReLU에 대한 중간 배열을 생성할 필요가 없습니다.
s[j] = softmax[j](ReLU(bias[j] + matmul_result[j]))
합성된 구현에서는 불필요한 메모리를 할당하지 않고 단일 요소별 루프 내에서 최종 결과를 계산할 수 있습니다. 더욱 복잡한 시나리오에서 이러한 연산은 행렬 곱셈으로 합성될 수도 있습니다.
XLA는 TensorFlow가 성능 저하 문제를 해결하는 동시에 뛰어난 유연성을 유지하는 데 도움이 됩니다.
내부 벤치마크에서 XLA를 사용하는 경우 Nvidia GPU에서 XLA를 사용하지 않는 TensorFlow에 비해 속도가 최대 50% 향상되는 것으로 나타났습니다. 예상한 대로 효율성이 뛰어난 루프로 합성될 수 있는 요소별 연산으로 구성된 긴 시퀀스를 포함하는 모델에서 속도가 가장 크게 개선되었습니다. 하지만 XLA는 여전히 시험용인 것으로 간주해야 하며, 몇몇 벤치마크에서는 속도가 감소할 수도 있습니다.
TensorFlow Developer Summit에서 있었던 이 토론회에서 Chris Leary 씨와 Todd Wang 씨는 TensorFlow가 어떻게 XLA, JIT, AOT 및 기타 컴파일 기법을 활용하여 실행 시간을 최소화하고 컴퓨팅 리소스를 극대화할 수 있는지에 대해 설명했습니다.
극한의 특수화를 통해 실행 파일 크기 감소 실현
성능 향상 외에, TensorFlow 모델은 실행 파일 크기가 줄어든 덕분에 메모리가 한정된 환경(예: 휴대기기)에서 XLA의 이점을 누릴 수 있습니다.
tfcompile
은 AOT(Ahead-Of-Time) 컴파일에 XLA를 활용하는 도구입니다. 전체 그래프가 XLA로 컴파일된 다음에 그래프에서 연산을 구현하는 세밀한 기계어 코드를 내보냅니다. 이 방식은 최소의 런타임과 결합되어 상당한 크기 감소 효과를 냅니다.
예를 들어, android-arm에 깊이 3, 폭 60으로 적층된 LSTM 모델이 있다고 가정할 경우 원래 TF 모델 크기는 2.6MB(런타임 1MB + 그래프 1.6MB)입니다. 그런데 XLA로 컴파일하면 크기가 600KB로 줄어듭니다.
해상도가 더 높은 이미지를 보려면 여기를 클릭하세요.
이 크기 감소는 정적 컴파일에 기인한 모델의 최적화에 의해 얻어집니다. 모델 실행 시, TensorFlow 런타임의 성능과 유연성을 전부 활용할 필요는 없습니다. 사용자가 관심을 가지는 실제 그래프를 구현하는 연산만 네이티브 코드로 컴파일됩니다. 그렇긴 하지만, XLA의 CPU 백엔드에서 내보내지는 코드의 성능은 최적의 상태와는 거리가 멀기 때문에 이 부분은 작업이 더 필요합니다.
대체 백엔드 및 기기 지원
오늘날 새로운 종류의 컴퓨팅 기기에서 TensorFlow 그래프를 실행하려면 새로운 기기에 대해 모든 TensorFlow 연산(커널)을 다시 구현해야 합니다. 기기에 따라서는 무척 많은 양의 작업이 될 수도 있습니다.
XLA는 설계상 맞춤형 백엔드를 추가하여 새로운 기기를 훨씬 더 쉽게 지원할 수 있도록 되어 있습니다. TensorFlow는 XLA를 대상으로 지정할 수 있으므로, 새로운 기기 백엔드를 XLA에 추가하면 이에 따라 새로운 기기가 TensorFlow 그래프를 실행하도록 할 수 있습니다.
XLA 연산
은 원시 연산이므로(XLA는 자체적으로 복합 연산 분해를 처리함) XLA는 새로운 기기를 지원해야 할때 훨씬 더 작은 구현만을 필요로 합니다.
이 페이지
에 XLA에 맞춤형 백엔드를 추가하는 프로세스에 대해 설명해두었습니다. Google도 이 매커니즘을 사용하여 XLA에서
TPU
를 지원하고 있습니다.
결론 및 향후 전망
XLA는 여전히 개발 초기 단계에 있습니다. 일부 사용 사례에서 매우 좋은 결과를 보이고 있으므로, 미래에는 분명히 TensorFlow에 이 기술이 훨씬 더 많이 활용될 수 있을 것입니다. 저희는
XLA를 TensorFlow Github
에
릴리즈함으로써 커뮤니티를 통해 성장하기를 기대하며 이것이 TensorFlow 런타임과 모델들을 새로운 하드웨어에서 보다 쉽게 이식하고 최적화하는데 도움이 되기를 바랍니다.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed