본문 바로가기

NLP/error

[error] RuntimeError: CUDA error: invalid device ordinal

원인

  • GPU devices 번호를 잘못 지정했을 때 발생한다.
  • 예컨대, GPU 가 2개 밖에 없는데 3번이나 4번에 지정하면 위와 같은 에러가 발생한다.
  • 혹은 GPU device 가 0, 1, 2, 3 과 같은 순서로 놓여 있지 않아서 발생할 수 있다.

 

해결책 

1. CUDA_DEVICE_ORDER

 

  • 먼저 GPU 순서를 명확히 한다.
  • 다음 코드를 실행하면, GPU 번호가 PCI BUS ID 에 따라 0, 1, .. 이렇게 배정된다.
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"

 

  • 물론 bash/Terminal 에서 실행하는 경우엔 다음과 같이 하면 된다.
CUDA_DEVICE_ORDER=PCI_BUS_ID python script.py

 

 

2.  CUDA_VISIBLE_DEVICES

 

  • 해당 코드를 실행할 때, 사용할 GPU 를 선정한다.
  • 의미 그대로, 해당 코드는 지정한 GPU 밖에 볼 수 없다.

 

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="0"

 

내가 GPU 가 0 ~ 7 까지 총 8개가 있더라도, 실행한 코드는 0번 GPU 밖에 사용할 수 없게 된다.

 

 

여기서 내가 착각했던 것

 

  • 만약 "CUDA_VISIBLE_DEVICES = 2, 3, 4" 를 통해 3개의 GPU 만 볼 수 있게 되었다고 하자.
  • 이제 device = 'cuda:4' 를 부르면 될까? 즉 4번이라고 부르면 이해할까?
  • 정답은 안 된다. 이제 컴퓨터 입장에선 2, 3, 4 밖에 보지 못하니 코드 입장에선 0, 1, 2 로 보인다. 컴퓨터는 무조건 0번부터 센다.
  • 그러므로  device = 'cuda:0' 은 우리에겐 2번 GPU 를 의미한다.

그러므로 1번 GPU 만 사용하게 코드를 작성하려면, CUDA_VISIBLE_DEVICES 엔 1 만 넣고, 코드에서 cuda 번호를 매길 때는 1이 아닌 0번을 사용해야 한다. 아래와 같이 실행해야 한다.

 

CUDA_VISIBLE_DEVICES=1 python script.py --device 0