Skip to main content

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.

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.29-cp314-cp314-win_amd64.whl (648.3 kB view details)

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.29-cp314-cp314-macosx_11_0_universal2.whl (574.8 kB view details)

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

tensordict_nightly-2026.7.29-cp313-cp313-win_amd64.whl (646.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.29-cp313-cp313-macosx_11_0_universal2.whl (574.6 kB view details)

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

tensordict_nightly-2026.7.29-cp312-cp312-win_amd64.whl (646.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.29-cp312-cp312-macosx_11_0_universal2.whl (574.6 kB view details)

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

tensordict_nightly-2026.7.29-cp311-cp311-win_amd64.whl (644.6 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.29-cp311-cp311-macosx_11_0_universal2.whl (573.8 kB view details)

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

tensordict_nightly-2026.7.29-cp310-cp310-win_amd64.whl (641.6 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.29-cp310-cp310-macosx_11_0_universal2.whl (571.9 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 83727f6fbc6248791389e12fd618d31f4a88ffc35841db3331b0da02a1a07a71
MD5 6fa4c5506acb576bb9c48159952ddeeb
BLAKE2b-256 c1831a5e4e12c29c0e8d9f3126b7eb9a5e6baec1a166270f9b5d4fd6a10b5e74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 31e3e3a5cb2e4ed2150caaab507d3e49333e204c58614992165f14d375fb69c5
MD5 0d48675e99e56bb47c6eeaeac5e66466
BLAKE2b-256 6ed0c28e5e87d5d6f19856f65abb21c87d7c506ee0ed0419d56b335da9178150

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 49c8c56dda7927246edb27f4215f35be02dd4ca62deaae30e3a7ca2e227cd160
MD5 24aa89c0a23c1f49c8bec09242463421
BLAKE2b-256 80bb718739ac2609f6f62bcbd09aaabde20a53830eda378d6bbef5f3e1b900b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c42621a6454218aa4204d47ad31b2dc67d2686a3f1ba71cad39ffb90ab8e785f
MD5 fa063213c6f13d38a6221f44854fafcf
BLAKE2b-256 6b1e7e0f5faf80a25059958fedd97d397857b6db6ebcdcd21a946388b5f909ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8b376226ed0eed772d1ad6a684d7fd0d2551f6fbda3940e20ce61840e7d2a50f
MD5 3d51fc9fcc1a4b231332b98dac90fbb3
BLAKE2b-256 57bc0a611c0479e19d9c46e8bcdc0ac39d3fcffb88ad8f968e570497a1013ffc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3d99e64d1d2fa6e0c5b3d388e008bf197bebf8b2a364d0c4017b65ca2f1f7fe7
MD5 c9925888245ea9f12a298eb59abd54b1
BLAKE2b-256 ff056fd6436a74c4751ac9830e65077b37f6faacdc48a154f6fb6b5eaea5f4ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1e8b409a370479234ade2e62c769406b9194151df766d0497369853463859e98
MD5 496d12b0fe0a905ff1e18f8e8bff92b8
BLAKE2b-256 bfe8a30b7c789d1f3d3424a4b668f5b234ae36303035e079c0b056ad1c12fd48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b557997eb37ec4763a17ddc464c9a97bf2265d404c79f6ec323ff60bedcfe787
MD5 c94c5164a16aadbe6936a4f61df7fa6c
BLAKE2b-256 2c57d9df4698ba79c8bd6857a26fa1b760f89b9fc054150688eb4337e71bd48c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9a1384fd8d49b69185af5c1e09b453dd97593e607d867ddc45ef23ec3e695484
MD5 0b4d44af35e3b989db11f79bbb78c102
BLAKE2b-256 46aea6609bef3335e110fc0a0407fa9ebb060b777cf06ae00b045541b2b991c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fba4d8b7b5bb8f3c16d4c2cf6442126d9fedfe206fdbd5744da3a4d6b3025faa
MD5 01b02198f7472d82a477559badd288a7
BLAKE2b-256 4092da1aaccee7e6d771b91b21ef6540df7885852c1b70ff59c253d2ec3920f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bfef66b7b536c29f4009a35017a96770f9c7dcd2fa64c759db4b3daa16e7a4b6
MD5 3671c93bccd8a26d832e6fd916ab9139
BLAKE2b-256 087c49d4de58ecb45c2388c44e2683e0deda3874b81b9b8384b26d2505d9bfcd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 cf3bfc8154a2dcaaffb18e7f0d94b1cdefa3189170a0cc7e3d93c96a627031d8
MD5 ddbbca9d860928d4542cbe3f169bc412
BLAKE2b-256 4af1c648480b12dff0c2abe79b599889b6f68243643646a68b8002299c389cd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6c1f0fa945f1b7dc0d5dfe68e2efc404ab4055b9b2e2ad37adcf494d5e96cde9
MD5 2eb3a530f9eb342f47a9036668cf0b48
BLAKE2b-256 9b174098a98aa5eea09f5460312ea7abaf6982f456a96667ecda2d0c0a20e367

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cdeb27fbcfe1089dc54576474c96fb81ca6a02a58a8bb6dd89f0698b2e7eb83d
MD5 cf89162fe5362cf2b041e65af1448b20
BLAKE2b-256 c7b0a28f26ca7e25ae2855a4a9022ad0e1943f536cfd388528dc0406a427bba7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.29-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8ac246b8119435d0e78c2acbcb2c9112177d471810af37fa1a9282afb2776da8
MD5 ea3f0d0938cfbd61044f3d18c3baf892
BLAKE2b-256 f20d3a3af5116f2a28ee2eb7a30ff0499d8fef0c022fdbf4c23cc78ad4d8774c

See more details on using hashes here.

Release history Release notifications | RSS feed

Supported by

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