PyTorch와 TensorFlow는 사용 목적이 다르다.
PyTorch는 실험, 연구, 프로토타이핑에 유리해 연구자들이 많이 사용합니다.
TensorFlow는 서비스 배포, 모바일 최적화, 대규모 제품화에 강점을 두고 있어 기업에서 많이 사용합니다.
따라서 사용 목적에 따라 어떤 프레임워크를 사용해야할지 선택하면 됩니다.
디버깅 환경이 다르다.
PyTorch는 Pythonic하고 디버깅과 실험이 직관적입니다.
TensorFlow는 정적 그래프 기반, tf.function, 서빙용 그래프 등 초보자에게는 진입하기 다소 어려운 부분이 있습니다.
class CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(1, 32, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2)
)
self.fc = nn.Linear(32 * 14 * 14, 10)
def forward(self, x):
x = self.conv(x)
x = x.view(x.size(0), -1)
return self.fc(x)
위의 코드는 PyTorch에서 CNN을 구현할 때 사용하는 대표적인 코드입니다.
OOP 기반 nn.Module으로 정의합니다. forward를 직접 정의합니다. Pythonic하고 명시적으로 짜여져있습니다.
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Conv2d(32, 3, padding='same', activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10)
])
위의 코드는 TensorFlow에서 CNN을 구현할 때 사용하는 대표적인 코드입니다.
함수형 API Sequential로 정의합니다. forward를 자동으로 연결해주어 선언을 생략합니다. 추상화가 많아 간결하지만 숨겨진 흐름이 존재합니다.
TF 1.x에 대한 트라우마
"TF 1.x는 최악이었다. 세션 관리, 복잡한 API, 디버깅 지옥. 많은 사람이 이때 PyTorch로 넘어가서 돌아오지 않았다."
PyTorch는 처음부터 Pythonic + 직관적
"PyTorch는 처음부터 그냥 Python처럼 작동했기 때문에 코드 짜기도, 디버깅하기도 편했다."

PyTorch가 선택받는 이유
"그냥 된다. 에러 메세지도 명확하다."
"입출력 shape에 민감하지만 덕분에 수학적 개념이 더 잘 잡힌다."
"논문 코드 대부분 PyTorch를 기본으로 한다. 연구자라면 필수로 사용해야 한다."
"TF는 설치가 너무 까다롭고 하드웨어와 버전 호환성 문제가 잦다."
"Colab에서 잘 돌아가고, Kaggle에서 인기가 많다."
TensorFlow에 대한 불만
"하나의 작업을 여러 방식으로 할 수 있어서 오히려 헷갈린다."
"한동안 업데이트 방향이 너무 급변해서 코드 유지가 불가능했다."
"너무 많은 abstraction layer: Dataset API, Estimator, Functional API 등 뭐가 표준인지 모르겠다."
TensorFlow의 강점
"생산 환경에서 빠른 프로토타이핑과 서빙에는 TF가 더 적합하다."
"tf.keras + gradient tape는 꽤 괜찮아졌고, 초보자도 쉽게 접근 가능하다."
"회사에서는 TF 써도 문제 없지만, 학습용으로는 PyTorch가 낫다."
기타 재미있는 코멘트들
"요즘은 PyTorch가 너무 유행이라 진짜 'cool'들은 JAX 사용함."
"TensorFlow는 구글스러움. 정형화, 거대화, 복잡화"
[용어 정리]
배포(Deployment) : 모델을 학습한 후 추론 가능한 형태로 내보내는 작업 (파일 저장, ONNX, TorchScript)
서빙(Serving) : 내보낸 모델을 API 또는 프로세스 단위로 실행해서 외부 시스템이 사용할 수 있게 만드는 것
TensorFlow는 SavedModel만 만들면
tensorflow_model_server --model_base_path=/models/my_model --rest_api_port=8501
이렇게 한 줄의 명령어로 REST API 또는 gRPC API를 자동으로 구축할 수 있습니다.
버전 관리, 로드 밸런싱, 배포 스케일링 기능도 자동으로 포함되어 있습니다.
반면 PyTorch는 직접 Flask/FastAPI를 구성하거나 TorchServe를 별도로 설치/셋업해야 합니다.
SavedModel은 이러한 구조를 포함하고 있습니다.
계산 그래프, 변수(Weights), 서명 정보(signature_def), 메타데이터 및 서빙용 입력/출력 형태 자동 추출
즉, 배포용 .h5, 추론용 .tflite, TensorFlow.js용 .json등을 자동으로 변환할 수 있습니다.
반면 PyTorch는 .pt, .pnnx로 export는 가능하지만, 추론/서빙 포맷으로의 자동 전환 및 파생 생태계는 비교적 부족합니다.

