Through the C++ foundations, PyArrow already has support for representing non-CPU data (e.g. you can have a pyarrow.Table object backed by buffers in GPU memory), but this is not yet exposed very well in the Python bindings. Specifically, over the last years, several features were added on the C++ side (the Device and MemoryManager classes, more recently a set of Copy functions that take a target memory manager) that don't yet have equivalent bindings in PyArrow.