> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nixl/user-guide/backend-selection/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nixl/_mcp/server.
# Backend Selection
> How to choose the right NIXL transfer backend for your memory types and use case.
## How NIXL Selects Backends
NIXL automatically selects the optimal backend based on the source and destination memory types and the backends available on both the local and remote agents. When multiple backends support a given transfer, NIXL chooses the most efficient one.
To override automatic selection, specify the desired backend when creating a transfer request. In most cases, automatic selection is the recommended approach.
In Python, backends listed in `nixl_agent_config.backends` (default: `['UCX']`) are
auto-initialized when the agent is created. In C++ and Rust, you must call
`createBackend()` / `create_backend()` explicitly for each backend you want to use.
For a detailed explanation of how backends interact with the Transfer Agent, Memory Sections, and Metadata Handler, see [Architecture and Concepts](/nixl/getting-started/architecture).
## Memory Types
NIXL provides a unified interface for registering and transferring data across five memory and storage types. Each backend supports a specific subset of these types.
| Memory Type | API Enum | Python String | Description |
|-------------|----------|---------------|-------------|
| VRAM (HBM) | `VRAM_SEG` | `"VRAM"` or `"cuda"` | GPU high-bandwidth memory |
| DRAM | `DRAM_SEG` | `"DRAM"` or `"cpu"` | Standard host memory |
| File | `FILE_SEG` | `"FILE"` | Local and remote file systems |
| Object Storage | `OBJ_SEG` | `"OBJ"` | Distributed object stores (S3, Azure Blob, DDN INFINIA) |
| Block Storage | `BLK_SEG` | `"BLOCK"` | Block-level storage devices |
For more on how memory types fit into the NIXL architecture, see the [Overview](/nixl/getting-started/overview).
## Backend Support Matrix
NIXL loads each backend as a plug-in, and each plug-in supports specific memory types and transport protocols.
| Backend |
Transfer Types |
Protocol / Technology |
| UCX |
VRAM ↔ VRAM VRAM ↔ DRAM DRAM ↔ DRAM |
RoCE, InfiniBand, TCP |
| Libfabric |
OFI (verbs, EFA, TCP providers) |
| Mooncake |
Mooncake Transfer Engine |
| UCCL-P2P |
Peer-to-peer transport |
| DOCA GPUNetIO |
DOCA GPUDirect Async |
| GDS |
VRAM ↔ File DRAM ↔ File |
GPUDirect Storage (cuFile API) |
| GDS_MT |
GPUDirect Storage (cuFile API, multi-threaded) |
| POSIX |
DRAM ↔ File |
io_uring / linux_aio / posix_aio |
| HF3FS |
3FS fuse filesystem |
| OBJ |
DRAM ↔ Object |
S3, S3_CRT, S3/RDMA |
| Azure Blob |
Azure Blob REST API |
| INFINIA |
DRAM ↔ Object VRAM ↔ Object |
DDN INFINIA Client and Async libraries |
| GUSLI |
DRAM ↔ Block |
Block I/O |
## Common Scenarios
The table below maps common scenarios to recommended backends. NIXL selects the right backend automatically if it is initialized on both agents.
| Scenario | Source | Destination | Recommended Backend | Why |
|----------|--------|-------------|--------------------|----|
| GPU-to-GPU (same or remote node) | VRAM | VRAM | UCX | RDMA-capable, supports RoCE, InfiniBand, and TCP |
| CPU-to-CPU (remote node) | DRAM | DRAM | UCX | Standard high-performance network transport |
| GPU-to-file (local NVMe) | VRAM | File | GDS / GDS_MT | GPUDirect Storage bypasses CPU bounce buffer |
| CPU-to-file | DRAM | File | POSIX | Standard filesystem I/O |
| CPU-to-S3 | DRAM | Object Storage | OBJ | S3, S3_CRT, S3/RDMA protocol support |
| GPU-to-GPU (Mooncake network) | VRAM | VRAM | Mooncake | Mooncake Transfer Engine for specialized deployments |
| GPU-to-CPU (DOCA/GPUDirect Async) | VRAM | DRAM | DOCA GPUNetIO | DOCA GPUDirect Async path on SmartNIC-equipped systems |
| Block storage I/O | Block Storage | DRAM | GUSLI | Block-level I/O operations |
| CPU-to-Azure Blob | DRAM | Object Storage | Azure Blob | Azure Blob REST API |
| CPU/GPU to DDN INFINIA | DRAM / VRAM | Object Storage | INFINIA | Asynchronous object I/O from registered host or GPU memory |
| File I/O (3FS) | File | DRAM | HF3FS | 3FS fuse-based filesystem |
When multiple backends can handle a transfer (e.g., both UCX and Libfabric support DRAM-to-VRAM),
NIXL automatically selects the most efficient one based on the available backends on both agents.
You only need to ensure the desired backends are installed and initialized.
Backend plug-ins use the Southbound API exposed by the NIXL core.
> How to choose the right NIXL transfer backend for your memory types and use case.
## Docs
- [UCX](https://docs.nvidia.com/nixl/user-guide/backend-selection/ucx.md): UCX transfer backend for high-performance VRAM and DRAM transfers via RDMA and TCP.
- [Libfabric](https://docs.nvidia.com/nixl/user-guide/backend-selection/libfabric.md): Libfabric (OFI) network backend for VRAM-to-VRAM, VRAM-to-DRAM, and DRAM-to-DRAM transfers as an alternative to UCX.
- [Mooncake](https://docs.nvidia.com/nixl/user-guide/backend-selection/mooncake.md): Mooncake Transfer Engine backend for VRAM and DRAM transfers in Mooncake-enabled deployments.
- [UCCL-P2P](https://docs.nvidia.com/nixl/user-guide/backend-selection/uccl.md): UCCL-P2P network backend for VRAM and DRAM transfers.
- [DOCA GPUNetIO](https://docs.nvidia.com/nixl/user-guide/backend-selection/gpunetio.md): DOCA GPUNetIO backend for high-performance GPU-to-GPU transfers using GPUDirect Async.
- [GDS](https://docs.nvidia.com/nixl/user-guide/backend-selection/gds.md): GPUDirect Storage backend for direct GPU-to-file transfers without CPU bounce buffers.
- [GDS_MT](https://docs.nvidia.com/nixl/user-guide/backend-selection/gds-mt.md): Multi-threaded GPUDirect Storage backend for higher throughput on parallel file operations.
- [POSIX](https://docs.nvidia.com/nixl/user-guide/backend-selection/posix.md): Standard POSIX I/O backend for DRAM-to-file transfers.
- [HF3FS](https://docs.nvidia.com/nixl/user-guide/backend-selection/hf3fs.md): HuggingFace 3FS backend for file operations on 3FS fuse-based filesystems.
- [OBJ](https://docs.nvidia.com/nixl/user-guide/backend-selection/obj.md): Object storage backend supporting S3-compatible stores with multiple executor variants.
- [Azure Blob](https://docs.nvidia.com/nixl/user-guide/backend-selection/azure-blob.md): Azure Blob Storage backend for DRAM-to-object-storage transfers via Azure REST API.
- [INFINIA](https://docs.nvidia.com/nixl/user-guide/backend-selection/infinia.md): DDN INFINIA backend for asynchronous transfers between DRAM or VRAM and object storage.
- [GUSLI](https://docs.nvidia.com/nixl/user-guide/backend-selection/gusli.md): Block-level I/O backend for transfers between block storage devices and DRAM.