Skip to main content

TensorDict is a pytorch dedicated tensor container.

Project description

Docs Discord Python version GitHub license pypi version Downloads Conda (channel only)

TensorDict

TensorDict is a batched, nested dict[str, Tensor] that behaves like a tensor.

Move it, slice it, reshape it, stack it, save it, compile it, or do arithmetic on it: every tensor leaf follows the same operation, and one shared batch_size keeps the structure honest.

TensorDict(batch_size=[32])
|-- obs:      Tensor[32, 128]
|-- action:   Tensor[32]
|-- reward:   Tensor[32]
`-- next:
    `-- obs:  Tensor[32, 128]

30-second demo | Why TensorDict | What is new in 0.13 | Patterns | Installation | Ecosystem | Citation

30-second demo

import torch
from tensordict import TensorDict

batch = TensorDict(
    {
        "obs": torch.randn(32, 128),
        "action": torch.randint(0, 4, (32,)),
        "reward": torch.randn(32),
        "next": {"obs": torch.randn(32, 128)},
    },
    batch_size=[32],
)

mini = batch[:8]                 # slices every leaf
device = "cuda" if torch.cuda.is_available() else "cpu"
on_device = batch.to(device)       # moves every leaf; non-blocking internally
scaled = batch * 0.5             # arithmetic on the whole structure
merged = batch + batch           # leaf-wise TensorDict arithmetic
stacked = torch.stack([batch, batch], 0)

print(mini.shape)                # torch.Size([8])
print(stacked.shape)             # torch.Size([2, 32])

The object remains a mapping, but the batch acts like a tensor. That is the point: write the operation once, apply it to every tensor that belongs to the same example, rollout, batch, parameter set, or dataset shard.

Why TensorDict

Plain dictionaries are flexible. TensorDict keeps that flexibility and adds the parts tensor programs need once the code gets serious.

With a plain dict With TensorDict
Manually keep leading dimensions aligned One batch_size validates the structure
Repeat .to(device) for every tensor td.to(device) moves the full batch
Hand-roll slicing, stacking, reshaping td[:32], torch.stack, td.reshape
Manually recurse through nested state Nested keys are first-class
Duplicate arithmetic over leaves td + td, td * scalar, td.abs()
Invent checkpoint formats td.save, td.memmap, load_memmap
Hope generic code keeps working PyTorch-native APIs, torch.compile coverage

Use TensorDict when the unit of data is not one tensor anymore, but it should still move through your program like one tensor.

Performance is part of the API

TensorDict is not just syntax for recursive Python loops. Core paths are built for high-throughput PyTorch workloads:

  • Arithmetic dispatch: operations such as td + td, td * 0.5, td.abs() and in-place variants apply directly to leaves and use PyTorch foreach kernels where available.
  • Device and host transfers: D2H and H2D copies are dispatched across the full structure. TensorDict uses non-blocking leaf transfers internally when possible, so the common path is just td.to(device); pass non_blocking=False only when you need an explicitly synchronous transfer.
  • Shape operations without boilerplate: indexing, view, reshape, permute, unsqueeze, squeeze, flatten, unflatten, stack and cat operate on the batch structure rather than on hand-maintained lists of leaves.
  • Low-allocation workflows: lazy stacks, preallocation, memory mapping and inplace=True shape-changing operations help reduce peak memory in data-heavy pipelines.
  • Compile-aware internals: TensorDict is used in compiled training and RL loops, and the codebase carries dedicated torch.compile coverage for hot paths.

For deeper numbers, see the benchmark notes.

What is new in 0.13

TensorDict 0.13 focuses on making structured tensor programs more practical in large training systems:

  • Tabular import/export for pandas, CSV, Parquet and JSON workflows.
  • More inplace=True shape operations, including gather, repeat, repeat_interleave, roll, reshape, flatten, unflatten and contiguous.
  • Improved torch.compile behavior for TensorClass initialization, dynamic-shape export, locking paths and shallow clones.
  • Safer memmap filenames by default through robust key encoding.
  • A migration path for module state preservation with to_module(..., preserve_module_state=...).
  • CPU-only release wheels for TensorDict, avoiding duplicate GPU wheel artifacts for a package whose compiled extension is device-independent.

Patterns

One batch through the whole training step

TensorDict lets datasets, models and losses agree on one container instead of a long argument list.

for batch in dataloader:
    batch = batch.to(device)
    batch = model(batch)
    loss = loss_module(batch)

    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

That loop can stay stable while the schema changes from classification to segmentation, RL rollouts, model-based prediction or LLM post-training batches.

Nested data without custom plumbing

td = TensorDict(
    {
        "agents": {
            "policy": torch.randn(64, 8),
            "value": torch.randn(64, 1),
        },
        "env": {
            "reward": torch.randn(64),
            "done": torch.zeros(64, dtype=torch.bool),
        },
    },
    batch_size=[64],
)

