1%.

nvidia-smi(NVIDIA GPU 상태 확인 도구)의 사용률(util) 창에 찍힌 숫자다. 식당에 손님은 없는데 테이블마다 가방과 외투가 놓여 있어 정작 새로 온 손님이 앉지 못하는 상황과 같다. 그런데 이런 '자리만 차지한' 상태가 공유 서버나 시간당 과금되는 GPU 환경에서는 보이지 않는 심각한 비용 낭비로 이어진다.

연구자들은 종종 주피터 노트북(웹 기반 파이썬 개발 환경)에 8GB 정도의 메모리를 올려둔 채 자리를 비우곤 한다. 이때 GPU 사용률은 1%에 가깝게 낮게 나오지만, 메모리는 이미 꽉 차 있어 다른 팀원이 모델을 올리려 하면 '메모리 부족' 오류가 뜬다. 기존의 모니터링 도구들은 단순히 '연산을 안 하고 있다'는 사실만 알려줄 뿐, 누가 메모리를 붙잡고 낭비하고 있는지는 알려주지 않았다. 이 숨겨진 낭비를 찾아내기 위해 등장한 도구가 바로 GPU-Usage-Audit다.

NVIDIA 드라이버 기반의 GPU-Usage-Audit 기록 방식

공유 서버 사용자가 가장 자주 겪는 당혹감은 GPU 모니터링 도구에서 사용률 1%를 확인하고 작업을 실행했는데 곧바로 메모리 부족 오류가 뜨는 찰나의 순간이다. 누군가 주피터 노트북에 8GB의 메모리를 올려두고 자리를 비우면, 겉으로는 사용률이 낮아 보여도 실제로는 아무도 그 GPU를 쓸 수 없는 상태가 된다. GPU-Usage-Audit은 이런 보이지 않는 자원 낭비를 잡기 위해 NVIDIA 드라이버에서 직접 메트릭을 수집한다. 수집한 데이터는 SQLite라는 파일 기반 데이터베이스에 저장된다. 별도의 데이터베이스 서버를 설치할 필요 없이 파일 하나에 모든 기록을 담아두었다가 나중에 리포트로 뽑아내는 방식이다.

GPU-Usage-Audit은 사용 시간을 실제 연산 시간, 완전히 비어 있는 시간, 메모리만 점유한 idle-held 시간의 세 가지로 쪼개어 기록한다. 기존의 많은 도구는 연산을 하지 않는 모든 시간을 하나로 묶어 처리하지만, 이 도구는 메모리는 잡고 있으나 연산은 하지 않는 상태를 따로 분리한다. 식당에서 손님이 음식을 먹고 있는 시간과 테이블이 완전히 빈 시간, 그리고 손님은 없지만 가방만 놓여 있어 다른 사람이 앉지 못하는 시간을 구분하는 것과 같다. 이렇게 분리된 데이터는 잡아둔 시간을 GPU-hours라는 단위로 환산하며, 어떤 사용자가 얼마나 많은 자원을 낭비하고 있는지 정확하게 보여준다.

사용자는 uv라는 빠른 파이썬 패키지 관리자를 통해 도구를 설치하고 백그라운드에서 상시 작동하는 데몬을 실행한다.

bash
uv tool install gpu-usage-audit && gua daemon

데몬이 실행되면 NVIDIA 드라이버를 통해 GPU 상태를 주기적으로 확인하고 SQLite 파일에 기록을 쌓는다. 데이터가 충분히 쌓인 뒤 아래 명령어를 입력하면 점유 시간과 낭비 현황이 담긴 리포트를 확인할 수 있다.

bash
gua report

만약 실제 데이터가 없는 상태에서 도구의 작동 결과만 미리 확인하고 싶다면 가짜 데이터를 생성해 보여주는 데모 기능을 활용한다.

bash
gua demo

'Idle-held' 시간 추적으로 찾아내는 GPU-hours 낭비

과거에는 GPU 사용률을 확인하는 방식이 단순히 현재 가동 중인 수치에 의존했다. 엔비디아 에스엠아이(nvidia-smi, 그래픽카드 상태 확인 도구)를 실행했을 때 이용률이 1퍼센트로 표시되면 해당 자원은 사실상 비어 있다고 판단하는 것이 일반적이었다. 하지만 실제 작업 환경에서는 주피터 노트북(Jupyter Notebook, 데이터 분석용 대화형 개발 환경)에 8기가바이트의 데이터를 올려둔 채 사용자가 자리를 비우는 상황이 빈번하게 발생한다. 이 경우 그래픽카드는 물리적으로 점유된 상태를 유지하므로 다른 작업자가 해당 자원을 전혀 활용할 수 없다.

