오류 문구
/opt/conda/conda-bld/pytorch_1682343967769/work/aten/src/ATen/native/cuda/ScatterGatherKernel.cu:365: operator(): block: [23,0,0], thread: [64,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && "index out of bounds"` failed. terminate called after throwing an instance of 'c10::Error' what(): 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.
해결방법 1.
처음에는 CUDA error: device-side assert 이 문구에 꽂혀서 저 문구를 중심으로 문제를 엄청 찾아봤다. 그랬더니 수많은 오류 해결법이 올라왔지만, 그 중 나에게 제일 잘 맞는 듯 해 보였던 원인은 메모리 부족현상이었다. 지금 나는 약 700건의 3D 영상 데이터를 UNETR이라고 하는 transformer 기반 Unet 모델에 학습시켜 segmentation 하는 task를 진행 중에 있기 때문에, 데이터가 크고 모델이 크니 메모리가 부족한가보다! 하는 생각에 tensor parallelism에 대해 알아보며 소스코드에 적용했다. 그러나 동일한 오류가 발생했고, 결정적으로 GPU 사용량을 확인해보면 4개의 GPU 중 3개만 80%대 사용하고, 나머지 하나는 거의 사용하지 않았다. 그래서 다시 한 번 구글링을 진행하였다.
해결방법 2.
이번엔, opt/conda/conda bld/pytorch_1682343967769/work/aten/src/ATen/native/cuda/ScatterGatherKernel.cu:365: operator(): block: [23,0,0], thread: [64,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && "index out of bounds"` failed.
이 부분에 초점을 맞춰 구글링을 진행하였다. 다들 'outputchannel과 클래스의 개수가 맞지 않아서 발생한 오류'라고 말했다. 처음 생각할 땐, 'segmentation인데 클래스가 있나..?' 했다. 여기서 내가 실수한 부분을 알았다.
segmentation이 우리가 생각할 땐 단순히 영역을 분할하는 것 이지만 컴퓨터의 입장에서 생각하면 내가 관심있는 영역인지 아닌지 클래스를 분류하는 문제로도 생각할 수 있다. 결국 저 오류문구는 내 데이터가 클래스의 갯수대로 되어있지 않아서 생긴 문제였다. 쉽게 말하면
이 귀여운 고양이를 배경에서 자르기 위해 segmentation한다고 하자. 지금은 배경과 고양이들이 모두 각각의 픽셀 값을 가진다. 그래서 이 고양이를 segmentation하기 위해 masking 영상이라는 걸 만들어야 한다. 고양이가 어디 있는지 알려주는 클래스 영상이라고 생각하면된다.
내 데이터는 이 클래스 영상에서 문제가 있었다. 본래 segmentation의 클래스 영상인 masking은 해당 픽셀이 어느 객체를 나타내는지 클래스로 나타내야 한다. 예를 들어 배경값은 모두 0을 가지고, 흰 고양이는 1의 값을 가지고, 갈색 고양이는 2의 값을 가진다고 하면
이런 식으로 각 픽셀들이 라벨링이 되어있어야 한다.
나는 객체 하나를 라벨링 하는 task를 풀고 있었기 떄문에 0과 1로 나뉜 마스킹 영상이 있어야 하는데, 1이 있어야 할 자리에 65라는 값이 들어가버렸다. 그래서 모델은 내 클래스가 65개가 있지만, output channel이 2개 밖에 없어서 모델과 데이터가 맞지 않는다는 오류가 계속 발생했던 것이었다.
결론
어떤 업무를 시작하기 전에는 그 업무에 대해 충분한 배경지식을 가지자....
결국 공부가 부족해서 이런 오류가 발생하였기 떄문에,, segmentation에 대한 지식의 부재가 오류의 원인이었다. 이 글을 보는 분들은 segmentation 문제를 풀 때, masking 영상의 구성을 잘 하시길 빈다..