원인
- 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
'NLP > error' 카테고리의 다른 글
[error] conda 에서 local 에 설치된 라이브러리에 접근해요 (0) | 2024.02.23 |
---|---|
[error] GPU가 충분한데 CUDA OUT OF MEMORY가 발생합니다 (0) | 2023.12.13 |
[error] PeftModelForCausalLM.generate() takes 1 positional argument and 2 were given (0) | 2023.09.19 |
[error] 파이썬 엑셀 인코딩 문제 해결 (0) | 2023.09.19 |
[error] pretraind language model 이 같은 값만 뱉는 경우 (0) | 2022.07.26 |