CUDA 이야기가 꼬이는 이유는 버전이라고 부르는 것이 셋인데 이름이 비슷하기 때문이다. 어느 것이 문제인지 가르지 않으면 엉뚱한 것을 다시 설치하게 된다.
| 무엇 | 확인 방법 | 제공 주체 |
|---|---|---|
| 드라이버 버전 | nvidia-smi 의 Driver Version |
커널 모듈 + 사용자 공간 라이브러리 |
| 드라이버가 지원하는 최대 CUDA 런타임 | nvidia-smi 의 CUDA Version |
드라이버가 NVML 로 보고하는 값 |
| 설치된 CUDA 툴킷 | nvcc --version |
CUDA Toolkit 패키지 |
nvidia-smi
nvcc --version
cat /proc/driver/nvidia/version
lspci | grep -i nvidia
nvidia-smi 오른쪽 위에 찍히는 CUDA Version 은 이 드라이버가 최대 몇 버전의 CUDA 런타임을 돌릴 수 있는지를 알려 주는 값이다. CUDA Toolkit 을 설치하지 않았어도 값이 찍히고, 반대로 툴킷을 설치했다고 이 값이 올라가지도 않는다.
N/A 로 나오는 경우는 다음과 같다.
nvidia-smi 바이너리와 드라이버 라이브러리의 출처가 어긋나 NVML 이 값을 읽지 못한다.즉 N/A 를 보고 CUDA Toolkit 을 설치하는 것은 대개 헛수고다. 먼저 드라이버 상태를 본다.
# 커널 모듈이 올라와 있는가
lsmod | grep -E '^nvidia'
dmesg | grep -i -E 'nvrm|nvidia' | tail -20
# 드라이버 라이브러리가 있는가
ldconfig -p | grep -E 'libnvidia-ml|libcuda'
nvcc: command not found 는 CUDA Toolkit 이 없거나 PATH 에 안 잡힌 것이다. 툴킷은 CUDA 코드를 컴파일할 때 필요한 것이고, PyTorch 나 TensorFlow 를 설치해 쓰기만 한다면 없어도 된다. pip 로 받는 휠에는 필요한 CUDA 런타임 라이브러리가 함께 들어 있다.
툴킷을 설치했는데 nvcc 를 못 찾는다면 경로만 잡아 주면 된다.
ls -d /usr/local/cuda*
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
영구 적용은 /etc/profile.d/cuda.sh 에 둔다. 사용자 ~/.bashrc 에만 넣으면 systemd 로 뜨는 서비스에는 적용되지 않는다.
/usr/local/cuda/lib64 에 파일이 보인다고 GPU 를 쓸 수 있는 상태는 아니다. 실제로 GPU 와 이야기하는 라이브러리는 libcuda.so.1 이고, 이것은 툴킷이 아니라 드라이버가 설치한다. 확인은 실행해 보는 것이 가장 확실하다.
python3 -c "import torch; print(torch.cuda.is_available(), torch.cuda.device_count())"
python3 -c "import torch; print(torch.cuda.get_device_name(0))"
torch.cuda.is_available() 이 False 면 순서대로 본다 — 드라이버가 올라왔는가, libcuda.so.1 이 보이는가, 설치한 torch 가 CPU 전용 빌드는 아닌가.
호스트의 /usr/local/cuda/lib64 를 컨테이너에 볼륨으로 마운트하는 방식은 동작하지 않는다. 드라이버 라이브러리는 커널 모듈 버전과 정확히 맞아야 하고, 이것을 컨테이너에 넣어 주는 일은 NVIDIA Container Toolkit 이 한다.
# 호스트에 컨테이너 툴킷이 있는가
nvidia-ctk --version
grep -n nvidia /etc/docker/daemon.json
# 컨테이너에서 확인
docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
libcuda reported version is not found 나 libcuda.so.1: cannot open shared object file 이 컨테이너 안에서 난다면 드라이버 라이브러리가 주입되지 않은 것이다. --gpus all(또는 --runtime=nvidia)을 빠뜨렸거나 컨테이너 툴킷이 설정되지 않았다.
이미지의 CUDA 버전은 호스트 드라이버가 지원하는 최대 런타임 버전보다 높으면 안 된다. nvidia-smi 의 CUDA Version 이 12.2 인데 CUDA 12.6 기반 이미지를 돌리면 실행 시점에 실패한다. 드라이버를 올리거나 이미지를 낮춘다.