GPU-unlock: Nvidia 3000シリーズカードにおけるFP/BF16命令発行レート
GPU-unlock: FP/BF16 instruction issue rate on Nvidia 3000's cards (github.com)
要約
Nvidia GeForce RTX 3000シリーズ(GA102, GA103, GA104, GA106)において、FP/BF16命令発行レートをプロフェッショナル向け同等品に引き上げるLinuxカーネルモジュール「GPU-unlock」が公開されました。これにより、特定の演算(FP/BF16 FMA to FP32)のスループットが倍増する可能性があります。
全文翻訳
GPU unlock 1.0.0
Nvidia 3000シリーズカードのFP/BF16命令発行レートを、プロフェッショナル向け同等品にアンロックします。
このLinuxカーネルモジュールは、CMPアンロッカーのV67/PLM技術と、UEFIアプローチのプリドライバータイミングを組み合わせています。アンロックを実行し、スピードセレクター(SS0 0x88888888、BF16レート全体を選択、および4ビットSS1 0x8 IMLA4)を書き込み、未変更のNVIDIAドライバーがカードをバインドする前にFLRを実行します。これはUEFIアプリケーションでもパッチ適用されたNVIDIAドライバーでもありません。
この早期kmodドライバーの利点は、NVIDIAが新しいドライバーバージョンをリリースするたびに手動でパッチを適用する必要がないことです。
このアンロックの効果は、GA102、GA103、GA104、およびGA106カードにおけるFP/BF16 FMAからFP32演算への命令発行速度を倍増させることです。
3090 Ti dense 8192³ GEMM at 450 W, five-sample medians with FP32 accumulation:
| 入力 | 前 | 後 |
|---|---|---|
| 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内のGRUB_CMDLINE_LINUX_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を使用している場合はsudo mkinitcpio -P)。
ローカルビルド
すべてのビルドは、HTTPS経由でピン留めされたNVIDIA/CachyOS入力をダウンロードし、SHA-256をチェックし、ビルドディレクトリとバイナリパッケージのみでファームウェアを生成します。すべての3つのフォーマットは、同じmake install-*ターゲットを通じてインストールされます。パッケージはコミットされたHEADからビルドされます。
ビルド、ビルド依存関係のインストール、およびパッケージのインストールを1ステップで行います(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=で上書き可能)。make distアーカイブ、Debianソースパッケージ、および.nosrc.rpmにはNVIDIAアーカイブや生成されたファームウェアは含まれません。
ブートフローとオプトイン
パッケージはgpu_unlockとそのファームウェアをinitramfsに配置し、nvidiaがカードをバインドする前にロードします:
- mkinitcpio:
/etc/mkinitcpio.conf.d/zz-gpu-unlock.confは、MODULES内のnvidiaの直前にgpu_unlockを挿入するため、ディスプレイカードが点滅する時間は最小限になります。イメージにnvidiaがない場合、それは最後に配置され、ルートファイルシステムからロードされたnvidiaよりも前に実行されます。イメージはインストール時に再構築されます。mkinitcpioは、-c <config>またはプリセット_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 # バインドされていないすべてのGA102/GA103/GA104/GA106カード
gpu_unlock.targets=0000:21:00.0 # これらのカードのみ
gpu_unlock.targets=0000:21:00.0,0000:22:00.0 # カンマ区切り
アドレスはlspci -Dが出力する完全なPCI名(どちらのケースでも16進数)であり、GPU番号やディスプレイ役割とは無関係です。GA102/GA103/GA104/GA106カードではないエントリ(allとアドレスの混合を含む)はログに記録され、無視されます。カードは並行してアンロックされ、すべてで約1秒かかります。各カードは個別に処理されます。すでにバインドされているか電源オフのカードはスキップされます。ボードファームウェアがオンにしたままにしたバスマスキング(Supermicro X11はオプションROMとバスマスター設定に関わらずこれを実行します)は最初にクリアされます。すでにドライバーによって初期化されたカードは拒否されます。その後、nvidiaがロードされ、すべてのカードを通常通りバインドします。
ディスプレイカードも機能します。そのファームウェアフレームバッファ(ブートコンソールとPlymouth)は、アンロックのファームウェアステップが実行されている間実行され続け、カードのリセット直前に削除されます。これはnvidia-drmがしばらく後に実行することと同じです。その画面は、nvidia-drmが引き継ぐまで、そのリセットから空白になります。
ブート後に手動でモジュールをロードしても、nvidiaがバインドしたカードには何も影響しません。
RAMへのサスペンドはカードの電源をオフにするため、スピードセレクターがリセットされます。再開後、モジュールはブート時にアンロックしたすべてのカードを、nvidiaが再開する前に再度アンロックします。これは、nvidiaがカードを再開する通知の直前に実行されます(デフォルトではNVreg_UseKernelSuspendNotifiers=1、現在のドライバーではデフォルトです。nvidia-resume.serviceはさらに後に実行されます)。これにより、再開に約1秒追加されます。電源がオンのままだったカード(サスペンド・トゥ・アイドルなど)は、引き続きアンロックされ、読み取られるだけです。すでにnvidiaによって再開されたカード、または別のドライバーにバインドされているカードはそのままにされ、ログに理由が記録されます。カーネルコマンドラインにgpu_unlock.resume=0を追加するか、/sys/module/gpu_unlock/parameters/resumeに0を書き込むことで、これを無効にできます。ハイバネーションはカバーされていません。
結果を次で確認します:
journalctl -k -b | grep gpu_unlock
lspci -nnk -s 0000:21:00.0
アンロックを停止するには、カーネルコマンドラインからgpu_unlock.targets=を削除します。一度限りのブートの場合は、ブートローダーの編集画面で削除します。パッケージを削除すると、モジュールとinitramfsドロップインも削除されます。
カード上のファームウェアが停止しない場合、モジュールはそれをログに記録し、ファームウェアがまだ使用している可能性のあるDMAバッファーを次の電源オフまで保持します。再度試す前に電源をオフにしてください。
カーネルモジュールとローカルパッケージはGPL-2.0-onlyです。生成されたペイロードは、ピン留めされたCMPリファレンスに由来します。NVIDIAファームウェアは独自の条件の下で提供されます。帰属表示と通知については、firmware/NOTICE.mdおよびlicenses/を参照してください。
サポートをお願いします
より多くのGPUを購入するのを手伝ってください <3
https://buymeacoffee.com/zagitta
ETH: 0xf4eee937937f92038D70B16AbD7736D8a53a1c5c
BTC: bc1qwpkwp70fn76z3s4kg2l9y3j4kst95twcznuugf
SOL: 8Rih6HY7V4LcdjYHz4iSffT4fTniqw5CACaBigSVxNYu