Jerry's Log

TensorFlow

contents

1. 개요 (High-Level Overview)

텐서플로우는 머신러닝을 위한 엔드투엔드(End-to-End) 오픈소스 플랫폼으로, 원래 Google Brain 팀이 개발하여 2015년에 출시했습니다. 딥러닝(신경망)으로 유명하지만, 기술적으로는 데이터 흐름 그래프(Data Flow Graphs)를 사용하는 범용 수치 연산 라이브러리입니다.


2. 핵심 개념 ("무엇"인가)

텐서플로우를 이해하려면 텐서(Tensors)그래프(Graphs) 라는 두 가지 구성 요소를 알아야 합니다.

A. 텐서 (Tensors)

텐서는 다차원 배열로, NumPy 배열과 유사하지만 두 가지 중요한 차이점이 있습니다.

  1. 가속기 지원: 텐서는 대규모 병렬 처리를 위해 GPU나 TPU 메모리에 상주할 수 있습니다.
  2. 불변성 (Immutability): 텐서플로우의 텐서는 불변입니다 (제자리에서 업데이트할 수 없으며, 새로운 텐서를 생성해야 함).

텐서의 속성:

B. 계산 그래프 (The Engine)

이 부분에서 TF가 일반적인 프로그래밍과 차별화됩니다.

왜 그래프를 사용하는가?

그래프를 사용하면 텐서플로우가 연산의 정의와 실행을 분리할 수 있습니다. 이를 통해 얻는 이점은 다음과 같습니다:


3. 아키텍처 ("어떻게" 작동하는가)

텐서플로우는 고수준 언어와 저수준 하드웨어를 연결하는 분산 아키텍처를 사용합니다.

  1. 클라이언트 (Frontend):
    • 코드를 작성하는 곳입니다 (주로 Python, 때로는 C++, Java, Go).
    • 데이터 흐름 그래프를 정의합니다.
  2. 분산 마스터 (Distributed Master):
    • 그래프를 정리(pruning)하여 사용하지 않는 부분을 제거합니다.
    • 그래프를 하위 그래프로 분할합니다 (예: "이 부분은 GPU 1에서, 이 부분은 CPU에서 실행").
  3. 워커 서비스 (Worker Services):
    • 할당된 하드웨어에서 연산(Ops)에 대한 특정 커널 구현을 실행합니다.
  4. 커널 (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. 학습 및 모델링

B. 프로덕션 및 MLOps (TFX)

C. 배포 대상

D. 시각화


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 분야에서 가장 큰 논쟁거리입니다.


8. 요약: 장점과 단점

장점

단점

references