torch.cuda.is_available() False 해결: CPU 버전 PyTorch, 드라이버, WSL2, no kernel image 오류
이 글의 핵심
torch.cuda.is_available()이 False를 돌려주는 원인은 대부분 세 가지 중 하나입니다. CPU 전용 PyTorch가 설치됐거나, NVIDIA 드라이버가 없거나 너무 오래됐거나, 지금 실행 중인 파이썬이 생각한 그 환경이 아닌 경우입니다. 이 글은 네 줄짜리 진단 코드와 nvidia-smi 출력으로 원인을 좁히는 방법, PyTorch 휠이 CUDA 런타임을 자체 포함하기 때문에 CUDA 툴킷 설치가 대개 필요 없는 이유, 올바른 재설치 명령, WSL2와 conda 환경의 함정, no kernel image 오류의 의미를 순서대로 설명합니다.
증상: GPU는 분명히 있는데 False가 나온다
PyTorch를 설치하고 가장 먼저 해 보는 확인이 이것입니다.
import torch
print(torch.cuda.is_available())
False
그래픽카드도 NVIDIA이고, 게임도 잘 돌아가고, 작업 관리자에도 GPU가 보이는데 False가 나옵니다. 이 상태로 model.cuda()나 tensor.to("cuda")를 호출하면 아래 둘 중 하나의 오류가 납니다.
AssertionError: Torch not compiled with CUDA enabled
RuntimeError: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx
두 메시지는 원인이 정반대입니다. 첫 번째는 “설치된 PyTorch 자체가 CPU 전용 빌드”라는 뜻이고, 두 번째는 “PyTorch는 CUDA 빌드인데 그 밑에서 동작해야 할 드라이버를 찾지 못했다”는 뜻입니다. 인터넷에 떠도는 해결책이 “CUDA 툴킷을 깔아라”, “드라이버를 다시 깔아라”, “PyTorch를 다시 깔아라”로 제각각인 이유가 여기에 있습니다. 원인이 여러 갈래인데 증상(False)은 하나라서, 원인을 확인하지 않고 해결책부터 따라 하면 시간만 쓰고 상태가 더 꼬이기 쉽습니다.
이 글은 원인을 먼저 좁히고, 그에 맞는 조치를 하는 순서로 진행합니다.
기준 환경: Windows 10/11 또는 Ubuntu 22.04/24.04, NVIDIA GPU, pip(또는 uv, conda) 가상환경에 설치한 PyTorch 2.x. 구체적인 PyTorch 버전과 CUDA 버전 조합은 자주 바뀌므로 이 글에서는 특정 조합을 정답처럼 적지 않습니다. 설치 명령은 항상 pytorch.org의 설치 선택기(Get Started)에서 그때그때 확인하시기 바랍니다.
네 줄로 원인 좁히기
문제가 생긴 바로 그 환경(같은 터미널, 같은 가상환경, 같은 Jupyter 커널)에서 아래 코드를 실행합니다.
import sys, torch
print(sys.executable) # 지금 실제로 실행 중인 파이썬
print(torch.__version__) # PyTorch 버전과 빌드 종류
print(torch.version.cuda) # 이 PyTorch가 빌드된 CUDA 버전 (CPU 빌드면 None)
print(torch.cuda.is_available())
그리고 터미널에서 드라이버 상태를 확인합니다.
nvidia-smi
이 다섯 가지 값이면 대부분의 원인이 갈립니다. 하나씩 읽는 법을 보겠습니다.
sys.executable: 생각한 그 파이썬이 맞는가
의외로 많은 경우가 여기서 끝납니다. 터미널에서 가상환경을 만들고 CUDA 빌드를 설치했는데, VS Code나 Jupyter는 시스템 파이썬이나 다른 가상환경을 쓰고 있는 경우입니다. sys.executable의 경로가 방금 설치한 가상환경의 경로(.venv/bin/python, envs/<이름>/python.exe 등)가 아니라면, PyTorch를 아무리 다시 설치해도 결과는 바뀌지 않습니다. VS Code는 오른쪽 아래 인터프리터 선택, Jupyter는 커널 선택에서 맞는 환경을 고르면 됩니다.
torch.version: 뒤에 붙은 접미사를 본다
PyTorch 공식 인덱스(download.pytorch.org)에서 받은 휠은 버전 뒤에 빌드 종류가 붙습니다.
2.x.y+cpu ← CPU 전용 빌드. GPU를 절대 쓰지 못함
2.x.y+cu1XX ← CUDA 1X.X 런타임을 포함한 빌드
2.x.y+rocmX.Y ← AMD GPU용 빌드
+cpu가 보이면 원인은 확정입니다. 드라이버나 툴킷은 건드릴 필요가 없고, CUDA 빌드로 다시 설치하면 됩니다(뒤에서 설명합니다).
접미사가 아예 없는 경우도 있습니다. 이건 PyPI(기본 pip install torch)에서 받은 휠일 때 흔합니다. 이 경우 접미사만으로는 판단이 안 되므로 바로 다음 줄의 torch.version.cuda를 봐야 합니다. 참고로 PyPI의 기본 휠이 CUDA 빌드인지 CPU 빌드인지는 운영체제에 따라 다릅니다. 리눅스에서는 오랫동안 PyPI 기본 휠이 CUDA 빌드였고, 윈도우에서는 PyPI 기본 휠이 CPU 빌드였습니다. 그래서 윈도우에서 pip install torch만 실행하면 GPU를 못 쓰는 PyTorch가 설치되는 일이 매우 흔합니다. 이 정책은 바뀔 수 있으니, 결국 확실한 방법은 설치 후 torch.version.cuda를 직접 확인하는 것입니다.
torch.version.cuda: None이면 CPU 빌드
>>> torch.version.cuda
'12.X' # CUDA 빌드
>>> torch.version.cuda
None # CPU 빌드
None이면 접미사가 없더라도 CPU 빌드입니다. 값이 있다면 PyTorch 쪽은 정상이고, 원인은 드라이버나 환경 쪽에 있습니다. 이 값은 “이 PyTorch가 어떤 CUDA 런타임으로 빌드됐는가”를 뜻하며, 시스템에 설치된 CUDA 툴킷 버전과는 상관이 없다는 점을 기억해 두세요. 이 차이가 혼란의 큰 원인이라 아래에서 따로 설명합니다.
nvidia-smi: 오른쪽 위의 CUDA Version은 “설치된 버전”이 아니다
드라이버가 정상이면 nvidia-smi는 이런 표를 출력합니다.
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 5XX.XX Driver Version: 5XX.XX CUDA Version: 12.X |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
...
여기서 가장 많이 오해하는 부분이 오른쪽 위의 CUDA Version입니다. 이 값은 시스템에 설치된 CUDA 툴킷의 버전이 아니라, 이 드라이버가 지원하는 CUDA의 최대 버전입니다. CUDA 툴킷을 전혀 설치하지 않은 컴퓨터에서도 이 숫자는 표시됩니다.
이 숫자가 중요한 이유는 PyTorch의 torch.version.cuda와 비교해야 하기 때문입니다. PyTorch가 CUDA 12.X로 빌드됐다면, 드라이버가 그 버전을 실행할 수 있을 만큼 새로워야 합니다. CUDA 12 계열 안에서는 “마이너 버전 호환성” 덕분에 드라이버가 조금 낮아도 대부분 동작하지만, 드라이버가 CUDA 11 세대에 머물러 있는데 PyTorch가 CUDA 12 빌드라면 is_available()이 False가 되고, 보통 아래와 비슷한 경고가 함께 출력됩니다.
UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver.
found version 11040은 드라이버가 CUDA 11.4까지 지원한다는 뜻입니다. 해결책은 메시지에 쓰인 그대로 두 가지입니다. 드라이버를 업데이트하거나, 드라이버가 지원하는 낮은 CUDA 버전으로 빌드된 PyTorch를 설치하는 것입니다. 드라이버를 올릴 수 있는 환경이라면 드라이버 업데이트가 거의 항상 나은 선택입니다. 낮은 CUDA 빌드는 언젠가 새 PyTorch 버전에서 지원이 끊기기 때문입니다.
nvidia-smi 자체가 실패하는 경우도 있습니다.
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
Failed to initialize NVML: Driver/library version mismatch
이건 PyTorch 이전의 문제입니다. 첫 번째는 드라이버 커널 모듈이 로드되지 않은 상태(우분투에서는 Secure Boot에서 MOK 등록을 안 했거나, 커널 업데이트 후 모듈이 다시 빌드되지 않은 경우가 흔합니다)이고, 두 번째는 드라이버 패키지를 업데이트한 뒤 재부팅하지 않아서 메모리에 올라간 옛 모듈과 새 라이브러리 버전이 다를 때 나옵니다. 두 번째는 재부팅으로 대부분 해결됩니다. 우분투에서 드라이버 자체를 설치하고 이런 오류를 해결하는 방법은 우분투 24.04 NVIDIA 드라이버 설치와 오류 해결에 자세히 정리해 두었습니다. nvidia-smi가 정상 출력될 때까지는 PyTorch를 다시 설치해도 소용이 없습니다.
결과 조합으로 보는 원인표
| sys.executable | torch.version.cuda | nvidia-smi | 원인 | 조치 |
|---|---|---|---|---|
| 의도와 다른 경로 | 무관 | 무관 | 다른 파이썬 환경 실행 중 | IDE/커널의 인터프리터 변경 |
| 맞음 | None / +cpu | 무관 | CPU 전용 PyTorch | CUDA 빌드로 재설치 |
| 맞음 | 값 있음 | 실패 또는 명령 없음 | 드라이버 없음/미로드 | 드라이버 설치·재부팅 |
| 맞음 | 값 있음 | 정상, CUDA Version이 더 낮음 | 드라이버가 너무 오래됨 | 드라이버 업데이트 |
| 맞음 | 값 있음 | 정상, 버전도 충분 | 환경 변수, 컨테이너, WSL 설정 등 | 아래 “그 밖의 원인” 참고 |
CUDA 툴킷을 따로 설치할 필요가 대개 없는 이유
False가 나오면 NVIDIA 홈페이지에서 CUDA Toolkit을 내려받아 설치하는 분이 많습니다. 몇 GB짜리 설치를 끝내고 다시 실행해도 결과는 그대로인 경우가 대부분인데, 이유가 있습니다.
GPU에서 CUDA 프로그램이 돌아가려면 층이 두 개 필요합니다.
- 드라이버: 운영체제 커널과 GPU 하드웨어를 연결하는 층입니다.
libcuda(윈도우는nvcuda.dll)가 여기 속합니다. 시스템에 하나만 설치되고, 반드시 시스템 수준으로 설치해야 합니다. - CUDA 런타임과 라이브러리:
cudart, cuBLAS, cuDNN 같은 라이브러리입니다. 프로그램이 실제로 호출하는 연산 코드가 여기 들어 있습니다.
PyTorch의 CUDA 빌드 휠은 두 번째 층을 휠 안에(또는 리눅스에서는 nvidia-cublas-cu12 같은 의존성 pip 패키지로) 함께 가져옵니다. 그래서 휠 하나만 설치해도 런타임과 cuDNN까지 갖춰지고, 시스템에 필요한 것은 드라이버뿐입니다. 시스템에 CUDA 툴킷 12.A를 깔아도 PyTorch는 그걸 쓰지 않고 자기가 가져온 12.B 런타임을 씁니다. torch.version.cuda가 시스템 툴킷 버전과 다르게 나오는 게 정상인 이유입니다.
시스템 CUDA 툴킷이 실제로 필요한 경우는 nvcc 컴파일러가 필요할 때입니다. 예를 들어 소스에서 CUDA 확장을 빌드하는 패키지(일부 커스텀 연산 라이브러리나 pip install 시 컴파일되는 확장)를 설치하거나, 직접 .cu 파일을 컴파일할 때입니다. 이때는 툴킷 버전을 torch.version.cuda와 같은 메이저 버전으로 맞추는 것이 안전합니다. 단순히 학습과 추론만 한다면 툴킷 없이 드라이버 + PyTorch 휠로 충분합니다.
툴킷을 이미 설치했다면 지울 필요까지는 없지만, 이로 인해 문제가 생길 수 있는 경우는 알아 두면 좋습니다. 환경 변수 LD_LIBRARY_PATH(리눅스)나 PATH(윈도우)에 툴킷 경로를 앞쪽에 넣어 두면, PyTorch가 자기 라이브러리 대신 다른 버전의 라이브러리를 먼저 집어 undefined symbol이나 DLL 로드 오류가 날 수 있습니다. 설치 가이드를 따라 이런 경로를 넣었다면, 문제가 생길 때 해당 항목을 잠시 빼고 확인해 보세요.
CUDA 빌드로 다시 설치하기
CPU 빌드가 설치된 것이 확인됐다면 재설치합니다. 핵심은 두 가지입니다. 기존 패키지를 먼저 확실히 지우는 것, 그리고 --index-url로 CUDA 빌드가 있는 인덱스를 지정하는 것입니다.
# 1. 문제가 된 그 환경을 활성화한 상태에서 기존 패키지 제거
pip uninstall -y torch torchvision torchaudio
# 2. pytorch.org 선택기에서 복사한 명령으로 설치 (cuXXX는 선택기에 나온 값으로)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cuXXX
cuXXX 부분은 일부러 비워 두었습니다. 어떤 CUDA 버전의 휠이 제공되는지는 PyTorch 버전마다 달라지므로, pytorch.org 설치 선택기에서 OS, Package(pip), Compute Platform을 고르고 나오는 명령을 그대로 복사하는 것이 가장 정확합니다. Compute Platform은 nvidia-smi의 CUDA Version 이하인 것 중에서 고르면 됩니다. 선택지가 여러 개라면 드라이버가 지원하는 범위 안에서 최신 쪽을 고르는 편이 새 GPU 지원 면에서 유리합니다.
먼저 지우는 단계를 건너뛰면 안 되는 이유가 있습니다. CPU 빌드 2.x.y가 설치된 상태에서 같은 버전의 CUDA 빌드를 설치하려 하면, pip가 “이미 같은 버전이 설치되어 있다”고 판단해 아무것도 하지 않고 끝나는 경우가 있습니다. 출력에 Requirement already satisfied가 보이면 바로 이 상황입니다. 제거 후 설치하거나 --force-reinstall을 붙이세요.
또 하나 흔한 실수는 torch만 CUDA 인덱스에서 받고 torchvision, torchaudio는 나중에 따로 pip install torchvision으로 받는 것입니다. 이러면 torchvision이 의존성으로 PyPI의 다른 torch를 끌어와 CUDA 빌드를 덮어쓸 수 있습니다. 세 패키지는 같은 명령, 같은 인덱스로 한 번에 설치하는 게 안전합니다. requirements.txt로 관리한다면 파일 맨 위에 아래처럼 인덱스를 적어 둘 수 있습니다.
--index-url https://download.pytorch.org/whl/cuXXX
torch
torchvision
다만 이렇게 하면 다른 패키지도 모두 PyTorch 인덱스에서 찾으려 하므로, 보통은 --extra-index-url로 PyPI와 함께 쓰거나 PyTorch 계열만 별도 명령으로 설치합니다. uv를 쓴다면 pyproject.toml에 PyTorch 인덱스를 지정하고 torch 계열만 그 인덱스를 쓰도록 고정하는 방식을 공식 문서가 안내하고 있습니다. 패키지 관리자별 차이는 Python pip uv poetry 비교에서 다룹니다.
설치가 끝나면 처음의 네 줄 진단 코드를 다시 실행해 torch.version.cuda에 값이 있고 is_available()이 True인지 확인합니다. 실제로 GPU에서 연산이 되는지까지 보려면 아래처럼 간단한 연산을 돌려 봅니다.
import torch
x = torch.randn(1000, 1000, device="cuda")
print((x @ x).sum().item(), torch.cuda.get_device_name(0))
우분투 24.04의 시스템 파이썬에서 가상환경 없이 pip install을 하면 error: externally-managed-environment로 막힙니다. 이 경우 --break-system-packages로 우회하지 말고 가상환경을 만들어 설치하세요. 이유와 방법은 pip install externally-managed-environment 오류 해결에 정리되어 있습니다.
conda와 pip를 섞었을 때 생기는 일
conda 환경에서는 두 개의 PyTorch가 동시에 설치되는 일이 생깁니다. conda로 PyTorch를 설치한 뒤(혹은 다른 패키지가 의존성으로 CPU용 PyTorch를 끌어온 뒤) 같은 환경에서 pip로 CUDA 빌드를 또 설치하면, conda의 패키지 목록과 pip의 패키지 목록이 각각 다른 torch를 가리키게 됩니다. 어떤 것이 import될지는 설치 순서와 파일 덮어쓰기 결과에 따라 달라지고, conda가 나중에 다른 패키지를 업데이트하면서 pip가 설치한 파일을 다시 덮어쓰기도 합니다.
확인은 이렇게 합니다.
conda list torch # conda가 관리하는 torch 관련 항목 (channel 열에 pypi로 표시되면 pip가 설치한 것)
pip list | grep torch
python -c "import torch; print(torch.__file__, torch.__version__)"
가장 깔끔한 해결은 환경을 새로 만드는 것입니다. 이미 꼬인 환경에서 하나씩 지우는 것보다 빠르고 확실합니다.
conda create -n torchgpu python=3.12 -y
conda activate torchgpu
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cuXXX
conda 환경을 만들고 PyTorch만은 pip로 설치하는 방식은 최근 PyTorch 쪽에서도 안내하는 방식입니다. PyTorch 팀은 자체 conda 채널(-c pytorch)로의 배포를 중단한다고 발표했기 때문에, 예전 글에 나오는 conda install pytorch pytorch-cuda=... -c pytorch -c nvidia 명령은 최신 버전에는 맞지 않을 수 있습니다. conda-forge에도 PyTorch 패키지가 있지만, 한 환경 안에서는 conda와 pip 중 한쪽으로만 PyTorch 계열을 관리하세요. 둘을 섞으면 같은 패키지가 서로 다른 빌드로 겹쳐 설치되어, 어느 쪽 CUDA 라이브러리가 로드되는지부터 헷갈리게 됩니다.
Python 버전도 확인해야 합니다. 갓 나온 Python 버전에는 PyTorch 휠이 아직 없을 수 있고, 이 경우 pip가 오래된 버전이나 엉뚱한 빌드를 고르거나 No matching distribution found for torch 오류가 납니다. 선택기 페이지에 지원 Python 버전이 표시되므로, 환경을 만들 때 그 범위 안의 버전을 고르세요.
WSL2에서는 드라이버를 윈도우에만 설치한다
WSL2에서 PyTorch GPU를 쓰는 구조는 일반 리눅스와 다릅니다. GPU 드라이버는 윈도우에만 설치하고, WSL 안의 우분투에는 NVIDIA 리눅스 드라이버를 설치하지 않습니다. 윈도우용 NVIDIA 드라이버가 WSL 안에 libcuda 등의 라이브러리를 노출해 주는 방식이기 때문입니다. 이 파일들은 WSL 안의 /usr/lib/wsl/lib/에 보입니다.
ls /usr/lib/wsl/lib/
# libcuda.so, libcuda.so.1, libnvidia-ml.so.1, nvidia-smi 등이 보여야 정상
nvidia-smi
여기서 흔히 저지르는 실수가 우분투에서 하던 습관대로 WSL 안에서 sudo apt install nvidia-driver-XXX나 ubuntu-drivers install을 실행하는 것입니다. WSL 안에 리눅스 드라이버 패키지를 설치하면 윈도우가 제공하는 라이브러리와 충돌해 오히려 GPU 인식이 깨질 수 있습니다. 이미 설치했다면 제거하는 것이 좋습니다.
dpkg -l | grep -i nvidia-driver
sudo apt purge 'nvidia-driver-*' # 위에서 설치된 것이 있을 때만
CUDA 툴킷이 꼭 필요한 경우(앞에서 설명한 nvcc가 필요한 경우)에도, NVIDIA 다운로드 페이지에서 일반 Ubuntu가 아니라 WSL-Ubuntu용 패키지를 고르거나, 드라이버를 포함하지 않는 cuda-toolkit 패키지만 설치해야 합니다. 일반 cuda 메타패키지는 드라이버까지 같이 끌어올 수 있습니다.
WSL2에서 nvidia-smi가 동작하지 않는다면 확인할 것은 다음과 같습니다.
- 윈도우의 NVIDIA 드라이버가 WSL 지원이 포함된 버전인가. 최근 몇 년 사이 나온 일반 GeForce/Studio 드라이버는 대부분 포함하고 있으므로, 오래된 드라이버라면 윈도우에서 업데이트합니다.
- 배포판이 WSL1이 아니라 WSL2로 실행 중인가. PowerShell에서
wsl -l -v로 VERSION 열이 2인지 봅니다. - WSL 자체가 오래된 버전은 아닌가.
wsl --update로 업데이트한 뒤wsl --shutdown으로 재시작합니다.
WSL2 설치와 버전 확인 방법은 윈도우에 WSL2 우분투 설치하기에서 자세히 다룹니다.
”no kernel image is available” 오류: GPU 아키텍처와 휠의 불일치
is_available()은 True인데 실제 연산을 하는 순간 이런 오류가 나는 경우가 있습니다.
RuntimeError: CUDA error: no kernel image is available for execution on the device
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.
그리고 import 직후나 첫 CUDA 호출 때 이런 경고가 먼저 나오기도 합니다.
UserWarning: NVIDIA GeForce ... with CUDA capability sm_XX is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_50 sm_60 ... .
이 오류는 드라이버나 설치 경로 문제가 아니라, 설치된 PyTorch 휠 안에 이 GPU용으로 컴파일된 코드가 없다는 뜻입니다. NVIDIA GPU는 세대마다 “compute capability”(sm_75, sm_86, sm_89 같은 값)가 다르고, PyTorch 휠은 빌드할 때 지원할 아키텍처 목록을 정해 그 코드만 담습니다. 목록에 없는 GPU에서는 실행할 코드가 없으니 이 오류가 납니다.
확인은 두 값을 비교하면 됩니다.
import torch
print(torch.cuda.get_device_capability(0)) # 예: (8, 6) → sm_86
print(torch.cuda.get_arch_list()) # 이 휠이 담고 있는 아키텍처 목록
이 상황이 생기는 전형적인 경우는 둘입니다.
- 아주 새로운 GPU에 오래된 휠: 새 세대 GPU가 나오면 그 아키텍처를 지원하는 휠은 보통 더 새로운 CUDA 버전 빌드에서만 제공됩니다. 오래된 PyTorch나 낮은 CUDA 버전 휠을 설치했다면 위 목록에 해당 sm 값이 없습니다. 선택기에서 최신 PyTorch와 더 높은 CUDA 버전 빌드를 고르고, 드라이버도 그에 맞게 업데이트해야 합니다.
- 아주 오래된 GPU에 최신 휠: 반대로 PyTorch는 주기적으로 오래된 아키텍처 지원을 목록에서 뺍니다. 오래된 GPU라면 최신 휠에서 지원이 빠졌을 수 있고, 이 경우 그 GPU를 지원하던 이전 PyTorch 버전을 쓰거나 소스에서 직접 빌드하는 수밖에 없습니다.
어느 버전부터 어떤 아키텍처가 추가되거나 빠졌는지는 릴리스마다 바뀌므로, 정확한 조합은 PyTorch 릴리스 노트에서 확인하시기 바랍니다. 위의 두 줄 코드가 보여 주는 실제 값이 가장 확실한 근거입니다.
오류 메시지에 나온 CUDA_LAUNCH_BLOCKING=1은 이 문제를 해결하는 설정이 아니라 디버깅용입니다. CUDA 호출은 비동기로 실행되기 때문에, 오류가 실제로 난 줄이 아니라 그 뒤의 엉뚱한 줄에서 보고되는 일이 있습니다. 이 변수를 켜면 호출을 동기로 실행해 스택트레이스가 정확해집니다. 대신 속도가 느려지므로 원인을 찾은 뒤에는 끕니다.
그 밖의 원인: 환경 변수, 컨테이너, 노트북
PyTorch도 CUDA 빌드이고 nvidia-smi도 정상인데 False라면 아래를 확인합니다.
CUDA_VISIBLE_DEVICES: 이 변수가 빈 문자열이나 -1, 존재하지 않는 번호로 설정되어 있으면 PyTorch는 GPU를 하나도 보지 못합니다. 셸 설정 파일이나 이전 실험 스크립트, Jupyter 설정에 남아 있는 경우가 있습니다.
echo "[$CUDA_VISIBLE_DEVICES]"
python -c "import os; print(repr(os.environ.get('CUDA_VISIBLE_DEVICES')))"
Docker 컨테이너: 컨테이너 안에서만 False라면 GPU가 컨테이너로 전달되지 않은 것입니다. 호스트에 NVIDIA Container Toolkit이 있어야 하고, docker run --gpus all로 실행해야 합니다. 컨테이너 안에서 nvidia-smi가 실행되는지로 먼저 확인합니다.
하이브리드 그래픽 노트북: 내장 GPU와 NVIDIA GPU가 함께 있는 노트북에서 BIOS나 제조사 유틸리티로 NVIDIA GPU를 꺼 두었거나, 우분투에서 prime-select intel로 내장 GPU 전용 모드를 선택했다면 드라이버가 GPU를 활성화하지 않습니다. prime-select query로 현재 모드를 확인할 수 있습니다.
다른 프로세스가 GPU 메모리를 모두 쓰는 경우: 이 경우는 False가 아니라 CUDA out of memory가 나오는 것이 보통이지만, 첫 초기화에 실패하는 형태로 나타나기도 합니다. nvidia-smi 아래쪽 Processes 목록에서 남아 있는 파이썬 프로세스(죽지 않은 Jupyter 커널 등)가 있는지 확인합니다.
문제가 풀린 뒤: 다음에 같은 일을 겪지 않으려면
해결한 뒤에는 그 상태를 재현할 수 있게 기록해 두는 것이 좋습니다. 같은 문제는 새 컴퓨터를 세팅하거나, 가상환경을 다시 만들거나, 다른 사람이 프로젝트를 받을 때 거의 그대로 반복됩니다.
pip freeze | grep -E '^(torch|torchvision|torchaudio)==' > torch-versions.txt
python -c "import torch; print(torch.__version__, torch.version.cuda)" >> torch-versions.txt
nvidia-smi --query-gpu=name,driver_version --format=csv,noheader >> torch-versions.txt
pip freeze가 출력하는 버전 문자열에는 +cu1XX 접미사가 포함되므로, 나중에 같은 인덱스에서 같은 빌드를 다시 받을 수 있습니다. 프로젝트 README에는 “PyTorch는 requirements.txt가 아니라 이 명령으로 먼저 설치”처럼 설치 명령 자체를 적어 두면, 다른 사람이 pip install -r requirements.txt만 하다가 CPU 빌드를 받는 일을 줄일 수 있습니다.
학습 스크립트 맨 앞에 아래처럼 한 줄을 넣어 두는 것도 도움이 됩니다. GPU를 쓸 것으로 기대한 작업이 CPU로 조용히 몇 시간씩 돌아가는 것을 막아 줍니다.
import torch
assert torch.cuda.is_available(), f"CUDA 사용 불가: torch {torch.__version__}, cuda {torch.version.cuda}"
드라이버를 업데이트할 계획이 있다면 업데이트 후 반드시 재부팅하고, nvidia-smi와 네 줄 진단 코드를 다시 실행하는 것을 습관으로 삼으세요. 드라이버 업데이트 직후의 Driver/library version mismatch는 재부팅 한 번이면 끝나는 문제인데, 그 사실을 모르면 PyTorch 재설치부터 시작하게 되기 때문입니다.