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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.30-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.30-cp313-cp313-win_amd64.whl (646.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.30-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.30-cp312-cp312-win_amd64.whl (646.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.30-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.30-cp311-cp311-win_amd64.whl (644.6 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.30-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.30-cp310-cp310-win_amd64.whl (641.6 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.30-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.30-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 cce64584e9f392cad416dfc238d08251e7f2145e8d2d1f728bd8c6722fd21606
MD5 1b26c54240d2c65bcb194456f2ade210
BLAKE2b-256 73543193564ec4456eb2f1e3df9cfe27317adbfeafe995f4cbbfb85a9d9f2566

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 efb241d47d722d1bbb98277e0326eabfcfeb57116f9d450a484cca14f0a78da7
MD5 22687c477c485ba1fd0ed96b9e7494c5
BLAKE2b-256 3103d5bd896f5ed592a61089ce4d19d3ac98a4361fd64d11ba153d76a566587c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 f773d0c9ed69e77cf51c142840a4bd04ffdaeeb026de5541e2e82afc85839056
MD5 1b662745cf1e87bea9df6fb62bd8e0fe
BLAKE2b-256 3d7688153dfe6d14cf0d7d8daea728447322b61236b491d3736136141cf0a139

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 83f7f211ab238d5a7400abcb745a6d108660d11fb62f7098e81a1fdc2138ee9d
MD5 5a12da89632426ca3f8f29ecd1c70422
BLAKE2b-256 19f6341d3381b571417b17d4fdfb13b1ef9f4baa551642dad435b50a6cca87da

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 24bdab351947ce876b8794f95c59e2dfa91b908569b03e3cb2abaa7ef5d91c49
MD5 d24ed15c46896652ef5fe2c50fd33fa3
BLAKE2b-256 64112984d5f82e3f462308adca8ad2e096a2c78abc3bdff6dbb670efbe218714

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8e353d904f2f9e2eaf47d05c22f673119bafb78628849685e00c7bdbd166af6c
MD5 5e15c8c64e4c2870c41b20d6e3b0cdf7
BLAKE2b-256 abc463e40dab93c079634a1ef2d22ac76fda3e3ae146859de1985cceb15f06bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 010ad23250f9893f2a2b6a190fe192c3a16d254b9e7d715350dabd8117c4d0fe
MD5 4bf8a44882d6b92f61092eda2973b6dd
BLAKE2b-256 8070677441586f7ed520c702dda89f42b060a386c71baf8ad9a411b1e48ba85c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3cfe9b723f73a559ac0d066e608661fd238369d3ab5227fe6a479c5e5dd2344e
MD5 c3ee8dca6b14cbc782490ea726202413
BLAKE2b-256 2021ac079ff71081a82144cb34da8421043402c112c2a8656e218e59221dcf81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 fc0c20cacda3d03c718cb92f3f862c47b837e595a91997779f3e38e0776befd1
MD5 2f61b50632b014ae1fde2a2dfecaf928
BLAKE2b-256 bd1e940be7076a3ac35472c71aa664c77540d660826d7106b33762e107fbbdbe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4b747b18694c715b80ac7bffae7626aecb3223196f7f73bee9001a37ec6bf336
MD5 812df40192ccfdc92d02ea06bce4a7eb
BLAKE2b-256 869409aee32e5c88e94f6e42d15f1364078e0dfd98926b23688609a9eb57819d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e8f6917318be6585e0fa3507b2b8d90b10fc4bbd5b8a7df8532a1abd10944e94
MD5 ed6c62da4c28d0fb676b1a6d0d545ffa
BLAKE2b-256 18c336e377942ed29a6cd51d0c673f24906c503d1f1329f20028dbe825351730

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2f3cc51b564714c3be7fbd00dbbe0893a107a591e338282a00eba9c99a34d8f3
MD5 1af68e26274454dc0f65a2ec07fd9910
BLAKE2b-256 a43018c5b1a2ddfdc91cfba4d882664676a574ac3b3b1d27fc08ea7a11eca96a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f0ed65b5ffac7f2eac3fbe62ae8f8365e8e063230f316276aee52f9432574981
MD5 6cd9518af78683c1995ce0fe5626d02f
BLAKE2b-256 fce7723f41c15d297def4296a5cc38b1a0ad36eaadb1d28fb8a9cab2ef63a46f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5ad76142601ada733996ff9b2a3dc1d2601489dbd5d0c50486973211f551c358
MD5 f37099634aba46e0c4926c09dad2b6ed
BLAKE2b-256 7055e142dd6b4abe569e97c549bc4a75071bf93b5e23fbf729312310b3570bb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.30-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b24bb0925a9703c3cc34c65a185fabc34e87234a139bb75f78139ed44e1c254b
MD5 69c7e334484a68f7700de28171f0a64b
BLAKE2b-256 6b0ad500842349e7ff0f11805362d0b13c6068e455cfb70773dff56e9351c575

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