티스토리 뷰

Cuda: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()))
        ...

 

 

 

 

 

댓글