기본 출력 한눈에 보기
위쪽 표는 GPU별 상태, 아래쪽 표는 GPU를 쓰는 프로세스예요. GPU가 여러 장이면 위쪽 표에 GPU마다 한 칸씩 늘어나요.
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 3090 On | 00000000:01:00.0 Off | N/A |
| 45% 63C P2 285W / 350W | 18432MiB / 24576MiB | 97% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 12345 C python 18420MiB |
+-----------------------------------------------------------------------------------------+Driver Version과 CUDA Version의 뜻
맨 윗줄의 Driver Version은 설치된 드라이버 버전이에요. 옆의 CUDA Version은 설치된 CUDA Toolkit 버전이 아니라 이 드라이버가 지원하는 가장 높은 CUDA 버전이에요.
그래서 CUDA Version: 12.4로 나와도 서버에 CUDA Toolkit이 없을 수 있어요. PyTorch는 자체 CUDA 런타임을 포함하고 있어서 Toolkit 없이도 GPU를 써요. 실제로 쓰는 버전은 따로 확인하세요.
nvcc --version # 설치된 CUDA Toolkit 버전
python -c "import torch; print(torch.version.cuda)" # PyTorch가 빌드된 CUDA 버전두 명령이 보여 주는 버전이 드라이버의 CUDA Version보다 낮거나 같으면 보통 괜찮고, 높으면 GPU를 인식하지 못하는 등 문제가 생길 수 있어요. 자세한 내용은 CUDA 버전 확인하는 법을 보세요.
GPU 상태 항목의 뜻
| 항목 | 뜻과 볼 때 참고할 점 |
|---|---|
| GPU, Name | GPU 번호(0부터)와 모델명이에요. |
| Memory-Usage | 사용 중인 VRAM과 전체 VRAM이에요. 프로세스가 확보만 해 둔 메모리까지 포함해요. |
| GPU-Util | 최근 측정 구간 중 GPU에서 작업이 하나라도 실행된 시간의 비율이에요. 연산 자원을 얼마나 쓰는지를 뜻하지는 않아요. |
| Temp, Fan | GPU 온도(섭씨)와 팬 속도예요. 높은 온도가 이어지면 GPU가 스스로 클럭을 낮출 수 있어요. 서버 섀시 팬으로 식히는 GPU는 Fan이 N/A로 나와요. |
| Pwr:Usage/Cap | 현재 소비 전력과 전력 상한이에요. 상한에 닿으면 클럭이 내려갈 수 있어요. |
| Perf | 성능 상태예요. 작업 중에는 P0~P2, 쉴 때는 P8처럼 숫자가 커져요. |
| Volatile Uncorr. ECC | 드라이버가 로드된 뒤 생긴, 고칠 수 없는 메모리 오류 수예요. 0이 아니면 서버 제공자에게 알리세요. ECC를 지원하지 않는 GPU는 N/A예요. |
Persistence-M, Bus-Id, Disp.A, Compute M., MIG M.은 드라이버 모드와 연결 정보라서 평소에는 볼 일이 거의 없어요.
Memory-Usage가 높다고 바로 문제는 아니에요. PyTorch는 해제한 메모리를 캐시로 남겨 두고, vLLM은 시작할 때 GPU 메모리의 대부분을 미리 잡아요. TensorFlow도 기본 설정에서는 보이는 GPU 메모리를 거의 다 확보해요.
Processes 표 읽기
Type의 C는 CUDA 같은 계산 작업, G는 화면 출력 같은 그래픽 작업이에요. 둘 다 하면 C+G로 나와요. GI ID와 CI ID는 MIG를 쓸 때만 의미가 있어요.
필요 없는 프로세스는 PID로 종료해요. kill 12345로 안 되면 kill -9 12345로 강제 종료할 수 있는데, 저장하지 않은 결과가 사라지니 무슨 프로세스인지 먼저 확인하세요.
자주 쓰는 명령어
1초마다 갱신해서 보기
nvidia-smi -l 1 # 1초마다 전체 출력을 아래로 이어서 찍어요
watch -n 1 nvidia-smi # 화면을 지우고 같은 자리에서 갱신해요Ctrl+C로 멈춰요.필요한 값만 골라 보기
nvidia-smi --query-gpu=name,memory.used,memory.total,utilization.gpu,temperature.gpu --format=csv -l 1name, memory.used [MiB], memory.total [MiB], utilization.gpu [%], temperature.gpu
NVIDIA GeForce RTX 3090, 18432 MiB, 24576 MiB, 97 %, 63--format=csv,noheader,nounits를 쓰면 머리글과 단위가 빠져서 스크립트로 처리하기 쉬워요. 조회할 수 있는 항목 전체는 nvidia-smi --help-query-gpu로 볼 수 있어요.
GPU를 쓰는 프로세스만 보기
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv자세한 정보 보기
nvidia-smi -L # GPU 목록과 UUID
nvidia-smi -q # 모든 항목을 자세히 출력
nvidia-smi -q -d MEMORY,TEMPERATURE # 원하는 부분만 출력-d에는 MEMORY, UTILIZATION, TEMPERATURE, POWER, CLOCK, PERFORMANCE처럼 보고 싶은 부분을 쉼표로 이어서 넣어요.
GPU 사용량을 CSV 파일로 기록하기
아래 명령은 백그라운드에서 5초마다 한 줄씩 gpu-log.csv에 기록해요. 파일은 실행할 때마다 새로 쓰여요.
nohup nvidia-smi \
--query-gpu=timestamp,index,utilization.gpu,memory.used,memory.total,temperature.gpu,power.draw \
--format=csv -l 5 -f gpu-log.csv > /dev/null 2>&1 &첫 열이 timestamp라서 스프레드시트나 pandas로 바로 그래프를 그릴 수 있어요.
pkill -f "nvidia-smi --query-gpu"자주 헷갈리는 상황
컨테이너 안에서 프로세스가 안 보여요
Docker 같은 컨테이너 안에서는 메모리를 쓰고 있어도 Processes 표가 비거나 No running processes found로 나올 수 있어요. 컨테이너가 호스트와 다른 PID 공간을 쓰기 때문이에요.
이때는 ps aux | grep python으로 프로세스를 찾거나, fuser -v /dev/nvidia*로 GPU 장치를 열고 있는 프로세스를 확인하세요. fuser는 psmisc 패키지에 들어 있어요.
GPU-Util이 100%인데 느려요
GPU-Util 100%는 GPU가 쉬지 않는다는 뜻이지, 성능을 다 끌어 쓰고 있다는 뜻은 아니에요. 작은 작업이 쉬지 않고 이어지면 연산 유닛의 일부만 써도 100%로 보여요.
- 소비 전력(
Pwr:Usage/Cap)이 상한보다 한참 낮다면 연산 유닛이 덜 쓰이고 있을 가능성이 커요. 배치 크기를 키우거나 혼합 정밀도를 써 보세요. nvidia-smi -q -d PERFORMANCE로 클럭이 내려간 이유를 확인하세요. 온도나 전력 때문이라면 해당 항목이Active로 나와요.- Processes 표에서 다른 프로세스가 같은 GPU를 함께 쓰고 있지 않은지 보세요.
반대로 GPU-Util이 낮고 들쭉날쭉하다면 GPU가 데이터를 기다리는 경우가 많아요. PyTorch DataLoader의 num_workers를 늘려 보세요.
프로세스가 없는데 메모리가 잡혀 있어요
- 컨테이너 안이라서 프로세스가 안 보이는 것일 수 있어요. 위의 방법으로 확인하세요.
- Jupyter 커널이 살아 있으면 노트북 탭을 닫아도 메모리가 그대로예요. JupyterLab에서 커널을 종료하세요.
- 분산 학습이나 멀티프로세싱이 비정상 종료되면 자식 프로세스가 남아 메모리를 붙잡고 있을 수 있어요.
ps aux | grep python으로 찾아 종료하세요. - 아무 작업이 없는데 몇 MiB 정도만 쓰이는 것은 정상이에요.
메모리가 모자라서 오류가 난다면 CUDA out of memory 오류 해결하기를 보세요.
Shelf GPU 서버에서 확인하기
Shelf의 환경 템플릿은 드라이버와 개발 환경을 함께 설치해 둬서, SSH로 접속하자마자 nvidia-smi로 할당된 GPU를 확인할 수 있어요. JupyterLab에서는 터미널을 열거나 셀에서 !nvidia-smi를 실행해요.
VRAM이 모자라면 데이터를 영구 볼륨에 둔 채 더 큰 GPU 서버를 만들어 볼륨을 연결하면 돼요. 지금 빌릴 수 있는 GPU와 VRAM은 GPU 목록에서 확인하세요.
자주 묻는 질문
nvidia-smi: command not found가 나와요.
NVIDIA 드라이버가 설치되지 않았거나 경로에 없는 경우예요. Docker 컨테이너라면 NVIDIA Container Toolkit이 설치된 환경에서 docker run --gpus all처럼 GPU를 연결해 실행했는지 확인하세요.
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver 오류는 왜 나나요?
드라이버 커널 모듈이 로드되지 않았거나, 드라이버를 업데이트한 뒤 재부팅하지 않아 버전이 어긋났을 때 자주 나요. 재부팅한 뒤에도 같다면 드라이버를 다시 설치하세요.
