Nvidia hat Warp unter Apache 2-Lizenz gestellt. Das Python-Framework dient leistungshungrigen, physikalischen Simulationen, der Datenerzeugung und dem räumlichen Rechnen. Es kompiliert Python-Funktionen just in time zu Kernel-Code, der auf x86-CPUs und CUDA-GPUs läuft.
Über die Hintergründe des Lizenzwechsels schweigt Nvidia selbst sich aus. In der Community gab es zuvor jedoch Kritik an der ursprünglich proprietären Lizenz, die zwar die Quellen offengelegt, aber sich Rechte in der Verwendung vorbehalten hatte. Die neue Lizenz ist nun anerkannt Open Source.
Beispiele für physikalische Simulationen mit Warp.
(Bild: Screenshot Nvidia)
Vergleichbar mit nativem CUDA-Code
Warp liefert spezielle Primitives für physikalische Simulationen, Sensoren, Robotik oder die geometrische Verarbeitung. Dazu zählen auch höherrangige geometrische Datenstrukturen wie Meshes, Hash Grids und Sparse Volumes für die Nutzung in der GPU. Im Gegensatz zur auf Tensor basierender Programmierung bietet Warp implizites, von Entwicklern kontrolliertes Kernel- und Threat-Management, native konditionale Logik sowie Sparse Scatter und Gather zur Vektorverarbeitung.
Die Warp-Kernel spielen Informationen im Reverse Mode zurück, um sie in Frameworks wie PyTorch, JAX, PhysicsNeMo, Nvidia Omniverse oder Paddle einzusetzen. Auch eine Verwendung in Pipelines zum Maschinenlernen ist vorgesehen. Nvidia lobt Warp auf der Webseite des Projekts damit, dass die "Simulationsgeschwindigkeit gleichwertig zu nativem CUDA-Code mit der Bequemlichkeit und Entwicklerproduktivität von Python" sei.
Warp läuft auf den Plattformen x86-64 oder ARMv8 unter Windows, Linux und macOS. Der GPU-Support erfordert CUDA-GPUs, Treiber und Grafikkarten mindestens der Serie GeForce GTX 9xx. Für Python empfiehlt Nvidia Version 3.9 und höher. Die Binaries auf PyPI sind mit CUDA 12 gebaut und benötigen CUDA-Treiber ab 525.60.13 (Linux x86-64) oder 528.33 (Windows x86-64). Die Installation erfolgt mit:
pip install warp-lang
Im Repo von Warp gibt es ein Code-Beispiel, das die Länge zufälliger 3D-Vektoren berechnet:
import warp as wp import numpy as np num_points = 1024 @wp.kernel def length(points: wp.array(dtype=wp.vec3), lengths: wp.array(dtype=float)): # thread index tid = wp.tid() # compute distance of each point from origin lengths[tid] = wp.length(points[tid]) # allocate an array of 3d points points = wp.array(np.random.rand(num_points, 3), dtype=wp.vec3) lengths = wp.zeros(num_points, dtype=float) # launch kernel wp.launch(kernel=length, dim=len(points), inputs=[points, lengths]) print(lengths)Weitere Informationen finden sich in ein paar Jupyter-Notebooks, in der Dokumentation und in Code-Beispielen.
(who)