Zagitta/gpu-unlock

Your GeForce runs AI at half speed. This fixes it for 20/30/40 series cards. Up to 2× FP16 / BF16 / TF32 tensor throughput

16,802
GitHub 스타
1,683
포크
C
언어
미표기
라이선스
2026.10.29
최근 푸시
2026.10.26
별표한 날

AI 분석

설치 난이도: 보통
큐레이터 노트
NVIDIA 소비자용 GPU의 연산 처리량을 무료로 끌어올리는 실용적 사례라, GPU 워크로드 최적화나 리눅스 커널 모듈 기법을 참고할 가치가 있습니다. 다만 특정 하드웨어와 커널 설정에 의존하므로 실제 적용 전 테스트 환경에서 검증하는 것이 좋습니다.

강점

  • NVIDIA 드라이버를 패치하지 않고 커널 모듈로 조기 언락을 수행해 드라이버 업데이트 때마다 수동 패치할 필요가 없습니다.
  • 3090 Ti 기준 BF16 87.50 → 157.41 TFLOPS 등 실측 벤치마크로 효과를 구체적으로 제시합니다.
  • initramfs 통합, 배포판별 설치 타깃, PCI 주소 기반 옵트인, 서스펜드 처리까지 실제 운영을 고려한 설계가 돋보입니다.

약점

  • GA100/GA102/GA103/GA104/GA106 및 RTX 4090 등 특정 아키텍처에만 적용되며 Turing/Ada는 아직 미지원입니다.
  • Linux 전용이며 Windows는 외부 포트에 의존하고, 최대 절전 모드는 지원하지 않습니다.
  • NVIDIA 펌웨어 추출과 커널 명령줄 수정이 필요해 일반 사용자에게는 진입 장벽이 있습니다.

주의사항

  • 커널 명령줄 변경과 initramfs 재생성이 필요하므로 부팅 실패 시 복구 방법을 미리 숙지해야 합니다.
  • 펌웨어가 멈출 경우 DMA 버퍼가 다음 전원 차단까지 유지되므로 반드시 전원을 껐다가 재시도해야 합니다.
  • NVIDIA 펌웨어 라이선스와 GPL-2.0-only 조건이 별도로 적용되므로 재배포 시 고지 사항을 확인해야 합니다.

시작 가이드

  • 테스트 장비에서 `make install` 후 `gpu_unlock.targets=all`을 적용하고 벤치마크로 효과를 확인합니다.
  • 서스펜드/재개 동작과 `gpu_unlock.resume=0` 옵션을 검증합니다.
  • 지원 대상 GPU 목록과 향후 Turing/Ada 통합 계획을 추적합니다.

README 한국어 번역

이 번역은 AI가 원문 README를 옮긴 것입니다. 원문이 항상 우선합니다.

GPU unlock 1.1.0

소비자용 Nvidia 30 시리즈 카드의 FP/BF16 명령어 발행 속도를 전문가용 동급 카드 수준으로 해제합니다.

이 Linux 커널 모듈은 cmpunlocker의 V67/PLM 기법과 UEFI 방식의 드라이버 로드 전 타이밍을 결합합니다. 수정되지 않은 NVIDIA 드라이버가 카드를 바인딩하기 전에 언락을 실행하고, 속도 선택자(SS0 0x88888888 — 전체 BF16 속도를 선택, 4비트 SS1 0x8 IMLA4)를 기록하며 FLR을 수행합니다. UEFI 애플리케이션도 아니고 패치된 NVIDIA 드라이버도 아닙니다.

이처럼 이른 시점에 동작하는 kmod 드라이버의 장점은 nvidia가 새 드라이버 버전을 출시할 때마다 수동으로 패치할 필요가 없다는 것입니다.

이 언락의 효과는 GA102, GA103, GA104, GA106 카드에서 FP/BF16 FMA를 FP32 연산으로 발행하는 속도를 두 배로 높이는 것입니다.

3090 Ti dense 8192³ GEMM, 450 W, FP32 누산 기준 5회 샘플 중앙값:

입력 이전 이후
FP16 87.46 TFLOPS 118.39 TFLOPS
BF16 87.50 TFLOPS 157.41 TFLOPS
TF32 42.58 TFLOPS 82.61 TFLOPS

설치 방법

먼저 실행:

git clone https://github.com/Zagitta/gpu-unlock
cd gpu-unlock
make install

그런 다음 기존 옵션을 유지한 채 커널 명령줄에 gpu_unlock.targets=all을 추가합니다:

  • GRUB (Debian/Ubuntu/Mint): /etc/default/grub의 GRUBCMDLINELINUX_DEFAULT 안에 추가한 뒤 sudo update-grub을 실행합니다.
  • GRUB (Arch/CachyOS): 동일하게 편집한 뒤 sudo grub-mkconfig -o /boot/grub/grub.cfg를 실행합니다.
  • Fedora/RHEL: sudo grubby --update-kernel=ALL --args="gpu_unlock.targets=all"을 실행합니다.
  • systemd-boot: 부트 엔트리의 options 줄에 추가합니다(bootctl status로 위치를 확인할 수 있습니다).
  • UKI / 생성된 엔트리: /etc/kernel/cmdline에 추가하고 부트 이미지/엔트리를 다시 생성합니다(예: mkinitcpio UKI의 경우 sudo mkinitcpio -P).