policy = td["agents", "policy"]
td["env", "reward"] = td["env", "reward"].clip(-1, 1)

Nested keys are part of the API, not an afterthought.

Functional modules and parameter sets

TensorDict can hold module parameters, swap them into modules, vectorize over ensembles and make model state explicit.

from tensordict import TensorDict

params = TensorDict.from_module(module)

with params.to_module(module, preserve_module_state=True):
    out = module(inputs)

This is the same foundation used by TorchRL modules and functional training utilities.

Checkpoint and share large tensor batches

td = TensorDict({"tokens": tokens, "scores": scores}, batch_size=[n])
td.memmap("/tmp/batch")          # memory-map every leaf
reloaded = TensorDict.load_memmap("/tmp/batch")

Memory-mapped TensorDicts are useful for large offline datasets, replay buffers, inter-process handoff and checkpointed intermediate state.

Key features

  • Tensor-like collection ops: indexing, slicing, device casting, dtype casting, reshaping, stacking and concatenation. [tutorial]
  • Nested structures with tuple keys and predictable batch semantics. [tutorial]
  • Fast memory workflows: asynchronous transfers, memmap, consolidated tensors, lazy stacks and preallocation. [tutorial]
  • Functional programming with parameter TensorDicts, to_module and compatibility with torch.vmap. [tutorial]
  • @tensorclass: a tensor-aware dataclass for structured tensor objects. [tutorial]
  • Distributed and multiprocessed pipelines across workers, devices and machines. [doc]
  • Serialization and memory mapping for efficient checkpointing and dataset storage. [doc]

For a longer tour, start with GETTING_STARTED.md or the online documentation.

Installation

With pip:

pip install tensordict

With conda:

conda install -c conda-forge tensordict

Nightly builds:

pip install tensordict-nightly

From source with an existing PyTorch install:

pip install -e . --no-deps

If you use uv with PyTorch nightlies, keep torch pinned to the PyTorch wheel index or install TensorDict with --no-deps so the resolver does not replace your existing PyTorch build:

uv pip install -e . --no-deps
uv pip install -e . --prerelease=allow -f "https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html"

Ecosystem

TensorDict started in reinforcement learning, where batches quickly become nested trajectories. It is now used anywhere tensor batches are structured data: RL rollouts, LLM post-training samples, robotics trajectories, simulation state, model parameters, checkpointed datasets and scientific pipelines.

Domain Projects
Reinforcement Learning TorchRL (PyTorch), DreamerV3-torch, Dreamer4, SkyRL
LLM Post-Training verl, ROLL (Alibaba), LMFlow, LoongFlow (Baidu)
Robotics and Simulation MuJoCo Playground (Google DeepMind), ProtoMotions (NVIDIA), holosoma (Amazon)
Physics and Scientific ML PhysicsNeMo (NVIDIA)
Genomics Medaka (Oxford Nanopore)

Citation

If you use TensorDict, please cite the TorchRL paper:

@misc{bou2023torchrl,
      title={TorchRL: A data-driven decision-making library for PyTorch},
      author={Albert Bou and Matteo Bettini and Sebastian Dittert and Vikash Kumar and Shagun Sodhani and Xiaomeng Yang and Gianni De Fabritiis and Vincent Moens},
      year={2023},
      eprint={2306.00577},
      archivePrefix={arXiv},
      primaryClass={cs.LG}
}

License

