Spyre ist ein auf Inferenz ausgelegter KI-Beschleuniger von IBM. Die Anbindung an PyTorch nutzt dessen vorhandene Schnittstellen für Geräte, Speicherverwaltung, Streams und Compiler. Über PrivateUse1 erhält Spyre eine eigene Geräteidentität; mit dem PyTorch-Allocator verwaltete Tensoren können auf dem Gerät mit dem Bezeichner „spyre“ liegen. FX-Graphen bleiben im Compilerpfad von Inductor. Die Integration soll sowohl eager als auch kompilierte Ausführung über denselben Weg ermöglichen und den Aufwand beim Starten von Programmen senken.
Die Hardware arbeitet mit 32 Kernen, die über einen Ring mit hoher Bandbreite verbunden sind. Jeder Kern verfügt über 2 MB lokalen Scratchpad-Speicher. Für Tensoren und Programme stehen bis zu 128 GB LPDDR5 zur Verfügung. Die Laufzeitumgebung verwaltet diesen LPDDR5-Speicher; der Compiler plant bereits vor der Ausführung, wie Daten zwischen LPDDR5 und den Scratchpads bewegt werden. Übertragen wird in Einheiten von 128 Byte, weshalb Layout und Ausrichtung für den Zugriff eine Rolle spielen.
Ein kompiliertes Spyre-Programm besteht aus Abläufen für verschiedene Funktionseinheiten, darunter Verarbeitungselemente sowie Einheiten für Spezialfunktionen und Speicherzugriffe. Die Hardware führt diese anhand verfügbarer Operanden aus. Zur Laufzeit wird das Programm als zusammenhängende Rechenoperation mit seinen Tensorargumenten eingereiht. Mehrere Rechenoperationen können dabei nicht gleichzeitig über die Laufzeit gestartet werden: Sie teilen sich eine Rechenwarteschlange und werden nacheinander abgearbeitet.
Überlappung ist laut PyTorch stattdessen zwischen Rechnen und Datenbewegung möglich. Streams führen ihre jeweiligen Arbeitsschritte geordnet aus; Ereignisse verbinden getrennte Streams, wenn eine Operation auf das Ergebnis einer anderen angewiesen ist. Werden Transfers und Berechnungen in getrennte Streams gelegt, können die entsprechenden Pipelines parallel arbeiten. Bleibt alles in einem Stream, laufen sie nacheinander. Kompilierte Programme setzen außerdem ein festgelegtes Datenlayout voraus. Adressen für Eingabe- und Ausgabetensoren bleiben zunächst offen, weil der Allocator sie erst zur Laufzeit bestimmt.