FAQ

  • Q: 특정 드라이버 버전에 의존하나요? 610.43.03이 고정되어 있는 것 같습니다.
  • Q: Windows는 어떻게 되나요?
  • Q: Turing과 Ada는 어떻게 되나요?
  • Q: GPU에 손상을 주나요?
  • Q: 어떻게 도울 수 있나요?

A: 아닙니다. 드라이버는 이 언락이 의존하는 펌웨어를 추출하기 위해서만 가져옵니다. A: 저는 Windows를 사용하지 않고 유지할 계획도 없지만, https://github.com/impacifist/Windows-GPU-UNLOCK 에서 포팅을 만들어 두었습니다. 결과는 보장하지 않습니다. A: 이미 지원하는 포크가 있으며, 곧 통합할 예정입니다. A: 그럴 가능성은 매우 낮습니다. 이는 Nvidia가 데이터센터 및 전문가용 카드와 소비자용 버전을 구분하기 위해 넣어 둔 작은 제한을 해제할 뿐입니다. 이제 더 많은 연산을 하므로 GPU가 약간 더 뜨거워질 수 있지만, 표준 스로틀링과 전력 관리가 완전히 그대로 유지되므로 다운클럭되어야 합니다. A: 더 많은 GPU를 구매할 수 있도록 기부를 고려해 주세요 <3

로컬 빌드

모든 빌드는 HTTPS를 통해 NVIDIA/CachyOS 입력을 다운로드하고, 빌드 디렉터리와 바이너리 패키지에만 펌웨어를 생성합니다. 세 가지 형식 모두 동일한 make install-* 타깃으로 설치됩니다. 패키지는 커밋되지 않은 변경 사항을 포함한 작업 트리에서 빌드됩니다.

빌드, 빌드 의존성 설치, 패키지 설치를 한 번에 수행합니다(sudo 비밀번호를 묻습니다):

make install        # 배포판을 감지하고 설치 프로그램을 선택
make install-arch   # makepkg -sif
make install-deb    # apt-get build-dep, dpkg-buildpackage, apt-get install
make install-rpm    # dnf builddep, rpmbuild, dnf install

make install은 /etc/os-release(ID, 그다음 ID_LIKE)를 사용해 Arch, Debian/Ubuntu, Fedora/RHEL/CentOS 계열을 감지합니다. RPM 설치 프로그램은 DNF를 필요로 합니다. 다른 배포판의 경우 위에서 호환되는 명시적 타깃을 선택하세요.

make arch, make deb, make rpm은 빌드만 수행합니다. Debian 및 RPM 패키지는 build/deb와 build/rpm에 생성됩니다. NVIDIA 입력은 ~/.cache/gpu-unlock/inputs에 캐시됩니다(make inputs; INPUTS=로 재정의). dpkg-buildpackage 자체는 네트워크를 사용하지 않으므로, 클린 chroot 빌드(sbuild 또는 pbuilder)에서는 해당 캐시를 가리키는 GPUUNLOCKINPUTS가 필요합니다. make dist 아카이브, Debian 소스 패키지, .nosrc.rpm에는 NVIDIA 아카이브나 생성된 펌웨어가 포함되지 않습니다.

부트 흐름과 옵트인

패키지는 gpu_unlock과 그 펌웨어를 initramfs에 넣고 그곳에서 로드하여, nvidia가 카드를 바인딩하기 전에 실행되도록 합니다:

  • mkinitcpio: /etc/mkinitcpio.conf.d/zz-gpu-unlock.conf가 MODULES에서 nvidia 바로 앞에 gpuunlock을 삽입하므로, 디스플레이 카드가 비어 있는 시간이 최소화됩니다. 이미지에 nvidia가 없으면 맨 뒤에 배치되며, 루트 파일시스템에서 로드되는 nvidia보다 여전히 먼저 실행됩니다. 이미지는 설치 시 다시 빌드됩니다. mkinitcpio는 -c로 빌드된 이미지나 프리셋 config에 대해서는 드롭인을 무시하므로, 해당 설정의 MODULES에서 gpu_unlock을 nvidia 바로 앞에 직접 넣어야 합니다.
  • initramfs-tools: /usr/share/initramfs-tools/modules.d/gpu-unlock.conf.
  • dracut: /usr/lib/dracut/dracut.conf.d/gpu-unlock.conf.

initramfs-tools와 dracut의 경우, 모듈은 헤더가 있는 설치된 모든 커널용으로 빌드되며, 해당 커널의 이미지는 설치 시와 제거 시 다시 빌드됩니다. 나중에 설치된 커널은 커널 자체의 설치 훅을 통해 모듈과 새 이미지를 받습니다.

