파이토치를 다루다보면 다양한 에러에 마주치게 되는데 사실 구글링해도 안나오는 에러들도 있고 나중에 다시 구글링하기에도 시간이 아까워서 이 포스트에 계속 쌓아두려고 한다.
1. device-side assert triggerd CUDA kernel errors
RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1. Compile with TORCH_USE_CUDA_DSA to enable device-side assertions.
colab을 사용하는 과정에서 한동안 많이 겪었던 에러인데, 구글링 했을 때 따로 이에 대한 해결책은 없었다. 블로그를 보면 CUDA_LAUNCH_BLOCKING = 1을 선언해주면 된다고 하는데 이렇게 하더라도 동일한 이슈가 나왔다.
나 같은 경우에는 코랩 사본을 만들고 런타임 환경을 재 설정하고 다시 돌리니 잘 나왔다.
2. index i is out of range in self or list index out of range
CustomDataset을 지정해주는 과정에서, __getitem__()과 __len__()이 있는데 이 부분에서 에러가 났을 확률이 있다. 우리가 학습 배치에 사용하려는 대상에 정확히 일치하는 아이템을 Trainloader에서 받아주고 있는지 확인해야한다.
예를 들면, 문장의 다음 단어를 예측하는 모델을 만들 때 일반적으로 문장 데이터를 가져와서 이 문장들을 활용해서 sequence를 가져와서 만든다. 그렇게 되면 문장 수 != 시퀀스 수이지만 데이터셋을 선언하는 과정에서 Len, getitem에서 잘못 코드를 짜는 경우 이런 에러가 발생한다.
3. RuntimeError: Expected tensor for argument #1 'indices' to have one of the following scalar types: Long, Int; but got torch.DoubleTensor instead (while checking arguments for embedding)
nn.Embedding을 활용하는 과정에서 getitem의 type선언이 잘못된 경우 발생하는데 예를 들어 `nn.Embedding` 레이어는 입력으로 long 타입의 tensor를 요구하는데, float 타입의 tensor를 입력하면 type 문제로 인한 `RuntimeError`가 발생한다.
index는 당연히 정수를 제공해야하는데 index가 Float으로 되어 있다는 의미이다. 처음 이해할 때 임베딩 벡터를 이루는 구성 요소들은 당연히 벡터인데 이걸 모두 정수로 바꾼다는 의미인가?라고 생각하면서 엄청 헤맸는데, 내가 잘못 이해한거는 임베딩의 Input으로 들어가는 요소는 vocab이라고 해서 index, 단어로 이루어진 형태로 이 Index는 정수로 바꿔주는게 맞다.
따라서 요런 형태로 dtype을 지정해주는 것도 방법이 될 수 있다.
def __getitem__(self, idx): # dataset 접근
X = torch.tensor(self.X[idx], dtype = torch.long)
label = torch.tensor(self.label[idx], dtype = torch.long)
4. RuntimeError: Expected 3D (unbatched) or 4D (batched) input to conv2d, but got input of size: [28, 28]
mat 1 X mat shapes cannot be multiplied(1 x 576 and 1600 x 10)
CNN과 같은 영역에서 자주 발생하는 에러인데 이건 신경망에서 인풋으로 받아야하는 차원이 맞지 않아서 발생하는 문제로, 처음 코드 짜는 당시에 잘 계산해서 넣거나 에러에서도 차원을 설명해주기 때문에 보고 수정하면 된다.
5. cuda out of memory
GPU의 메모리는 한정적이기에 모델을 학습할 때, GPU 메모리 사용량을 주의해야한다. Colab을 사용하는 경우에는 멈춰버린다..
GPU는 미니배치, 모델 파라미터, back propagation을 위한 각 레이어의 출력 결과물에 쓰이는데 이를 해결하기 위해서 2개 정도 방법이 있다.
- batch_size 감소
- torch.cuda.empty_cache 메서드 호출
6. TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
텐서가 GPU있을 때에는 NumPy 배열로 변환될 수 없기 때문에 .detach().cpu().numpy()로 바꿔야 사용할 수 있다.
'Machine Learning > 개념 정리' 카테고리의 다른 글
Object Detection 모델 개념 정리 (0) | 2024.02.01 |
---|---|
[파이토치] 7. Hydra with lightning (1) | 2024.01.03 |
[파이토치] 6. TensorBoard와 WandB (2) | 2024.01.02 |
[파이토치] 5. Lightning pytorch (1) | 2024.01.01 |
[파이토치] 4. 여러 모듈 사용 (2) | 2023.12.29 |