Q1. 딥러닝 프레임워크인 PyTorch와 TensorFlow를 비교해보세요.
A1. PyTorch는 페이스북에서 TensorFlow는 구글에서 만들었다. PyTorch는 "코드를 짜면서 바로바로 실행하는 방식(동적 그래프)"이기에, 직관적이고 디버깅에 유리하다는 장점이 있다. 하지만 대규모 서비스에는 다소 부족할 수 있다. TensorFlow는 "코드를 한꺼번에 설계한 뒤 실행하는 방식(정적 그래프)"이기에, 최적화나 속도 면에서 유리하다는 장점이 있다. 하지만 디버깅이 어렵다.
Q2. PyTorch에서 텐서란 무엇이고, NumPy의 Array(배열)과 어떤 차이가 있나요?
A2. Tensor 와 Array 모두 숫자 데이터를 담는 그릇이다. Tensor는 GPU 가속과 자동 미분이 가능해 대규모 데이터를 다루는 딥러닝에 효율적이다. Array는 다양한 연산 함수와 라이브러리 호환성이 뛰어나 선형대수 및 통계에 효율적이다. 딥러닝 학습에는 GPU를 통한 병렬연산이 필수적이기 때문에 Tensor를 사용해야 한다.
| 항목 | PyTorch | TensorFlow |
|---|---|---|
| 출시 연도 | 2016년 (Facebook AI) | 2015년 (Google Brain) |
| 코드 스타일 | Pythonic, 직관적인 동적 그래프 (Eager Execution) | 복잡하지만 최적화된 정적 그래프 (Graph Execution) |
| 디버깅 | 쉬움 (Python처럼 직접 실행되므로) | 상대적으로 어려움 (그래프 기반 실행 구조) |
| 사용자 | 연구자/개발자 중심, 빠르게 성장 중 | 산업계와 기업 중심, 폭넓고 오래된 커뮤니티 |
| 생태계 | TorchVision, TorchText, Lightning 등 | Keras, TF-Hub, TF-Serving 등 다양한 생태계 |
| 모델 저장 | .pth 파일로 가중치 중심 저장 | .pb 또는 SavedModel 형식으로 전체 그래프 저장 |
| 서빙 및 배포 | 상대적으로 미흡, TorchServe 지원 | TensorFlow Serving 등 배포 도구 강력 |
| 대표 사용처 | 연구, 프로토타이핑, 학계 | 기업, 프로덕션 서비스, 대규모 모델 서빙 |
| 항목 | PyTorch | TensorFlow |
|---|---|---|
| 모델 정의 | nn.Module 상속 후 forward() 함수 정의 | tf.keras.Model 상속 또는 Sequential 사용 |
| 레이어 쌓기 | nn.Linear, nn.Conv2d, nn.ReLU() 등 직접 사용 | Dense, Conv2D, ReLU 등 Keras 방식으로 구성 |
| 훈련 루프 | 직접 for epoch, loss.backward() 구성 필요 | model.fit() 한 줄로 학습 가능 |
| 유연성 | 매우 높음 (루프, 조건문 다 구현 가능) | 편리하지만 제어 범위는 PyTorch보다 적음 |
텐서는 여러 차원의 배열 데이터(Matrix)를 담을 수 있는 그릇이다. PyTorch에서는 텐서를 이용해 데이터를 저장하고 계산한다. 텐서 단위로 진행해야 자동 미분 기능을 적용하거나 GPU에서 빠르게 연산할 수 있다.
| 차원 (차수) | 예시 코드 | 형태 예시 | 의미 / 사용 예 |
|---|---|---|---|
| 0D | torch.tensor(7) | 7 | 스칼라 (숫자 하나) |
| 1D | torch.tensor([1, 2, 3]) | [1, 2, 3] | 벡터 (특성 벡터 등) |
| 2D | torch.tensor([[1, 2], [3, 4]]) | [[1, 2], [3, 4]] | 행렬 (입력 데이터, 가중치 등) |
| 3D | torch.rand(3, 28, 28) | [채널, 높이, 너비] | 흑백 이미지 3장 (CNN 한 장의 구조) |
| 4D | torch.rand(32, 3, 28, 28) | [배치, 채널, 높이, 너비] | 컬러 이미지 32장 (CNN 배치 입력) |
| 5D | torch.rand(10, 32, 3, 28, 28) | [시퀀스, 배치, 채널, 높이, 너비] | 비디오 입력 등 (시계열+공간) |
| 항목 | PyTorch Tensor | NumPy Array |
|---|---|---|
| 정의 | 딥러닝 연산을 위한 다차원 행렬 구조 | 과학계산/수치계산을 위한 다차원 배열 구조 |
| 지원 기능 | GPU 가속, 자동 미분 (autograd) 기능 포함 | CPU 연산 중심, 자동 미분 없음 |
| 연산 라이브러리 | PyTorch 내부 연산 함수 | NumPy 라이브러리 연산 함수 사용 |
| GPU 사용 가능 | 가능 (tensor.to('cuda')) | 불가능 (GPU 연산 미지원) |
| 자동 미분 | 가능 (requires_grad=True 설정 시) | 불가능 |
| 상호 변환 | .numpy(), torch.from_numpy()로 자유롭게 가능 | 동일 |
PyTorch와 TensorFlow는 모두 딥러닝을 위한 프레임워크이지만, 몇 가지 주요 차이점이 있습니다.
첫 번째는 사용성입니다. PyTorch는 Pythonic한 설계 덕분에 직관적이고 간결한 코드 작성이 가능하며, 특히 연구 개발 단계에서 인기가 많습니다. 반면 TensorFlow는 초기에는 코드가 복잡했지만, TensorFlow 2.0 이후 Keras와 통합되면서 사용성이 많이 개선되었습니다.
두번째는 커뮤니티와 생태계 측면에서 TensorFlow는 대규모 배포와 모바일 환경 지원에서 강점이 있습니다. PyTorch는 연구와 프로토타입 개발에서 더 선호되며, 최근에는 배포 도구인 TorchServe로 프로덕션 환경에서도 많이 사용되고 있습니다.
결론적으로, PyTorch는 유연성과 사용성이 강점이고, TensorFlow는 배포와 확장성에서 더 유리하다고 볼 수 있습니다.
PyTorch의 텐서는 다차원 배열을 표현하는 데이터 구조로, NumPy의 배열과 유사한 역할을 합니다. 하지만 PyTorch 텐서는 GPU 가속 연산을 지원한다는 점에서 NumPy 배열과 차이가 있습니다.
예를 들어, PyTorch의 텐서는 torch.tensor로 선언하며, CPU뿐만 아니라 GPU에서도 연산을 수행할 수 있습니다. GPU로 연산하려면 텐서를 .to(device) 메서드로 이동시키면 됩니다. 이 기능은 대규모 데이터 처리와 딥러닝 모델 학습에 유리합니다.
또한, PyTorch 텐서는 autograd을 지원합니다. requires_grad=True로 설정된 텐서는 계산 그래프를 기록하며, 이를 통해 손실 함수의 경사(gradient)를 자동으로 계산할 수 있습니다. 반면 NumPy 배열은 이러한 기능이 없기 때문에 딥러닝 학습에는 적합하지 않습니다.
요약하자면, PyTorch 텐서는 NumPy 배열처럼 데이터 조작이 가능하지만, GPU 가속 연산과 자동 미분 기능 덕분에 딥러닝 작업에 특화된 데이터 구조입니다.