softdep nvidia pre: 규칙은 없습니다. kmod는 읽은 첫 번째 softdep nvidia 줄만 존중하므로, 다른 패키지(nvidia-utils, gddr6_hwmon)의 규칙이 이를 조용히 덮어쓰거나 그 반대가 될 수 있기 때문입니다.

이 모듈은 커널 명령줄에서 옵트인하지 않으면 아무것도 하지 않습니다:

gpu_unlock.targets=all                          # 지원되는 모든 미바인딩 카드
gpu_unlock.targets=0000:21:00.0                 # 이 카드들만
gpu_unlock.targets=0000:21:00.0,0000:22:00.0    # 쉼표로 구분

주소는 lspci -D가 출력하는 전체 PCI 이름(16진수 대소문자 무관)이며, GPU 번호나 디스플레이 역할과 무관합니다. 지원되는 레시피(GA100/GA102/GA103/GA104/GA106 또는 RTX 4090)가 아닌 항목은 all과 주소를 섞은 경우를 포함해 로그에 기록되고 무시됩니다. 카드는 동시에 언락되며, 개수와 관계없이 약 1초가 걸리고 각 카드는 독립적으로 처리됩니다. 이미 바인딩되었거나 전원이 꺼진 카드는 건너뜁니다. 보드 펌웨어가 켜 둔 버스 마스터링(Supermicro X11은 옵션 ROM 및 버스 마스터 설정과 무관하게 이렇게 함)은 먼저 해제됩니다. 어떤 드라이버가 이미 초기화한 카드는 여전히 거부됩니다. 그런 다음 nvidia가 평소처럼 로드되어 모든 카드를 바인딩합니다.

디스플레이 카드도 동작합니다. 펌웨어 프레임버퍼(부트 콘솔과 Plymouth)는 언락의 펌웨어 단계가 실행되는 동안 계속 동작하며, 카드 리셋 직전에 제거됩니다. 이는 nvidia-drm이 어차피 잠시 후 수행할 작업입니다. 화면은 해당 리셋부터 nvidia-drm이 인계받을 때까지 비어 있습니다.

부팅 후 수동으로 모듈을 로드해도 nvidia가 바인딩한 카드에는 아무 효과가 없습니다.

RAM 대기(Suspend to RAM)는 카드 전원을 끄므로 속도 선택자가 리셋됩니다. 재개 후 모듈은 부팅 시 언락했던 모든 카드를 nvidia가 재개하기 전에 다시 언락합니다. 모듈의 서스펜드 노티파이어가 nvidia가 카드를 재개하는 노티파이어보다 바로 앞서 실행되기 때문입니다(NVregUseKernelSuspendNotifiers=1, 최신 드라이버의 기본값; nvidia-resume.service는 그보다 더 늦게 실행됨). 이로 인해 재개에 약 1초가 추가됩니다. 대기 유휴(suspend to idle)처럼 전원이 유지된 카드는 여전히 언락 상태이며 읽기만 합니다. nvidia가 이미 재개했거나 다른 드라이버에 바인딩된 카드는 그대로 두고 로그에 이유를 남깁니다. 이 기능을 끄려면 커널 명령줄에 gpuunlock.resume=0을 추가하거나 /sys/module/gpu_unlock/parameters/resume에 0을 기록합니다. 최대 절전 모드는 지원하지 않습니다.

결과 확인:

journalctl -k -b | grep gpu_unlock
lspci -nnk -s 0000:[ID]:00.0

언락을 중지하려면 커널 명령줄에서 gpu_unlock.targets=를 제거합니다. 일회성 부팅의 경우 부트로더 편집 화면에서 삭제합니다. 패키지를 제거하면 모듈과 initramfs 드롭인도 제거됩니다.

카드의 펌웨어가 멈추지 않으면 모듈은 이를 로그에 기록하고, 해당 펌웨어가 여전히 사용할 수 있는 DMA 버퍼를 다음 전원 차단까지 유지합니다. 다시 시도하기 전에 전원을 끄세요.

커널 모듈과 로컬 패키징은 GPL-2.0-only입니다. 생성된 버퍼는 고정된 CMP 참조에서 파생되며, NVIDIA 펌웨어는 자체 조건을 따릅니다. 저작자 표시와 고지는 firmware/NOTICE.md와 licenses/를 참조하세요.

후원

더 많은 GPU를 구매할 수 있도록 도와주세요 <3

Github Sponsor

https://buymeacoffee.com/zagitta

ETH: 0xf4eee937937f92038D70B16AbD7736D8a53a1c5c

BTC: bc1qwpkwp70fn76z3s4kg2l9y3j4kst95twcznuugf

SOL: 8Rih6HY7V4LcdjYHz4iSffT4fTniqw5CACaBigSVxNYu

원본 저장소: Zagitta/gpu-unlock

라이선스: 미표기

게재 제외를 원하시면 삭제 요청을 보내주세요.