TensorDict is licensed under the MIT License. See LICENSE for details.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tensordict_nightly-2026.7.20-cp314-cp314-win_amd64.whl (642.3 kB view details)

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.20-cp314-cp314-macosx_11_0_universal2.whl (568.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ universal2 (ARM64, x86-64)

tensordict_nightly-2026.7.20-cp313-cp313-win_amd64.whl (640.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.20-cp313-cp313-macosx_11_0_universal2.whl (568.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ universal2 (ARM64, x86-64)

tensordict_nightly-2026.7.20-cp312-cp312-win_amd64.whl (640.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.20-cp312-cp312-macosx_11_0_universal2.whl (568.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ universal2 (ARM64, x86-64)

tensordict_nightly-2026.7.20-cp311-cp311-win_amd64.whl (638.6 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.20-cp311-cp311-macosx_11_0_universal2.whl (567.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ universal2 (ARM64, x86-64)

tensordict_nightly-2026.7.20-cp310-cp310-win_amd64.whl (635.6 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.20-cp310-cp310-macosx_11_0_universal2.whl (565.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ universal2 (ARM64, x86-64)

File details

Details for the file tensordict_nightly-2026.7.20-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 4457f5a2b0bc281d4c09b60433f9c553516f277c1a606ec29ee484edaa65161f
MD5 11ec1992d112813ee1b4e8ba081df377
BLAKE2b-256 1a9d7040013bb1d3e31a5493eb4ed5e9eca310fa1eec249fe7563b26e6bb8bd8

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp314-cp314-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 01e1e56688bf54c45ea4fa200e54b44a1fb3d95f73b7b0da67436bbd737e5f1d
MD5 ab071053b85ebf36ada0f62d26018259
BLAKE2b-256 67194e0a4b15bd27eff630a0684740cf4505e6160f35e0f8a724265b42a75803

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp314-cp314-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3629770750c1693486c45c5152dd0782f436eb8e6701928f449a63a2e53b06e3
MD5 d47e8b41885ec174c089a46bf72d1316
BLAKE2b-256 9376f72654216d5cbb14d546d1072c80fdfdae30dfaeee498c4ddba1b3b5509d

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e5abfbc39c2d483a597ccca03cb989b484785c18ca1733aaabdaefbd5e5be81a
MD5 869afc568055b4c839695d49e7cfb651
BLAKE2b-256 48b6e61fca3b1c93be32a189dcb3f50e031344c6fec7fc4a9b042a7262fb46bb

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp313-cp313-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0ff098e08e69fdd3d4945408db4c0805dbcb8f3086e73a84f723004fc9f3f836
MD5 269643ac5c9ab4dbfcadd2b986239405
BLAKE2b-256 f8a641a0c80a754eb4d8f206e7ff796df9c3e66bac76c8b910e344e3b9e8ccef

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp313-cp313-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6b77c6c3c0ee8b3cf64bdcf3124159e265d7c28f29a8b1c06f96bcb4bc0cd121
MD5 ad301909721c3c77a40b548ed9a30966
BLAKE2b-256 f86d7e56854d43a53dde922d4484c5b09b51a5553f0e02c2e53f3e68cdeb16a2

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3c873ad86a5b6d40fe857e9a2c42e443e0b1bcbce81270d211662e697277011f
MD5 3c5ec98cc9fb42970063bc93d3feabde
BLAKE2b-256 ed9de4390d88d4231d260d3b65fcceedddd333ee5e87801f3ab7b15373e0e75a

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp312-cp312-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4563eb669ed64396f7f9be5008f866133653c302abfa04422436dc7b90a70dc3
MD5 b3b8816689d75e1495bd8eb6030b63b9
BLAKE2b-256 bf494af68e470eebe285f6c59f332cae4ea0848f2e5327bb9143b0f8116ca6a9

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp312-cp312-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6fa1efd4a932bd461dad733416df89441eca96f583e8d17be1fb9f238ca8dd82
MD5 85ff81b347f341156fd28b2d82156367
BLAKE2b-256 055378b2c30c5f2deee5ba3a9f107f7ed6ee3859e6ae1f7ccdfca87df75e7f1d

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 22aff10c71b6e9563bf67589277b61c8964a5d5d0b9c4624269aebc89aa46c0f
MD5 f3120ac7c5928b2b39f1ae01e1ee5a6f
BLAKE2b-256 06983f6a2ccff2412d8c00284277662d1d5da5e55bd18b1e584fe382819a2782

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp311-cp311-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3797475f584afaf9ced649607f3854ab854f572bba140b00f6aa8d16aecd06b2
MD5 10fc7fa281ab8b1269d29f24db23c936
BLAKE2b-256 edd3bf7644ce84bcfaa35d83bd53ff011be1191c7762a6093bdebc51d631258e

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp311-cp311-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 588f0b942af67cc750e8f7c6c39d0fbb303146e88774f5579b312b2c54708bde
MD5 cdc9d6d026cdc403e5405f8bb30ead72
BLAKE2b-256 5f07ab238d78c08293f098e4ebb1a4fd1b64dddaacd5c1e631882a431d00a57c

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d5e9800c7f32f0ada72c3eae447b1f07b4cb7d44989e45d29ec9e0b392b452de
MD5 5e612d4c282fb2438cd39e3dfdaf7943
BLAKE2b-256 3e60f7020c08ef2bd49dcad3f9d8c3d6a5d9694409e65a5400cd9d776724d141

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp310-cp310-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2a91871caa7f7770619390c99e71961f001c688ca09c2d84da66602d5835edb0
MD5 f8efb03a362beab340d8ba46ca643e9a
BLAKE2b-256 ae827e5c27fdcec8dc715364cc210824f7ff4dbb746b4401224a414671f612ac

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.7.20-cp310-cp310-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.20-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b2eb10511eb28aa14bd96125f28117b88dffdefb865a8d9b6b4edef1be35cd44
MD5 2220df36f997d926e43d698309efeb22
BLAKE2b-256 8a26bbae5e08c5826c55692ee0d992076465ddadb05296b6708b4f7b78d614f8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page