← 보드GPU와 Colab · 3/8
Tensor와 모델을 device로 옮기기 — .to(device) ★★★
Tensor는 처음 만들면 CPU에 생겨요. 어느 장치에 있는지는 x.device로 봐요. GPU로 보내려면 두 가지 방법이 있어요.
- 만들 때부터 지정 —
torch.zeros(2, 3, device=device) - 만든 뒤에 옮기기 —
x = x.to(device)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
x = torch.zeros(2, 3, device=device)
y = torch.randn(3, 4)
print(y.device)
y = y.to(device)
print(y.device)
| 코드 줄 | GPU 없는 컴퓨터 | GPU 있는 환경 (예 Colab) |
|---|---|---|
print(y.device) (처음) | cpu | cpu (처음은 항상 CPU) |
y = y.to(device) 뒤 print(y.device) | cpu (옮길 곳이 CPU) | cuda:0 (0번 GPU로 이동) |
"cuda:0"의 0은 0번 GPU라는 뜻이에요. GPU가 한 장이면 그냥 0번이에요.
제일 중요한 규칙
.to(device)는 원본을 바꾸지 않고 "옮겨진 새 Tensor"를 돌려줘요. 그래서 반드시 x = x.to(device)처럼 변수에 다시 저장해야 해요. x.to(device)만 쓰고 저장하지 않으면 x는 그대로 CPU에 있어요.
비유 — 택배
택배(.to)를 보내면 상품이 "새로 도착한 택배 상자"로 와요. 그 상자를 받아서 선반(변수 x)에 올려놓아야 써먹을 수 있어요. 받지 않고 흘려보내면 선반에는 원래 물건만 있어요.
모델(layer)도 같은 방법으로 옮겨요.
from torch import nn
model = nn.Linear(4, 2)
model = model.to(device)
x = torch.randn(3, 4).to(device)
y = model(x)
print(y.device)
print(model.weight.device)
cpu
cpu
| 코드 줄 | 무슨 뜻 |
|---|---|
model = nn.Linear(4, 2) | 입력 4개, 출력 2개인 한 층짜리 모델 |
model = model.to(device) | 모델의 weight, bias를 device로 옮겨요(수업 슬라이드의 방식 그대로) |
torch.randn(3, 4).to(device) | (3, 4) 입력을 만들자마자 같은 device로 옮겨요. 한 줄에 붙여 쓴 모양이에요 |
y = model(x) | 모델과 입력이 같은 곳에 있으니 계산돼요. 결과도 같은 device에 생겨요 |
출력 cpu, cpu | GPU 없는 컴퓨터의 결과예요. GPU 환경이면 cuda:0, cuda:0이 나와요 |
시험엔 이렇게 써요 — 이렇게 고르세요
.to(device)는 새 Tensor를 반환하므로 x = x.to(device)처럼 반환값을 변수에 다시 저장해야 한다. 모델도 model = model.to(device)로 옮긴다. 선택지에 "x.to(device)만 실행해도 x가 GPU로 이동한다"가 있으면 오답이에요.
잠깐 확인 — GPU가 있는 환경에서 x = torch.randn(3, 4)를 만든 뒤 x.to('cuda')를 저장 없이 한 줄만 실행했습니다. 이어서 print(x.device)를 하면?
cpu예요. 옮겨진 새 Tensor를 변수에 저장하지 않아서 x는 그대로 CPU에 있어요.
다음 카드 → 같은 device에 있어야 계산돼요 ★★★
자료: 2주차(+1·3주차) · Week02_Tensor_and_GPU, 구글 Colab GPU 환경 사용법.pdf · 빅분01(1주차)·빅분02(2주차)·빅데이터03(3주차) 녹취