티스토리 뷰
Computer/이게 왜 안되지?
[이왜안?] Input and hidden tensors are not at the same device, found input tensor at cuda:0 and hidden tensor at cpu
벼랑끝과학자 2022. 12. 31. 03:10Cuda:0, Cpu 두 키워드가 에러에 동시에 출력되면 그냥 거의 백이면 백, 특정 변수는 GPU의 메모리(VRAM)에, 어떤 변수는 CPU의 메모리(RAM)에 올라와 있다고 생각하면 된다.
다음과 같은 경우를 주로 살펴보면 해결된다.
model.to(device)만으로는 모델 내부에서 생성되는 변수는 device에 자동으로 올라가지 않는다.
예를들어 다음과 같은 코드를 보자
def forward(self, v):
# 1. CNN
...
if config['rnn_Use_GRU_LSTM_target'] == 'LSTM':
h0 = torch.randn(self.direction * ... )
c0 = torch.randn(self.direction * ... )
v, (hn,cn) = self.rnn(v.double(), (h0.double(), c0.double()))
...
h0나 c0등은 모델이 되는 인스턴스 내부에서 생성된 변수이다. 이런 변수들은 보통 우리가 모델 인스턴스를 생성하고 device라는 변수 명에 GPU를 저장하고 model.to(device)등의 코드를 통해 모델의 파라미터를 GPU로 올린다 하더라도 변수자체는 GPU에 올라가지 않고 CPU에 남아있는 경우가 많다. 모델 내부에서 따로 변수를 선언하는 부분이 있다면 잘 살펴보고 .to(device)또는 device=device 등의 코드를 통해서 모델의 파라미터, 혹은 모델 내부로 input된 데이터의 device와 통일시켜주도록 하자.
다음과 같이 .to(device)를 변수 끝에 붙여주면 된다.
def forward(self, v):
# 1. CNN
...
if config['rnn_Use_GRU_LSTM_target'] == 'LSTM':
h0 = torch.randn(self.direction * ... ).to(device)
c0 = torch.randn(self.direction * ... ).to(device)
v, (hn,cn) = self.rnn(v.double(), (h0.double(), c0.double()))
...
'Computer > 이게 왜 안되지?' 카테고리의 다른 글
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- ai인공지능
- ai신약개발
- manimtutorial
- 제한볼츠만머신
- variational autoencoder
- marginal likelihood
- 베이즈정리
- kld
- MorganCircularfingerprint
- 선형대수
- 이왜안
- 오일석기계학습
- Matrix algebra
- 3B1B따라잡기
- MatrixAlgebra
- Manimlibrary
- 기계학습
- 3b1b
- 인공지능
- 파이썬
- manim
- eigenvector
- 백준
- 최대우도추정
- manim library
- eigenvalue
- kl divergence
- vae
- elementry matrix
- MLE
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함