
딥러닝 분야에서 가장 각광받는 프레임워크 중 하나인 PyTorch, 그 시작은 '설치'입니다. 하지만 초보 개발자들에게 설치 과정은 복잡한 환경 설정과 호환성 문제로 인해 좌절을 안겨주기도 합니다. 본 가이드는 단순한 명령어 복사-붙여넣기를 넘어, 왜 그렇게 설치해야 하는지, 발생할 수 있는 문제의 근본적인 해결 방법은 무엇인지 전문적인 시각에서 상세히 안내합니다. 특히, GPU 활용을 위한 NVIDIA CUDA 환경 구축과 같은 난해한 부분을 명쾌하게 풀어냅니다.
1. 설치 전 필수 이해: 내 하드웨어 확인
PyTorch 설치의 가장 큰 분기점은 'GPU(NVIDIA 그래픽카드)' 유무입니다. GPU는 딥러닝 연산을 획기적으로 가속화할 수 있지만, 설치 과정이 복잡합니다. 반면, CPU 버전은 비교적 간단하게 설치할 수 있습니다.
1.1. GPU(NVIDIA) 확인 및 CUDA 드라이버 설치
- NVIDIA 제어판 또는 장치 관리자에서 사용 중인 NVIDIA 그래픽카드 모델명을 확인합니다. (GeForce RTX 3060 등)
- 해당 모델이 CUDA를 지원하는지 확인합니다. (대부분의 최신 모델은 지원합니다.)
- NVIDIA 공식 홈페이지에서 최신 그래픽 드라이버를 다운로드하여 설치합니다. 드라이버 설치 과정에서 호환되는 CUDA 버전이 자동으로 설치되는 경우가 많습니다.
- 시스템 명령 프롬프트(CMD) 또는 터미널에서
nvidia-smi명령어를 입력하여 설치된 드라이버 및 지원하는 최대 CUDA 버전을 확인합니다.
nvidia-smi
주의: 'CUDA Version' 항목에 표시되는 버전은 해당 드라이버가 지원할 수 있는 *최대* CUDA 버전입니다. 실제 설치된 CUDA Toolkit 버전과는 다를 수 있습니다.
1.2. CPU 버전 설치 결정
NVIDIA GPU가 없거나, 맥(Apple Silicon 제외, 이전 모델), 혹은 복잡한 설정 없이 빠르게 PyTorch를 체험해보고 싶다면 CPU 버전을 선택하는 것이 현명합니다. 이 가이드에서는 CPU 버전 설치도 함께 다룹니다.
2. CPU vs GPU 버전: 상세 비교
사용자 환경과 목표에 따라 CPU와 GPU 버전 중 어떤 것을 선택해야 할지 결정하는 데 도움이 되는 비교 표입니다.
| 비교 항목 | CPU 버전 | GPU 버전 (with CUDA) |
|---|---|---|
| 주요 하드웨어 | Intel, AMD CPU (Apple Silicon 포함) | NVIDIA GPU |
| 연산 가속 | 없음 (CPU 기본 연산) | 있음 (CUDA 활용 대폭 가속) |
| 설치 복잡도 | 낮음 (pip/conda 명령어 한 줄) | 높음 (드라이버, CUDA Toolkit 설치 필요) |
| 최적 사용처 | 모델 학습 테스트, 간단한 인퍼런스, 리소스 제한 환경 | 대규모 모델 학습, 실시간 인퍼런스, 고성능 계산 |
| 장점 | 설치가 간편하고 안정적임. 맥 등 비 NVIDIA 환경 지원. | 매우 빠른 학습 속도 제공. |
| 단점 | 대규모 모델 학습 시 극도로 느림. | NVIDIA 그래픽카드 필수. 설치 및 환경 설정이 어려움. |
3. 3가지 주요 설치 방법 상세 안내
시스템 환경에 따라 최적의 설치 방법이 다를 수 있습니다. 대표적인 3가지 방법을 단계별로 설명합니다.
방법 3.1: Python Package Manager (pip) 활용
가장 일반적이고 가벼운 방법입니다. 가상환경(venv)을 사용하는 것이 권장됩니다.
- 가상환경 생성 및 활성화:
python -m venv pytorch_venv # Windows pytorch_venv\Scripts\activate # Linux/macOS source pytorch_venv/bin/activate - PyTorch 공식 홈페이지에서 자신의 환경(OS, CUDA 버전)에 맞는 명령어를 복사하여 실행합니다.
- CPU 버전 (Linux 예시):
pip install torch torchvision torchaudio - GPU 버전 (CUDA 12.1 예시, Linux):
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
- CPU 버전 (Linux 예시):
방법 3.2: Conda Package Manager 활용
데이터 과학 환경 구축에 유리합니다. 패키지 간 의존성 관리가 잘 된다는 장점이 있습니다.
- Conda 환경 생성 및 활성화:
conda create -n pytorch_env python=3.10 conda activate pytorch_env - PyTorch 공식 홈페이지에서 명령어를 확인하여 실행합니다.
- Conda를 통한 GPU 설치 (CUDA 12.1 예시):
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia - Conda를 통한 CPU 설치:
conda install pytorch torchvision torchaudio cpuonly -c pytorch
- Conda를 통한 GPU 설치 (CUDA 12.1 예시):
방법 3.3: Docker 컨테이너 활용 (고급 사용자)
호스트 시스템에 CUDA를 직접 설치하지 않고도 격리된 환경에서 PyTorch를 실행할 수 있습니다. NVIDIA Container Toolkit 설치가 필수입니다.
- Docker 설치 및 NVIDIA Container Toolkit 설치 확인
- NVIDIA 공식 PyTorch Docker 이미지 사용:
docker pull nvcr.io/nvidia/pytorch:24.03-py3 # 예시 버전 - GPU 할당과 함께 컨테이너 실행:
docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:24.03-py3
4. 설치 결과 확인 및 문제 해결
설치가 완료되면, Python 인터프리터에서 간단한 스크립트를 통해 PyTorch가 정상적으로 설치되었는지, 특히 GPU를 인식하는지 확인해야 합니다.
4.1. 설치 확인 스크립트
import torch
print(f"PyTorch Version: {torch.__version__}")
if torch.cuda.is_available():
print("GPU is AVAILABLE.")
print(f"CUDA Version: {torch.version.cuda}")
print(f"Current GPU Device: {torch.cuda.get_device_name(0)}")
else:
print("GPU is NOT available. Using CPU.")
성공적인 GPU 설정 시 출력 예시
PyTorch Version: 2.2.0+cu121
GPU is AVAILABLE.
CUDA Version: 12.1
Current GPU Device: NVIDIA GeForce RTX 3080 Ti
4.2. GPU 인식 실패 시 해결 방법 2가지
만약 `torch.cuda.is_available()`이 `False`를 반환한다면, 다음과 같은 이유일 수 있습니다.
- 해결 방법 1: CUDA 버전 불일치 확인
- `nvidia-smi`로 확인한 'CUDA Version'이 PyTorch 설치 시 지정한 CUDA 버전보다 크거나 같은지 확인합니다. 만약 설치하려는 PyTorch의 CUDA 버전이 더 높다면, NVIDIA 드라이버를 업데이트해야 합니다.
- 해결 방법 2: CPU 전용 버전 오설치 확인
- `pip list | grep torch` 또는 `conda list torch` 명령어로 설치된 torch 버전을 확인합니다. 버전명에 `+cu...` 형식의 CUDA 표시가 없다면(예: `2.2.0`), CPU 전용 버전이 설치된 것입니다. 이 경우, 해당 패키지를 삭제하고 GPU 버전 설치 명령어를 다시 실행하십시오.
5. 실무 적용 가능한 예제 7가지
개발자가 PyTorch를 설치한 후 실무에서 바로 적용해볼 수 있는 7가지 핵심 예제를 소개합니다.
예제 1: 텐서 생성 및 기본 연산
import torch
# 텐서 생성 (2x3)
x = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32)
y = torch.ones(2, 3)
# 텐서 덧셈
z = x + y
print(f"x + y =\n{z}")
# 행렬 곱셈 (3x2 텐서와 2x3 텐서 곱)
v = torch.randn(3, 2)
result = torch.matmul(v, x)
print(f"v * x =\n{result}")
예제 2: CPU와 GPU 간 텐서 이동
import torch
# 기본적으로 CPU에 텐서 생성
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"Using device: {device}")
x = torch.randn(3, 3)
print(f"Original device: {x.device}")
# GPU로 이동 (GPU 사용 가능 시)
if torch.cuda.is_available():
x_gpu = x.to(device)
print(f"Moved to device: {x_gpu.device}")
# GPU 텐서 연산
y_gpu = torch.ones_like(x_gpu) * 2
z_gpu = x_gpu + y_gpu
print(f"Result device: {z_gpu.device}")
# 다시 CPU로 이동
x_cpu = z_gpu.to('cpu')
print(f"Moved back to device: {x_cpu.device}")
예제 3: 자동 미분 (Autograd) 활용
import torch
# requires_grad=True 설정으로 미분 추적 활성화
x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x**2 + 3*x + 1
# y를 x에 대해 미분
y.backward(torch.tensor([1.0, 1.0])) # 각 요소에 대한 그라디언트 계산
# x에 대한 미분값 확인 (dy/dx = 2x + 3)
# x=[2, 3] 일 때 dy/dx = [7, 9]
print(f"x.grad =\n{x.grad}")
예제 4: 간단한 선형 회귀 모델 정의
import torch
import torch.nn as nn
# 입력 데이터 (특징 수: 1, 출력 수: 1)
model = nn.Linear(1, 1)
# 초기 가중치와 편향 확인
print(f"Weight: {model.weight}")
print(f"Bias: {model.bias}")
# 입력 데이터 생성
input_data = torch.tensor([[1.0], [2.0], [3.0]])
# 모델 예측 (Inference)
output = model(input_data)
print(f"Prediction:\n{output}")
예제 5: 손실 함수와 최적화 도구 사용
import torch
import torch.nn as nn
import torch.optim as optim
# 간단한 모델 및 데이터
model = nn.Linear(1, 1)
criterion = nn.MSELoss() # 평균 제곱 오차 손실 함수
optimizer = optim.SGD(model.parameters(), lr=0.01) # 확률적 경사 하강법
# 가상의 목표값
target = torch.tensor([[2.0], [4.0], [6.0]])
input_data = torch.tensor([[1.0], [2.0], [3.0]])
# 훈련 스텝 (1회)
optimizer.zero_grad() # 그라디언트 초기화
output = model(input_data) # 예측
loss = criterion(output, target) # 손실 계산
loss.backward() # 역전파 (그라디언트 계산)
optimizer.step() # 가중치 업데이트
print(f"Loss after 1 step: {loss.item()}")
예제 6: 커스텀 데이터셋 클래스 정의
import torch
from torch.utils.data import Dataset, DataLoader
class SimpleDataset(Dataset):
def __init__(self, size=100):
# 가상의 데이터 생성
self.x = torch.randn(size, 10)
self.y = torch.randint(0, 2, (size,))
def __len__(self):
return len(self.x)
def __getitem__(self, idx):
return self.x[idx], self.y[idx]
# 데이터셋 인스턴스 생성
dataset = SimpleDataset()
# 데이터로더 활용 (미니배치 처리)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
for batch_idx, (data, target) in enumerate(dataloader):
print(f"Batch {batch_idx}: data shape {data.shape}, target shape {target.shape}")
if batch_idx == 1: break # 2개 배치만 확인
예제 7: MNIST 데이터셋 다운로드 및 전처리 (torchvision 활용)
import torch
import torchvision
import torchvision.transforms as transforms
# MNIST 데이터셋 다운로드 및 텐서 변환 설정
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,)) # 데이터 정규화
])
# 학습 데이터셋 다운로드
trainset = torchvision.datasets.MNIST(root='./data', train=True,
download=True, transform=transform)
# 테스트 데이터셋 다운로드
testset = torchvision.datasets.MNIST(root='./data', train=False,
download=True, transform=transform)
print(f"Train Dataset Size: {len(trainset)}")
print(f"Test Dataset Size: {len(testset)}")
# 데이터 확인 (첫 번째 데이터)
image, label = trainset[0]
print(f"Image shape: {image.shape}, Label: {label}")
출처
- PyTorch 공식 문서.
- NVIDIA CUDA Toolkit documentation.
- Docker documentation.
'Artificial Intelligence > 21. PyTorch' 카테고리의 다른 글
| [PYTORCH] 특정 레이어 가중치 고정 방법 3가지와 전이 학습 효율 차이 및 해결책 7가지 (0) | 2026.03.23 |
|---|---|
| [PYTORCH] 중간 텐서 그래디언트 확인 방법 2가지와 register_hook 활용 해결책 7가지 (0) | 2026.03.23 |
| [PYTORCH] backward() 두 번 호출 시 에러 발생하는 이유 1가지와 해결 방법 7가지 (0) | 2026.03.23 |
| [PYTORCH] 야코비안(Jacobian) 행렬의 3가지 핵심 원리와 벡터 미분 해결 방법 7가지 (0) | 2026.03.23 |
| [PYTORCH] 그래디언트 클리핑(Gradient Clipping) 필수 이유 1가지와 기울기 폭주 해결 방법 7가지 (0) | 2026.03.23 |