PyTorch는 ONNX로 연결되긴 하지만 플랫폼 별 툴킷이 산재해 있고 공식화되어 있지 않습니다.
GCP, AWS SageMaker, TFX 등 TensorFlow를 위한 서빙 파이프라인이 완비해 있습니다.
특히 MLOps까지 고려할 때, TensorFlow는 처음부터 서빙 -> 모니터링 -> 재학습까지 단일 파이프파인으로 제공됩니다.
결론
TensorFlow는 크고 강력하며 배포 생태계가 잘 잡혀있지만 무겁고 복잡하다 따라서 기업에서 많이 사용합니다. 반면 PyTorch는 직관적이고 가벼워서 연구자들이 선호합니다.
NumPy는 계산에 최적화된 라이브러리로 잘 알려져있습니다. PyTorch의 Tensor를 배우기 전에 NumPy 라이브러리를 거쳤을 것입니다. 이후 Tensor를 마주할때면 NumPy와 다를 게 없어 보이는데 왜 Tensor로 type이 구분됐을까? 하는 의문이 자연스럽게 들곤 합니다. 초기에 다룰 때는 'PyTorch에서 identity를 유지하기 위해 Tensor를 새로 만들었나보다' 했습니다. 하지만 머지않아 각 데이터 타입의 용도가 다르다는 것을 알게 됐습니다.
가장 중요한 차이는 GPU 지원에 있습니다.
Tensor는 단순한 계산 도구를 넘어 학습 가능한 수학 시스템으로 설계되어 있습니다.
따라서 GPU를 지원하며 기울기 추적이 가능합니다. 또한 연산 그래프(동적 그래프)를 생성하며 Conv, BatchNorm 등 딥러닝용 연산 최적화된 모듈을 내장하고 있습니다.
import torch
x = torch.tensor(3.0, requires_grad=True)
y = x**2 + 2*x + 1
y.backward()
print(x.grad) # 2x + 2 -> 2*3 + 2 = 8.0
# tensor(8.0)
PyTorch는 자동으로 이 함수의 구조를 분석하고 미분합니다.
NumPy에서는 수식을 파싱하지 못해 불가능합니다.
x = torch.tensor(2.0, requires_grad=True)
y = x ** 3
# 1차 미분
grad1 = torch.autograd.grad(y, x, create_graph=True)[0]
# 2차 미분
grad2 = torch.autograd.grad(grad1, x)[0]
print(grad1) # 3x^2 = 12
print(grad2) # 6x = 12
# tensor(12., grad_fn=<MulBackward0>)
# tensor(12.)
딥러닝의 핵심인 Hessian, curvature 계산의 기반이 됩니다.
NumPy는 기본적으로 이런 계산은 직접 구현하지 않으면 불가능합니다.
# x와 y가 주어졌을 때, y = Wx + b를 수동으로 역전파
W = torch.tensor([2.0], requires_grad=True)
b = torch.tensor([1.0], requires_grad=True)
x = torch.tensor([3.0])
y_true = torch.tensor([10.0])
# forward
y_pred = W*x + b
loss = (y_pred - y_true) ** 2
# backward
loss.backward()
print(W.grad) # dL/dW
print(b.grad) # dL/db
# tensor([-18.])
# tensor([-6.])
실제 딥러닝 학습의 핵심 연산을 수식 없이 그대로 실험할 수 있습니다.
이런 실험은 자동 미분 시스템을 시각적으로 체감하게 해줍니다.
결론
비슷해 보이지만 본질적으로 다릅니다. NumPy는 계산기이고 Tensor는 학습기라고 생각하면 됩니다.