- Este repositorio es la publicación del código fuente de los módulos abiertos del kernel GPU de NVIDIA para Linux, y la versión según el README es 565.57.01
- Los módulos del kernel compilados deben usarse junto con el firmware GSP y los componentes del driver NVIDIA GPU en espacio de usuario de la misma versión 565.57.01 del driver
- Los objetivos compatibles son x86_64 y aarch64, y el kernel de Linux compatible cubre el mismo rango que el módulo propietario del kernel de NVIDIA, actualmente 4.15 o superior
- Los módulos del kernel se dividen en componentes independientes del sistema operativo y una capa de interfaz del kernel de Linux, y esta capa debe compilarse para ajustarse al kernel de destino
- Las GPU compatibles son las GPU Turing o posteriores, y la tabla enumera varios productos GeForce, RTX y series A/H/L, incluyendo la NVIDIA GeForce RTX 4090, junto con sus PCI ID
Lanzamiento y condiciones de compilación
- Este repositorio es la publicación del código fuente de los NVIDIA Linux open GPU kernel modules y la versión es 565.57.01
- El comando básico de compilación es el siguiente
make modules -j$(nproc)
- Antes de la instalación se deben eliminar los módulos existentes del kernel de NVIDIA, y luego ejecutar lo siguiente con privilegios de root
make modules_install -j$(nproc)
- Los módulos del kernel compilados aquí requieren el firmware GSP y los componentes del driver NVIDIA GPU en espacio de usuario de la versión correspondiente 565.57.01 del driver
- Se presenta como ejemplo instalar el archivo
.rundel driver NVIDIA GPU con la opción--no-kernel-modules
- Se presenta como ejemplo instalar el archivo
Arquitecturas compatibles y toolchain
- Actualmente los módulos del kernel pueden compilarse para x86_64 o aarch64
- En compilación cruzada, se especifican
TARGET_ARCH=aarch64|x86_64junto conCC,LD,AR,CXX,OBJCOPYen la línea de comandos de make - Puede compilarse con versiones relativamente recientes de GCC o Clang
- La capa de interfaz del kernel de los módulos debe compilarse con el mismo toolchain usado para compilar el kernel de destino
- El rango de versiones de kernel Linux compatibles es el mismo que soporta el módulo propietario del kernel de NVIDIA, actualmente Linux kernel 4.15 o superior
Opciones de compilación
NV_VERBOSE=1imprime todos los comandos ejecutados- En la configuración predeterminada solo se muestran líneas breves de
CC
- En la configuración predeterminada solo se muestran líneas breves de
DEBUG=1compila los módulos del kernel en modo debug- La compilación predeterminada se realiza sin información de depuración
- Esta opción también activa varios mensajes de registro de depuración de los módulos del kernel
Estructura de los módulos del kernel
- La mayoría de los módulos del kernel de NVIDIA se dividen en dos componentes
- Componente OS-agnostic: parte independiente del sistema operativo
- kernel interface layer: parte específica de la versión y configuración del kernel Linux
- En el paquete de instalación
.runde NVIDIA, el componente OS-agnostic se proporciona como binario- Como este componente es grande y tarda en compilar, se proporciona una versión precompilada para que el usuario no tenga que recompilarla en cada instalación del driver
- El nombre de ese componente en
nvidia.koesnv-kernel.o_binary - El nombre de ese componente en
nvidia-modeset.koesnv-modeset-kernel.o_binary nvidia-drm.koynvidia-uvm.kono tienen componente OS-agnostic
- La capa de interfaz del kernel de cada módulo debe compilarse para ajustarse al kernel de destino
Estructura de directorios e integración con Nouveau
- Las funciones de los directorios principales son las siguientes
kernel-open/: capa de interfaz del kernelkernel-open/nvidia/: capa de interfaz del kernel paranvidia.kokernel-open/nvidia-drm/: capa de interfaz del kernel paranvidia-drm.kokernel-open/nvidia-modeset/: capa de interfaz del kernel paranvidia-modeset.kokernel-open/nvidia-uvm/: capa de interfaz del kernel paranvidia-uvm.kosrc/: código OS-agnosticsrc/nvidia/: código OS-agnostic paranvidia.kosrc/nvidia-modeset/: código OS-agnostic paranvidia-modeset.kosrc/common/: código utilitario usado por uno o más denvidia.koynvidia-modeset.konouveau/: herramientas de integración con el driver de dispositivo Nouveau
- Los scripts de Python del directorio
nouveauextraen algunas imágenes binarias de firmware codificadas en el código fuente y datos relacionados, y los guardan en archivos separados - Estos archivos se usan para que el driver de dispositivo Nouveau cargue y se comunique con el firmware GSP
- El diseño de los archivos binarios se describe en
nouveau_firmware_layout.ods, que está en formato OpenDocument Spreadsheet
Contribuciones y gestión de issues
- Las contribuciones se realizan creando pull requests en el repositorio
open-gpu-kernel-modulesde NVIDIA - Al enviar un pull request se requiere aceptar el Contributor License Agreement
- Esta base de código se comparte con el driver propietario de NVIDIA, y el código fuente público se genera aplicando varios procesos al código compartido
- El repositorio de GitHub funciona principalmente como una instantánea de cada lanzamiento del driver
- No es realista esperar un historial de revisiones de cambios individuales realizados en la base de código compartida de NVIDIA
- Es muy probable que haya solo un commit de git por cada lanzamiento del driver
- Es posible que las contribuciones individuales no se reflejen como commits separados en el repositorio de GitHub
- Debido al proceso de preparación previo a la publicación, aplicar contribuciones a la base de código compartida requiere fusión manual
- Los refactorings grandes pueden ser difíciles de fusionar y aceptar, por lo que se requiere contacto y coordinación previa
- Los problemas relacionados con Open GPU Kernel Modules pueden reportarse en los Issues del repositorio de NVIDIA, en los foros para desarrolladores de NVIDIA o a
linux-bugs@nvidia.com - Si se descubre una vulnerabilidad de seguridad, se debe consultar el documento separado
SECURITY.md
Rango de GPU compatibles
- Los módulos abiertos del kernel de NVIDIA pueden usarse en GPU Turing o posteriores
- Para los detalles de soporte de funciones y limitaciones, se indica consultar el documento
kernel_open.htmldel README para usuarios finales del driver NVIDIA GPU - El soporte de vGPU debe consultarse en
README.vgpu, incluido en el paquete vGPU Host - La tabla de GPU compatibles enumera el nombre del producto junto con el PCI ID
- Si hay tres ID, el primero es el PCI Device ID, el segundo el PCI Subsystem Vendor ID y el tercero el PCI Subsystem Device ID
- La tabla incluye varios productos como 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 y NVIDIA L40S
1 comentarios
Opiniones de Hacker News
Increíble. Me preguntaba si esto era posible; ahora lo único que impide armar un equipo 4x4090 para LLM locales es el tiempo que tome construirlo.
Si se logra la paralelización de tensores, para inferencia parece que sería mucho más barato y rápido que una H100 SXM. Aunque todavía no entiendo por qué tinybox eligió una configuración de 6 GPU. Muchas cargas solo funcionan bien con 4 u 8, y ahora parece que pagas por 6 pero usas solo 4, o quedas con una configuración intermedia que no llega a 8.
La razón por la que eligieron 6 es que hay 128 líneas PCIe, es decir, 8 puertos x16. Si usas 1 para NVMe y 1 para red, puedes conectar 6 GPU con un fabric completo. Si usas solo 4, desperdicias PCIe; si usas 8, prácticamente no queda margen para conexiones externas salvo algunos USB3.
El objetivo también era ejecutar un modelo 70B FP16, que requiere aproximadamente 140 GB de VRAM. 6*24 GB = 144 GB, así que encaja justo.
Por ejemplo, 4 NVMe requieren x16 líneas, y una red 10G necesita otras x4 líneas.
NVIDIA SXM luego se actualizó a las versiones 3 y 4, y esta configuración ni siquiera se basa en eso, pero quizá haya alguna otra razón por la que 6 vías tenga sentido.
Es una excelente noticia. Como estoy en la academia, conozco varios laboratorios que armaron equipos con varias 4090 sin saber que Nvidia había bloqueado la comunicación P2P entre tarjetas.
Esa fue una de las razones por las que no compré 4090, aunque para mi trabajo eran mucho más baratas. Esto no es NVLink, pero como Nvidia prácticamente eliminó NVLink salvo en sus tarjetas de gama más alta, es mejor que nada. A fines del año pasado pedí una cotización para 4 H100 con NVLink y el plazo de entrega era de 13 meses; los productos sin NVLink podían llegar en 4 meses. Ahora compré 4 L40S para mantener a flote el laboratorio, pero los problemas de la cadena de suministro y los enormes aumentos de precio están dificultando muchísimo la investigación. Es claramente insuficiente para apoyar a 6 doctorandos y varios estudiantes de pregrado.
En mi universidad anterior, entre 2015 y 2018, podíamos armar equipos con 2 GPU y NVLink por 5 mil dólares cada uno, y ponerle uno debajo del escritorio a cada estudiante; en esa época todo era mucho más fácil.
Desde la perspectiva de un laboratorio, creo que siempre elegiríamos una tarjeta que cueste 1/4 aunque tenga la mitad del MTBF.
¿Qué significa P2P aquí? Buscando parece ser peer to peer, pero ¿qué significa eso en el contexto de tarjetas gráficas?
https://developer.nvidia.com/gpudirect
Ojalá más empresas de hardware publicaran documentación y dejaran que la comunidad descubriera el resto.
Es parecido a lo que pasó con las primeras IBM VGA. Basta con buscar "Mode X" o los modos reales del hardware que no eran del BIOS, incluso 800x600x16. Lamentablemente, parece que la mayoría prefiere controlar estrictamente todos los aspectos del uso de sus productos para exprimir más dinero de su base de usuarios. Personalmente, creo que la época en que la PC fue más productiva también fue la época en que fue más abierta.
Entonces el precio del producto simplemente sería más alto.
La interoperabilidad adversarial era común, y mediante ingeniería inversa se hacía funcionar el software, quisiera o no el fabricante. Lo que antes era raro y ahora se volvió común es el bloqueo de software y hardware. La criptografía debería haber sido una tecnología que nos diera poder, pero terminó usándose para excluirnos de nuestras propias máquinas. Ya no estamos al volante. Ni siquiera el sistema operativo opera realmente el sistema. Incluso un sistema Linux libre, dentro de una masa hecha de firmware propietario y silicio desconocido para el fabricante, es apenas un "SO de usuario", más parecido a una pequeña pieza aislada en un sandbox respecto del funcionamiento real.
La justificación original de Nvidia al quitar NVLink de su línea de consumo fue que PCIe 5 sería lo suficientemente rápido.
Pero la serie 40xx salió sin PCIe 5 ni soporte P2P. Me alegra que al menos ahora se cumpla la mitad de eso, pero me cuesta imaginar que permitan esto también en el firmware de la próxima generación.
¿Esta es una de esas funciones desactivadas en tarjetas de consumo por segmentación de mercado?
Como analogía imperfecta, imaginemos que se está construyendo un barrio pequeño de unas 15 casas. Normalmente se pondría un transformador de 200 kVA en la esquina y se suministraría la energía adecuada desde la red. Pero por falta de transformadores, la constructora instala uno comercial de 1250 kVA. Puede alimentar muchas más casas de las necesarias, así que funciona con muchísima capacidad de sobra. Un día, un vecino quiere montar una gran operación de cultivo y descubre cómo activar solo para su casa esa capacidad sobrante del transformador. Lo que encontró geohot equivale justamente a esa “activación”
Desde hace tiempo siempre me ha impresionado la capacidad de hackeo de George Hotz. También fue una gran inspiración para mis proyectos personales
A menudo se queda trabado en problemas superficiales y arbitrarios que a un ingeniero con más conocimientos le parecerían menos difíciles. También se lo ve con frecuencia escribiendo código muy malo o incluso incorrecto. Las escenas relacionadas con Twitter son un buen ejemplo. Aun así, insistiendo solo una y otra vez, logra mejoras sorprendentes con la misma frecuencia. Es un buen ejemplo del que aprender
Felicitaciones tanto a geohot como a los colaboradores de tinygrad/comma
Mirando por encima el README, para quien tenga curiosidad: esto es P2P sobre PCIe, no NVLink
En arquitecturas futuras empezarán a bloquear esto desde el firmware, así que será bueno mientras dure
Así que es mejor poder usarlo al menos durante una generación que no tenerlo en absoluto
Me pregunto si lo hizo el propio George o si fue alguien buscando la recompensa que tinycorp había ofrecido
Y quisiera preguntarle a alguien que conozca bien el subsistema PCI: ¿no parece que esto fuera más algo a lo que NVIDIA no le prestó atención, en vez de algo que intentó bloquear activamente?
Por eso tiene sentido manipular el dispositivo para configurarlo de modo que toda la VRAM quede dentro del espacio de direcciones. Basta con que haya soporte para resizable BAR o que el BAR de tamaño fijo sea lo suficientemente grande. También tiene sentido indicarle a una tarjeta que lea y escriba direcciones mapeadas a la VRAM de otra tarjeta. Me pregunto si el cuello de botella será la capacidad de conmutación de PCIe o los enlaces punto a punto y la VRAM. En cualquier caso, reducir el viaje de ida y vuelta pasando por la RAM del sistema debería ayudar