TensorFlow
contents
1. 개요 (High-Level Overview)
텐서플로우는 머신러닝을 위한 엔드투엔드(End-to-End) 오픈소스 플랫폼으로, 원래 Google Brain 팀이 개발하여 2015년에 출시했습니다. 딥러닝(신경망)으로 유명하지만, 기술적으로는 데이터 흐름 그래프(Data Flow Graphs)를 사용하는 범용 수치 연산 라이브러리입니다.
- 이름의 유래: 신경망의 작동 방식에서 따왔습니다. 다차원 데이터 배열(이를 텐서, Tensor라고 함)을 받아 연산 그래프(이를 플로우, Flow라고 함)를 통과시킵니다.
- 주요 언어: 파이썬(Python)이 프론트엔드 역할을 하지만, 핵심 실행 엔진은 고도로 최적화된 C++ 로 작성되었습니다.
- 라이선스: Apache 2.0 (오픈소스).
2. 핵심 개념 ("무엇"인가)
텐서플로우를 이해하려면 텐서(Tensors) 와 그래프(Graphs) 라는 두 가지 구성 요소를 알아야 합니다.
A. 텐서 (Tensors)
텐서는 다차원 배열로, NumPy 배열과 유사하지만 두 가지 중요한 차이점이 있습니다.
- 가속기 지원: 텐서는 대규모 병렬 처리를 위해 GPU나 TPU 메모리에 상주할 수 있습니다.
- 불변성 (Immutability): 텐서플로우의 텐서는 불변입니다 (제자리에서 업데이트할 수 없으며, 새로운 텐서를 생성해야 함).
텐서의 속성:
- 랭크 (Rank): 차원의 수 (예: Rank 0은 스칼라, Rank 1은 벡터, Rank 3은 RGB 채널이 있는 이미지).
- 쉐이프 (Shape): 각 차원의 요소 수 (예:
[28, 28, 3]). - 데이터 타입 (Dtype):
float32,int64,string등.
B. 계산 그래프 (The Engine)
이 부분에서 TF가 일반적인 프로그래밍과 차별화됩니다.
- 노드 (Nodes): 수학적 연산(더하기, 행렬 곱, ReLU 등)을 나타냅니다.
- 엣지 (Edges): 연산 사이를 흐르는 텐서(데이터)를 나타냅니다.
왜 그래프를 사용하는가?
그래프를 사용하면 텐서플로우가 연산의 정의와 실행을 분리할 수 있습니다. 이를 통해 얻는 이점은 다음과 같습니다:
- 이식성: 파이썬 없이도 안드로이드(모바일)나 C++ 서버에서 그래프를 내보내 실행할 수 있습니다.
- 최적화: 컴파일러가 노드를 병합(두 개의 수학 연산을 하나로 결합)하여 속도를 높일 수 있습니다.
3. 아키텍처 ("어떻게" 작동하는가)
텐서플로우는 고수준 언어와 저수준 하드웨어를 연결하는 분산 아키텍처를 사용합니다.
- 클라이언트 (Frontend):
- 코드를 작성하는 곳입니다 (주로 Python, 때로는 C++, Java, Go).
- 데이터 흐름 그래프를 정의합니다.
- 분산 마스터 (Distributed Master):
- 그래프를 정리(pruning)하여 사용하지 않는 부분을 제거합니다.
- 그래프를 하위 그래프로 분할합니다 (예: "이 부분은 GPU 1에서, 이 부분은 CPU에서 실행").
- 워커 서비스 (Worker Services):
- 할당된 하드웨어에서 연산(Ops)에 대한 특정 커널 구현을 실행합니다.
- 커널 (Kernels):
- C++ 또는 CUDA(NVIDIA GPU용)로 작성된 수학 연산(행렬 곱셈 등)의 저수준 구현체입니다.
핵심 구성 요소: XLA (가속 선형 대수)
XLA는 텐서플로우의 도메인 특화 컴파일러입니다. 실행 전에 그래프를 분석하고 최적화합니다. 예를 들어, 그래프에 Output = A + B + C가 있는 경우, XLA는 메모리에 세 번 쓰는 대신 이를 하나의 커널 실행으로 융합(fuse)하여 GPU/TPU에서의 실행 속도를 크게 높입니다.
4. 진화: TF 1.x vs. TF 2.x
이는 텐서플로우 역사에서 가장 중요한 구분점입니다.
| 기능 | TensorFlow 1.x ("구" 방식) | TensorFlow 2.x ("신" 방식) |
|---|---|---|
| 실행 방식 | 그래프 모드: 그래프의 "청사진"을 먼저 정의한 다음, tf.Session()을 생성하여 실행해야 했습니다. |
즉시 실행 (Eager Execution): 일반 파이썬처럼 연산이 즉시 실행됩니다. 결과를 바로 출력(print)해 볼 수 있습니다. |
| API | tf.layers, tf.contrib 등으로 파편화되어 있었습니다. |
Keras: tf.keras가 중앙 공식 고수준 API가 되었습니다. |
| 디버깅 | 매우 어려움 (에러가 파이썬 라인이 아닌 C++ 런타임에서 발생). | 쉬움 (표준 파이썬 디버거인 pdb 등 사용 가능). |
| 철학 | 선언형 (정의 후 실행). | 명령형 (실행하며 정의). |
2.x의 성능 관련 참고:
TF 2.x는 디버깅을 위해 "즉시(Eagerly)" 실행되지만(다소 느림), @tf.function 데코레이터를 사용하여 파이썬 함수를 다시 고성능 그래프로 컴파일하여 프로덕션 환경에 사용합니다.
5. 생태계 ("모든 것")
텐서플로우는 단순한 라이브러리가 아니라 거대한 도구 모음(Suite)입니다.
A. 학습 및 모델링
- Keras (
tf.keras): 모델 구축을 위한 고수준 API입니다. 사용자 친화적이고 모듈화되어 있습니다. - TensorFlow Hub: 미리 학습된 모델(예: BERT, ResNet) 라이브러리로, 코드 몇 줄로 다운로드하여 미세 조정(fine-tuning)할 수 있습니다.
B. 프로덕션 및 MLOps (TFX)
- TensorFlow Serving: 프로덕션 환경을 위해 설계된 고성능 머신러닝 모델 서빙 시스템입니다. 모델에 대한 API 요청을 처리합니다.
- TFX (TensorFlow Extended): 프로덕션 ML 파이프라인(데이터 검증 -> 변환 -> 학습 -> 배포)을 구축하기 위한 엔드투엔드 플랫폼입니다.
C. 배포 대상
- TensorFlow Lite: 모바일 및 엣지 기기(Android, iOS, Raspberry Pi)를 위한 경량 버전입니다. 모델을 압축된 포맷(
.tflite)으로 변환합니다. - TensorFlow.js: 브라우저나 Node.js에서 ML을 실행하기 위한 라이브러리입니다. 가속을 위해 WebGL을 사용합니다.
D. 시각화
- TensorBoard: 학습 로그를 시각화하는 웹 기반 도구입니다. 손실 곡선(loss curves)을 확인하고, 모델 그래프를 시각화하며, 고차원 임베딩을 투영해 볼 수 있습니다.
6. 코드 예제 (TensorFlow 2.x)
현대적인 텐서플로우 스크립트의 모습입니다. 손글씨 숫자(MNIST)를 인식하는 신경망을 구축하는 코드입니다.
import tensorflow as tf
# 1. 데이터 로드 및 준비
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # 0-1 범위로 정규화
# 2. 모델 구축 (Keras Sequential API 사용)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)), # 2D 이미지를 1D 벡터로 펼침
tf.keras.layers.Dense(128, activation='relu'), # 은닉층 (Hidden layer)
tf.keras.layers.Dropout(0.2), # 과적합 방지를 위한 정규화(Regularization)
tf.keras.layers.Dense(10) # 출력층 (10개 숫자)
])
# 3. 손실 함수(Loss Function) 및 옵티마이저(Optimizer) 정의
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(optimizer='adam',
loss=loss_fn,
metrics=['accuracy'])
# 4. 모델 학습
model.fit(x_train, y_train, epochs=5)
# 5. 평가
model.evaluate(x_test, y_test, verbose=2)
7. TensorFlow vs. PyTorch
오늘날 AI 분야에서 가장 큰 논쟁거리입니다.
- PyTorch (Meta/Facebook):
- 스타일: 동적 계산 그래프 (실행 시 정의). 매우 "파이썬다운(Pythonic)" 느낌입니다.
- 지배력: 연구(Research) 커뮤니티를 지배합니다. 주요 컨퍼런스 논문의 80% 이상이 PyTorch를 사용합니다.
- 디버깅: 파이썬 흐름과 자연스럽게 통합되므로 디버깅이 더 쉽습니다.
- TensorFlow (Google):
- 스타일: 정적 그래프(과거), 현재는 기본적으로 즉시 실행(Eager) 모드입니다.
- 지배력: 산업/프로덕션(Industry) 분야를 지배합니다. 배포 도구(TFX, Serving, Lite)가 훨씬 우수합니다.
- TPU 지원: 텐서플로우는 여전히 구글 클라우드 TPU(Tensor Processing Units)와 더 나은/성숙한 네이티브 통합을 제공합니다.
8. 요약: 장점과 단점
장점
- 프로덕션 준비 완료: TFX 파이프라인은 대규모 기업 배포에 타의 추종을 불허합니다.
- 생태계: 도구의 수(Lite, JS, Hub, Coral 등)가 방대합니다.
- 확장성: 수천 개의 GPU/TPU에 걸친 학습을 위한 분산 전략이 뛰어납니다.
단점
- 학습 곡선: API가 일관성이 없을 수 있습니다 (레거시 1.x 코드와 2.x 코드의 혼재).
- 연구 지체: 최신 "최첨단(SOTA)" 논문들은 보통 PyTorch로 먼저 공개됩니다.
- 장황함: 사용자 정의 학습 루프를 작성할 때 PyTorch보다 코드가 더 길어질 수 있습니다.
references