HN 日本語サマリー

← 一覧へ戻る
プログラミング

GPU-unlock: Nvidia 3000シリーズカードにおけるFP/BF16命令発行レート

GPU-unlock: FP/BF16 instruction issue rate on Nvidia 3000's cards (github.com)

220 pointsby fragebogen70 コメント

要約

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:

入力前後
FP1687.46 TFLOPS118.39 TFLOPS
BF1687.50 TFLOPS157.41 TFLOPS
TF3242.58 TFLOPS82.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