최신 버전은 로컬 LLM (AI) 실행을 위한 오버클러킹 (overclocking)에 초점을 맞추었습니다. 주로 더 나은 메모리 OC (overclocking) 지원과 단일 시스템 내에서 혼합된 GPU 모델을 타겟팅하는 개선된 지원을 제공합니다. 계속 읽어보세요.
지난 9월, 저는 Linux에서 RTX 50-series 카드의 오버클러킹 (overclocking) 및 언더볼팅 (undervolting)을 위한 인체공학적 CLI 도구인 NVOC - NVIDIA GPU Overclocking for Linux에 대해 게시한 바 있습니다.
이 도구는 현재 v0.3.0 버전입니다. 멀티 GPU 지원, 기계 판독 가능 출력 (machine-readable output), 몇 가지 추가 카드 지원, 그리고 부팅 시 설정을 적용하는 깔끔한 방법을 채택했습니다.
하나 이상의 GPU
첫 번째 릴리스는 사용자가 하나의 카드를 보유하고 있으며 디바이스 0 (device 0)에서 작동한다고 가정했습니다. 멀티 카드 시스템에서 특정 GPU를 지정할 방법이 없었습니다.
이제 -d/--device 플래그가 있습니다. 가장 간단한 형태는 인덱스(index)를 받거나, 쉼표로 구분된 인덱스 목록을 받습니다:
# 카드 하나
sudo nvoc -d 1 -o 856
...
인덱스는 재부팅하여 순서가 뒤섞이기 전까지는 편리합니다. NVML은 인덱스가 고정되어 있음을 보장하지 않으므로, 재시작 후에도 유지되기를 원하는 항목에 대해서는 안정적인 요소를 선택하십시오.
개수를 세지 않고 카드 선택하기
UUID, 이름의 부분 문자열(substring), 또는 이름에 대한 정규 표현식(regex)을 사용하여 카드를 타겟팅할 수 있습니다:
# 재부팅 시에도 안정적임
sudo nvoc -d GPU-1234... -o 856
...
5090 하나와 몇 개의 5060 Ti가 있는 본체에서는, 이번 부팅에서 드라이버가 각 카드에 어떤 인덱스를 할당했는지 계산하는 것보다 name:5090을 사용하는 것이 더 쉽습니다.
nvoc list
카드를 선택하려면 먼저 기계에 무엇이 있는지 알아야 합니다. nvoc list는 읽을 수 있는 모든 GPU의 인덱스, 이름 및 UUID를 출력합니다:
$ nvoc list
0 - NVIDIA GeForce RTX 5090 - GPU-1234...
이 명령은 읽을 수 없는 장치를 만나면 오류를 내는 대신 건너뛰므로, 하나의 불안정한 카드가 전체 목록을 중단시키지 않습니다.
파이프(pipe)로 연결 가능한 출력
이제 info와 list 모두 --json 플래그를 지원하며, 이는 수동이 아닌 스크립트에서 nvoc를 구동하는 데 필요한 기능입니다:
nvoc info --json
nvoc list --json
또한 nvoc list --uuid 명령어가 있는데, 이는 한 줄에 하나씩 UUID만 출력합니다. 이 두 가지를 결합하면 아무것도 하드코딩하지 않고도 UUID를 통해 모든 카드에 동일한 설정을 적용할 수 있습니다:
for uuid in $(nvoc list --uuid); do
sudo nvoc -d "$uuid" -o 856 -m 2000 -p 105
done
(-d all은 한 번에 동일한 작업을 수행합니다. 루프는 카드마다 다른 값을 적용하고 싶을 때 유용합니다.)
RTX 50-series 전용이 아님
기존 버전은 이름을 매칭하여 카드가 RTX 50-series 부품인지 확인하는 방식으로 제한되었습니다. 이는 나태한 방식이었으며, 이름만 다를 뿐 동일한 아키텍처를 사용하는 RTX PRO Blackwell 카드들을 배제했습니다.
이제 nvoc는 NVML에 아키텍처를 직접 요청하며, Blackwell 기반이라면 무엇이든 수용하므로 워크스테이션 카드에서도 작동합니다. 다만, 여전히 Blackwell 전용입니다.
도움 요청
Ada Lovelace (RTX 4060, 4070, 4080, 4090) 및 Ampere (RTX 3050, 3060, 3070, 3080, 3090)에 대한 실험적 지원이 이미 존재하지만, 제가 가지고 있지 않은 하드웨어에서의 테스트가 필요합니다. 해당 카드 중 하나를 소유하고 계신다면, 관련 브랜치를 시도해 보고 결과를 보고해 주시면 감사하겠습니다.
초안 PR (Draft PRs): Ada Lovelace (40-series) 및 Ampere (30-series).
부팅 시 설정 적용하기
오버클러킹 (Overclock) 설정은 유지되지 않습니다. 재부팅하면 기본값(stock)으로 돌아갑니다. systemd oneshot 서비스를 사용하면 이를 자동으로 다시 적용할 수 있습니다:
# /etc/systemd/system/gpu-oc.service
[Unit]
Description=GPU overclock settings
...
sudo systemctl daemon-reload
sudo systemctl enable --now gpu-oc.service
멀티 GPU 시스템에서는 위에서 언급한 이유로 인덱스(index) 대신 UUID 또는 모델별로 지정하십시오. README에 전체 가이드가 포함되어 있습니다.
설치하기
Arch Linux를 사용 중이라면 현재 AUR에 등록되어 있습니다:
소스에서 빌드하는 방식은 여전히 cargo build --release를 통해 동일하게 작동합니다.
기타 작은 변경 사항들
reset 명령은 첫 번째 버전이 의존했던 약간 편법적인(hacky) idle-clock 트릭 대신, NVML을 통해 직접 클럭을 복구하며, 첫 번째 오류에서 중단하는 대신 모든 리셋을 시도한 후 무엇이 실패했는지 보고합니다.
--dry-run은 더 이상 루트(root) 권한이 필요하지 않습니다. 변경 사항을 미리 보는 것은 아무것도 수행하지 않으므로 권한이 필요하지 않아야 하기 때문입니다.
- v2 NVML 이름 버퍼(name buffer)로 전환한 이후, 장치 이름이 잘리는 현상이 중단되었습니다.
info 명령에서 이제 그래픽 클럭 옆에 메모리 클럭 오프셋(memory clock offset)이 표시됩니다.
- 알 수 없는 장치 오류 발생 시, 사용자가 추측하게 두는 대신
nvoc list를 안내합니다.
$ nvoc info
driver: 595.71.05
gpu 0: NVIDIA GeForce RTX 5090
...
Repo 및 이슈: https://github.com/martinstark/nvoc/