Artificial intelligence news.
Straight from the original announcements.

IBM's Spyre AI Accelerator Becomes a Native PyTorch Device via torch-spyre

October 8, 2026, 14:45Source: PyTorch
IBM's Spyre AI Accelerator Becomes a Native PyTorch Device via torch-spyre
Image: PyTorch

IBM's torch-spyre team has detailed how Spyre, its dataflow AI accelerator, works as a native PyTorch device. According to the PyTorch blog post, the integration connects PyTorch's existing device, allocator, stream and compiler abstractions to the Spyre runtime and firmware, giving eager and compiled execution a single path.

Key points
  • torch-spyre makes Spyre a native PyTorch device through PrivateUse1, so tensor.to("spyre") works.
  • Eager and compiled execution share one path, with FX graphs staying in the Inductor compiler path.
  • Spyre has 32 cores, 2 MB scratchpad per core and up to 128 GB of LPDDR5.
  • Transfers overlap compute via separate streams linked by events, since compute operations share one queue.
  • Compiled artifacts launch as prepared recipes of typed operations over ordered queues.

What Spyre is and what the integration does

Spyre is IBM's dataflow AI accelerator, optimized for inference. According to the post, it is designed for enterprise teams running AI alongside their applications and data on IBM Z, LinuxONE and Power systems. Its reduced-precision compute suits the matrix-heavy work in language generation and embedding models.

The integration relies on PrivateUse1, which gives Spyre a real device identity inside PyTorch. Two calls rename the backend to spyre and register its device module. Together with the allocator, copy kernels and dispatcher registrations, this makes tensor.to("spyre") work and lets the dispatcher route Spyre tensors to Spyre kernels.

Tensors stay resident on device="spyre" through PyTorch allocator storage. Streams provide familiar ordering semantics, and runtime events connect dependent work across streams. FX graphs remain in the Inductor compiler path. The post says the result is one path for eager and compiled execution, lower launch overhead, and a PyTorch surface that maps cleanly onto Spyre's hardware.

Hardware constraints behind the design

The post describes a card with 32 cores connected by a high-bandwidth ring. Each core has 2 MB of local scratchpad and arrays of processing elements. Up to 128 GB of LPDDR5 holds tensors and programs. The runtime stack manages LPDDR5, while the compiler emits the loads and stores that move tiles between LPDDR5 and each core's scratchpad. Data moves in 128-byte sticks, so layout and alignment affect fetch efficiency. The runtime does not allocate or schedule the scratchpad directly.

Four constraints drive the design:

  • Data-triggered computation. A compiled Spyre kernel contains programs for multiple functional units, and progress is driven by operands becoming available. The compiler builds the device-side schedule, and the runtime submits the kernel as a complete compute operation.
  • Overlap from separate pipelines. Spyre has a compute pipeline and data-movement pipelines, so a transfer can run during computation. Independently submitted compute operations share one runtime compute queue and wait behind each other.
  • Ordered queues. Each stream completes typed operations in order. The runtime puts independent transfer and compute work on different streams and links them with an event where one consumes the other's result. Using one stream is correct but serializes the pipelines.
  • Ahead-of-time compilation against a fixed layout. The compiler can fix addresses for intermediates and temporary buffers, but tensor inputs and outputs stay symbolic because the allocator has not placed them yet. The runtime supplies those addresses at launch.

PyTorch does not talk to the card directly. torch-spyre provides the device integration, while the Spyre runtime and firmware manage device work and communication.

How PyTorch abstractions map onto the runtime

The post lays out a close correspondence between runtime needs and existing PyTorch concepts:

  • An ordered queue of typed operations maps to a stream.
  • Transfer pipelines distinct from compute map to multiple streams.
  • Cross-pipeline ordering maps to events, or edges the runtime derives.
  • Region-budgeted device memory maps to the device allocator.
  • Device-resident values map to tensor storage and its lifetime.
  • An ahead-of-time compiled program maps to the compiled artifact behind torch.compile.
  • Runtime-managed host work maps to ordered host operations associated with a stream.

Backend-specific controls live under torch.spyre, while torch.accelerator gives portable code a common interface for availability, device selection, streams, synchronization and memory reporting. Native torch.Stream(device="spyre") and torch.stream(...) work because the backend implements the device-guard hooks the framework asks for, not because it reimplemented PyTorch's stream API. Tensor lifetime is handled by reference counting: when the last reference to a Spyre tensor goes away, PyTorch calls back into the backend allocator to release or recycle the allocation.

For compilation, torch.compile(backend="inductor") keeps FX graphs in PyTorch's compiler pipeline, and the same lowering, cache and launch path can serve compiled models and registered eager operations.

Streams and prepared launch plans

The post argues that the useful mapping is not that the hardware behaves exactly like a PyTorch stream. Instead, stream-ordered work can be lowered into typed runtime operations while the runtime preserves the dependencies they require.

Program-specific work stays above the stream boundary. The framework-facing layer turns the compiled artifact into a prepared launch plan, a recipe that records the host work, data movement, device compute and synchronization needed to run it. It can carry tensor layout and symbolic argument metadata and bind launch-time values for the tensors PyTorch passes in. According to the post, once a compiled artifact exists, launch is a prepared recipe of typed operations over ordered queues rather than a graph-based runtime interface.

What it means for developers

The post frames the developer challenge as using this hardware through familiar PyTorch code while keeping up with new models and inference techniques. Efficient execution, it says, needs more than a compiler: tensors must stay on the device between operations, launches must be lightweight, and host work and transfers should overlap computation where dependencies allow. By building on community interfaces rather than a separate API, IBM's approach lets teams target Spyre with standard PyTorch device, stream and compile workflows.

Related news

Databricks beta streams Unity Catalog data directly to GPUs
For developersNovember 9, 2026, 16:00

Databricks beta streams Unity Catalog data directly to GPUs

Databricks has released UCDataset in beta on AI Runtime, a native PyTorch data loader that streams Unity Catalog tables directly to GPUs. The company says it can cut…

Google makes Pathways generally available for large-model training
For developersNovember 9, 2026

Google makes Pathways generally available for large-model training

Google has announced the general availability of Pathways on Google Cloud Platform, a distributed system it built to train large models including Gemini. Pathways uses a…

Ray Launches Special Interest Group to Shape Accelerator Support
For developersNovember 2, 2026, 18:45

Ray Launches Special Interest Group to Shape Accelerator Support

The Ray community has created a Special Interest Group (SIG) for hardware accelerators, aiming to define a shared, vendor-neutral roadmap for how Ray works with GPUs…