기존의 모니터링 도구들은 완전히 비어 있는 시간과 사용자가 메모리를 붙잡고 있는 시간을 하나로 묶어 처리한다. 이 과정에서 발생하는 보이지 않는 손실을 파악하기 위해 이번 도구는 GPU 사용 시간을 세 가지 범주로 세분화했다. 실제로 연산이 이루어지는 시간, 완전히 비어 있는 시간, 그리고 메모리는 점유 중이지만 연산은 수행하지 않는 아이들-헬드(idle-held) 시간이다. 특히 아이들-헬드 시간은 공유 서버나 시간당 과금제로 운영되는 클라우드 환경에서 발생하는 비용 낭비의 핵심 원인이다.

개발팀은 이렇게 잡아둔 시간을 지피유 아워스(GPU-hours, 그래픽카드 한 대를 한 시간 동안 사용하는 단위)로 환산하여 리포트로 제공한다. 단순히 전체 사용률을 보여주는 것에 그치지 않고, 유저별로 현재 어떤 작업을 실행 중이며 얼마나 오랫동안 자원을 점유하고 있는지 추적한다. 이를 통해 관리자는 특정 사용자가 자원을 독점하거나 방치하는 현황을 구체적인 수치로 확인할 수 있다. 보이지 않던 자원 점유 실태가 가시화되면서 불필요한 과금과 서버 병목 현상을 제거할 수 있는 환경이 마련된다.

사용자는 유브이(uv, 파이썬 패키지 관리 도구)를 통해 간단하게 도구를 설치하고 데몬(daemon, 백그라운드에서 실행되는 프로세스)을 구동할 수 있다. 구체적인 실행 명령어는 다음과 같다.

bash
uv tool install gpu-usage-audit && gua daemon

데이터가 충분히 쌓인 뒤에는 리포트 명령어를 통해 유저별 점유 현황을 즉시 확인할 수 있다. 만약 실제 데이터 없이 기능의 결과물을 먼저 확인하고 싶다면 데모 명령어를 사용하여 가상의 분석 데이터를 생성해 볼 수 있다. 이러한 방식은 복잡한 설정 없이도 GPU 자원의 흐름을 투명하게 관리하려는 실무 환경의 요구를 반영한다.

메모리 점유와 연산 가동률의 간극을 확인하라

여러 사용자가 하나의 서버를 공유하는 환경에서 작업자가 주피터 노트북을 띄워둔 채 퇴근하는 상황이 잦다면 이 도구를 도입할 적기다. 연산은 멈췄지만 메모리는 점유된 아이들-헬드 시간이 전체 가동 시간의 20퍼센트를 넘어서는지 먼저 확인해야 한다. 이 수치가 높다면 실제 연산 자원이 부족한 것이 아니라 자원 할당 정책이 비효율적인 상태다. 메모리만 점유하고 연산을 하지 않는 사용자를 식별해내는 것만으로도 추가 GPU 증설 없이 서버 수용 인원을 늘릴 수 있다.

데이터 저장 방식이 운영 환경의 복잡도를 결정한다

별도의 데이터베이스 서버를 구축할 인력이나 예산이 부족한 소규모 팀은 이 도구의 파일 기반 저장 방식을 활용하는 것이 유리하다. SQLite는 서버 설치 없이 파일 하나에 기록을 담으므로 별도의 유지보수 없이 즉시 모니터링을 시작할 수 있다. 다만 수십 명 이상의 사용자가 동시에 접속하는 대규모 클러스터 환경이라면 파일 쓰기 병목이 발생할 수 있으니 주의해야 한다. 소규모 개발팀이나 단일 서버 관리 환경에서 최소한의 리소스로 자원 효율을 측정하는 데 최적화된 구조다.

GPU-hours 단위로 비용과 효율을 정량화하라

관리자는 단순히 현재 사용률이 1퍼센트인지 100퍼센트인지 확인하는 수준을 넘어 유저별 GPU-hours 수치를 정기적으로 리포팅해야 한다. 특정 사용자가 자원을 독점하거나 장시간 방치하는 패턴이 반복된다면 해당 사용자에게 자원 반환을 요청하거나 자동 종료 정책을 적용할 근거가 마련된다. 가시화된 데이터는 사용자들에게 자원 절약의 필요성을 설득하는 가장 강력한 지표가 된다. 결국 보이지 않는 자원 낭비를 수치로 증명하는 것이 관리자의 가장 중요한 업무다.