- Dieses Repository ist der Source-Release der NVIDIA Linux Open GPU Kernel Modules; laut README ist die Version 565.57.01
- Die gebauten Kernel-Module müssen zusammen mit der GSP-Firmware und den User-Space-Komponenten des NVIDIA-GPU-Treibers derselben Treiber-Release 565.57.01 verwendet werden
- Unterstützt werden x86_64 und aarch64; bei den Linux-Kernels wird derselbe Bereich wie beim proprietären NVIDIA-Kernel-Modul unterstützt, aktuell 4.15 oder neuer
- Die Kernel-Module sind in OS-unabhängige Komponenten und die Linux-Kernel-Interface-Schicht aufgeteilt; die Kernel-Interface-Schicht muss passend zum Ziel-Kernel gebaut werden
- Kompatible GPUs sind GPUs ab Turing; in der Tabelle sind mehrere GeForce-, RTX- sowie A/H/L-Serien-Produkte einschließlich der NVIDIA GeForce RTX 4090 mit PCI-IDs aufgeführt
Releases und Build-Bedingungen
- Dieses Repository ist der Source-Release der NVIDIA Linux Open GPU Kernel Modules in Version 565.57.01
- Der Standard-Build-Befehl lautet wie folgt
make modules -j$(nproc)
- Vor der Installation müssen bestehende NVIDIA-Kernel-Module entfernt werden; anschließend wird mit Root-Rechten Folgendes ausgeführt
make modules_install -j$(nproc)
- Die hier gebauten Kernel-Module benötigen die GSP-Firmware und die User-Space-Komponenten des NVIDIA-GPU-Treibers der entsprechenden Treiber-Release 565.57.01
- Als Beispiel wird gezeigt, die NVIDIA-GPU-Treiber-
.run-Datei mit der Option--no-kernel-moduleszu installieren
- Als Beispiel wird gezeigt, die NVIDIA-GPU-Treiber-
Unterstützte Architekturen und Toolchain
- Die Kernel-Module können derzeit für x86_64 oder aarch64 gebaut werden
- Beim Cross-Compiling werden zusammen mit
TARGET_ARCH=aarch64|x86_64auchCC,LD,AR,CXX,OBJCOPYin dermake-Kommandozeile angegeben - Es kann mit relativ aktuellen Versionen von GCC oder Clang gebaut werden
- Die Kernel-Interface-Schicht der Kernel-Module muss mit derselben Toolchain gebaut werden, die auch zum Bauen des Ziel-Kernels verwendet wurde
- Die unterstützten Linux-Kernel-Versionen entsprechen dem Bereich, den das proprietäre NVIDIA-Kernel-Modul unterstützt; aktuell Linux kernel 4.15 oder neuer
Build-Optionen
NV_VERBOSE=1gibt die vollständigen ausgeführten Befehle aus- Standardmäßig werden nur kurze
CC-Zeilen ausgegeben
- Standardmäßig werden nur kurze
DEBUG=1kompiliert die Kernel-Module als Debug-Build- Der Standard-Build wird ohne Debug-Informationen kompiliert
- Diese Option aktiviert außerdem verschiedene Debug-Log-Meldungen der Kernel-Module
Struktur der Kernel-Module
- Der Großteil der NVIDIA-Kernel-Module ist in zwei Komponenten aufgeteilt
- OS-agnostic-Komponente: vom Betriebssystem unabhängiger Teil
- kernel interface layer: Teil, der auf Linux-Kernel-Version und -Konfiguration spezialisiert ist
- Im NVIDIA-
.run-Installationspaket wird die OS-agnostic-Komponente als Binärdatei bereitgestellt- Diese Komponente ist groß und benötigt lange zum Kompilieren; deshalb wird eine vorgebaute Version bereitgestellt, damit Nutzer sie nicht bei jeder Treiberinstallation erneut kompilieren müssen
- Der entsprechende Komponentenname in
nvidia.koistnv-kernel.o_binary - Der entsprechende Komponentenname in
nvidia-modeset.koistnv-modeset-kernel.o_binary nvidia-drm.koundnvidia-uvm.kohaben keine OS-agnostic-Komponente
- Die Kernel-Interface-Schicht jedes Kernel-Moduls muss passend zum Ziel-Kernel gebaut werden
Verzeichnisstruktur und Nouveau-Integration
- Die wichtigsten Verzeichnisse haben folgende Aufgaben
kernel-open/: Kernel-Interface-Schichtkernel-open/nvidia/: Kernel-Interface-Schicht fürnvidia.kokernel-open/nvidia-drm/: Kernel-Interface-Schicht fürnvidia-drm.kokernel-open/nvidia-modeset/: Kernel-Interface-Schicht fürnvidia-modeset.kokernel-open/nvidia-uvm/: Kernel-Interface-Schicht fürnvidia-uvm.kosrc/: OS-agnostic-Codesrc/nvidia/: OS-agnostic-Code fürnvidia.kosrc/nvidia-modeset/: OS-agnostic-Code fürnvidia-modeset.kosrc/common/: Utility-Code, der vonnvidia.kound/odernvidia-modeset.koverwendet wirdnouveau/: Tools zur Integration mit dem Nouveau-Gerätetreiber
- Die Python-Skripte im Verzeichnis
nouveauextrahieren einige im Source-Code kodierte Firmware-Binärimages und zugehörige Daten und speichern sie als separate Dateien - Diese Dateien werden vom Nouveau-Gerätetreiber verwendet, um die GSP-Firmware zu laden und mit ihr zu kommunizieren
- Das Layout der Binärdateien ist in
nouveau_firmware_layout.odsbeschrieben; diese Datei liegt im OpenDocument-Spreadsheet-Format vor
Beiträge und Bearbeitung von Issues
- Beiträge erfolgen durch das Erstellen eines Pull Requests im NVIDIA-Repository
open-gpu-kernel-modules - Beim Einreichen eines Pull Requests ist die Zustimmung zur Contributor License Agreement erforderlich
- Diese Codebasis wird mit dem proprietären NVIDIA-Treiber geteilt; der veröffentlichte Source-Code entsteht durch mehrere Verarbeitungsschritte des gemeinsamen Codes
- Das GitHub-Repository fungiert im Wesentlichen wie ein Snapshot jeder Treiber-Release
- Eine Revision History einzelner Änderungen aus der gemeinsamen NVIDIA-Codebasis ist voraussichtlich nicht verfügbar
- Pro Treiber-Release gibt es wahrscheinlich nur einen Git-Commit
- Einzelne Beiträge werden im GitHub-Repository möglicherweise nicht als eigener Git-Commit übernommen
- Wegen der Verarbeitung vor der Veröffentlichung ist zum Übernehmen von Beiträgen in die gemeinsame Codebasis ein manuelles Merging erforderlich
- Größere Refactorings können schwer zusammenzuführen und zu übernehmen sein; daher sind vorherige Kontaktaufnahme und Abstimmung erforderlich
- Probleme im Zusammenhang mit den Open GPU Kernel Modules können über die Issues des NVIDIA-Repositorys, die NVIDIA-Entwicklerforen oder an
linux-bugs@nvidia.comgemeldet werden - Wenn eine Sicherheitslücke gefunden wird, soll das separate Dokument
SECURITY.mdkonsultiert werden
Bereich kompatibler GPUs
- Die NVIDIA Open Kernel Modules können auf GPUs ab Turing verwendet werden
- Für Details zu Funktionsunterstützung und Einschränkungen wird auf
kernel_open.htmlim NVIDIA GPU driver end user README verwiesen - Für vGPU-Unterstützung soll
README.vgpuaus dem vGPU Host Package konsultiert werden - Die Tabelle kompatibler GPUs listet Produktnamen zusammen mit PCI-IDs auf
- Wenn drei IDs vorhanden sind, ist die erste die PCI Device ID, die zweite die PCI Subsystem Vendor ID und die dritte die PCI Subsystem Device ID
- In der Tabelle sind unter anderem NVIDIA GeForce RTX 4090, NVIDIA GeForce RTX 4090 D, NVIDIA GeForce RTX 4080 SUPER, NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA H100, NVIDIA H200, NVIDIA GH200 und NVIDIA L40S aufgeführt
1 Kommentare
Meinungen auf Hacker News
Großartig. Ich hatte mich gefragt, ob das möglich ist; jetzt ist das Einzige, was einem 4x4090-System für lokale LLMs noch im Weg steht, die Zeit, es zu bauen.
Wenn Tensor-Parallelisierung funktioniert, dürfte das bei der Inferenz viel günstiger und schneller sein als H100 SXM. Allerdings verstehe ich immer noch nicht, warum tinybox sich für eine Konfiguration mit 6 GPUs entschieden hat. Viele Workloads laufen nur mit 4 oder 8 wirklich gut; so wirkt es, als zahle man derzeit für 6 und nutzt nur 4, oder landet in einer unausgewogenen Konfiguration, die nicht 8 ist.
Der Grund für 6 ist, dass es 128 PCIe-Lanes gibt, also acht x16-Ports. Wenn man einen für NVMe und einen für Netzwerk nutzt, kann man 6 GPUs als Full Fabric verbinden. Mit nur 4 würde man PCIe verschwenden, mit 8 bliebe außer ein paar USB3-Anschlüssen kaum Spielraum für externe Verbindungen.
Ziel war außerdem, ein 70B-FP16-Modell auszuführen, wofür ungefähr 140 GB VRAM benötigt werden. 6*24 GB = 144 GB, das passt also genau.
Vier NVMe-Laufwerke brauchen zum Beispiel x16-Lanes, 10G-Netzwerk noch einmal x4-Lanes.
NVIDIA SXM wurde später auf Version 3 und 4 aktualisiert, und diese Konfiguration basiert nicht einmal darauf, aber vielleicht gibt es noch einen weiteren Grund, warum 6-Way sinnvoll ist.
Das sind wirklich gute Nachrichten. Da ich in der Wissenschaft bin, kenne ich mehrere Labore, die Systeme mit mehreren 4090-Karten gebaut haben und nicht wussten, dass Nvidia P2P-Kommunikation zwischen den Karten blockiert hatte.
Das war auch einer der Gründe, warum ich keine 4090 gekauft habe, obwohl sie für meine Arbeit deutlich günstiger gewesen wäre. Das hier ist zwar kein NVLink, aber da Nvidia NVLink außerhalb der Top-Karten praktisch abgeschafft hat, ist es besser als nichts. Ende letzten Jahres habe ich ein Angebot für vier NVLink-H100 bekommen, mit 13 Monaten Lieferzeit; die Nicht-NVLink-Produkte hätte man in 4 Monaten bekommen können. Inzwischen habe ich vier L40S gekauft, um das Labor am Laufen zu halten, aber Lieferkettenprobleme und massive Preiserhöhungen machen Forschung extrem schwierig. Für sechs Doktoranden und mehrere Studierende reicht das bei Weitem nicht.
Von 2015 bis 2018 konnten wir an meiner früheren Uni Systeme mit zwei GPUs und NVLink für 5.000 Dollar pro Stück bauen und jedem Studierenden eines unter den Schreibtisch stellen; damals war es viel einfacher.
Aus Sicht eines Labors würde man wahrscheinlich jederzeit eine Karte wählen, die ein Viertel kostet, selbst wenn die MTBF nur halb so hoch ist.
Was bedeutet P2P hier? Beim Suchen sieht es nach Peer to Peer aus, aber was bedeutet das im Kontext von Grafikkarten?
https://developer.nvidia.com/gpudirect
Ich wünschte, mehr Hardware-Unternehmen würden Dokumentation veröffentlichen und den Rest die Community herausfinden lassen.
Ähnlich wie damals bei frühen IBM-VGA-Karten. Man muss nur nach „Mode X“ suchen oder nach den echten Hardware-Modi statt den BIOS-Modi, sogar 800x600x16. Leider scheinen die meisten lieber jeden Aspekt der Produktnutzung streng kontrollieren zu wollen, um mehr Geld aus ihrer Nutzerbasis herauszuholen. Persönlich denke ich, dass die produktivste Zeit des PCs auch seine offenste Zeit war.
Dann würden die Produkte schlicht teurer.
Adversarial Interoperability war weit verbreitet, und ob es den Herstellern gefiel oder nicht: Per Reverse Engineering brachte man Software zum Laufen. Was früher selten war, heute aber häufig ist, sind Software- und Hardware-Sperren. Kryptografie hätte eine Technologie sein sollen, die uns stärkt, doch am Ende wird sie eingesetzt, um uns aus unseren eigenen Maschinen auszusperren. Wir sitzen nicht mehr am Steuer. Nicht einmal das Betriebssystem betreibt das System noch wirklich. Selbst ein freies Linux-System ist in einem Konglomerat aus proprietärer Firmware und Silizium, das dem Hersteller unbekannt bleibt, nur noch ein „User OS“ und eher ein kleines Bauteil, das von der eigentlichen Funktion sandboxed wird.
Die ursprüngliche Begründung, die Nvidia für die Entfernung von NVLink aus der Consumer-Reihe anführte, war, dass PCIe 5 schnell genug sein werde.
Die 40xx-Serie kam dann aber ohne PCIe 5 und ohne P2P-Unterstützung auf den Markt. Es ist gut, dass jetzt wenigstens die Hälfte davon nachgereicht wird, aber ich kann mir kaum vorstellen, dass sie das in der Firmware der nächsten Generation weiter erlauben werden.
Ist das eine der Funktionen, die bei Consumer-Karten zur Marktsegmentierung deaktiviert wurden?
Als nicht ganz perfekte Analogie: Stell dir ein kleines Viertel mit etwa 15 Häusern vor, das gerade gebaut wird. Normalerweise stellt man an die Ecke einen 200-kVA-Transformator und bezieht aus dem Stromnetz eine angemessene Leistung. Wegen Transformatormangels installiert der Bauunternehmer aber einen kommerziellen 1250-kVA-Transformator. Er könnte viel mehr Häuser versorgen als nötig und läuft daher mit reichlich Reserve. Eines Tages will ein Bewohner eine große Plantage starten und findet heraus, wie er diese zusätzliche Trafokapazität nur für sein Haus „aktivieren“ kann. Genau dieser „Aktivierung“ entspricht das, was geohot gefunden hat
Ich war schon immer beeindruckt von George Hotz’ Hacking-Fähigkeiten. Sie haben mich auch für eigene Projekte stark inspiriert
Er hängt oft an oberflächlichen, beliebigen Problemen fest, die für einen kenntnisreicheren Engineer weniger schwierig wirken würden. Man sieht ihn auch oft wirklich schlechten oder sogar falschen Code schreiben. Die Twitter-Szenen sind ein gutes Beispiel. Trotzdem arbeitet er sich allein beharrlich durch, iteriert immer weiter und erzielt ebenso häufig erstaunliche Verbesserungen. Ein gutes Beispiel, von dem man lernen kann
Glückwunsch an geohot und alle Contributors von tinygrad/comma
Beim Überfliegen des README: Für alle, die sich fragen: Das ist nicht NVLink, sondern P2P über PCIe
In künftigen Architekturen werden sie anfangen, das in der Firmware zu sperren; solange es hält, ist es gut
Also ist es besser, es wenigstens für eine Generation nutzen zu können, als es gar nicht zu haben
Ich frage mich, ob George das selbst gemacht hat oder ob es jemand war, der auf das von tinycorp ausgesetzte Kopfgeld aus war
Und an jemanden, der sich mit dem PCI-Subsystem gut auskennt: Sieht das nicht eher so aus, als hätte NVIDIA dem keine Beachtung geschenkt, statt aktiv versucht zu haben, es zu verhindern?
Daher ist es plausibel, das Gerät so zu konfigurieren, dass der gesamte VRAM in den Adressraum eingeblendet wird. Dafür braucht es Unterstützung für resizable BAR oder eine ausreichend große BAR fester Größe. Ebenso plausibel ist es, eine Karte anzuweisen, Adressen zu lesen und zu schreiben, die auf den VRAM einer anderen Karte gemappt sind. Ich frage mich, ob die PCIe-Switching-Kapazität zum Flaschenhals wird oder eher die Punkt-zu-Punkt-Links und der VRAM. So oder so dürfte es helfen, den Roundtrip über den System-RAM zu reduzieren