Your GeForce runs AI at half speed. This fixes it for 20/30/40 series cards. Up to 2× FP16 / BF16 / TF32 tensor throughput
이 번역은 AI가 원문 README를 옮긴 것입니다. 원문이 항상 우선합니다.
소비자용 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을 추가합니다:
/etc/default/grub의 GRUBCMDLINELINUX_DEFAULT 안에 추가한 뒤 sudo update-grub을 실행합니다.sudo grub-mkconfig -o /boot/grub/grub.cfg를 실행합니다.sudo grubby --update-kernel=ALL --args="gpu_unlock.targets=all"을 실행합니다.options 줄에 추가합니다(bootctl status로 위치를 확인할 수 있습니다)./etc/kernel/cmdline에 추가하고 부트 이미지/엔트리를 다시 생성합니다(예: mkinitcpio UKI의 경우 sudo mkinitcpio -P).610.43.03이 고정되어 있는 것 같습니다.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가 카드를 바인딩하기 전에 실행되도록 합니다:
/etc/mkinitcpio.conf.d/zz-gpu-unlock.conf가 MODULES에서 nvidia 바로 앞에 gpuunlock을 삽입하므로, 디스플레이 카드가 비어 있는 시간이 최소화됩니다. 이미지에 nvidia가 없으면 맨 뒤에 배치되며, 루트 파일시스템에서 로드되는 nvidia보다 여전히 먼저 실행됩니다. 이미지는 설치 시 다시 빌드됩니다. mkinitcpio는 -c로 빌드된 이미지나 프리셋 config에 대해서는 드롭인을 무시하므로, 해당 설정의 MODULES에서 gpu_unlock을 nvidia 바로 앞에 직접 넣어야 합니다./usr/share/initramfs-tools/modules.d/gpu-unlock.conf./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