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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.28-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.28-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b1fc391b264cc0d154f568469745654194cb7ea67e2d6a5616c3db673191c181
MD5 7412761646bb282ec7b3519e03d11956
BLAKE2b-256 9ad26b7b76d2d6fdcf51669df223172b89bafb53d6d081c7c0c4d65c9fb93fe4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5ec8badce1d71a649d52331e1c228365e16dc78e82b2c84aa48dd50467d35080
MD5 37b5fa58347d7e0ffe679656993546a6
BLAKE2b-256 251c16c523666ee12ea803542fb18dc288e53b92147767f4a0332a555d0cd133

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 7647f8f57677639f6ca96ee406c203deb88dfcf83524b9b0c20ed9a55174a66c
MD5 edd309a6fe62384050c81aa0d13115a5
BLAKE2b-256 4d0a51329e62b3f694e8cb7f2c2e3b3e0dbb38738be4da20de37a0fe5d49fb5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 292c1ae6fe5b45efaea2990cf346c913074d70ce930596ee5d8c765c74132bd8
MD5 923b0d2d48c7faffe978b5830a6573c5
BLAKE2b-256 9ac34234e865af36e11d3748b58f6beeca5718ace9fa6e5a3cbc7fb50c54793e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 586fd9cd53ea2bc7ee850fbae6155d65ab63b1339218b85b0da82ca9fe93e1b8
MD5 08a24c249d38b12d30a68fb968399118
BLAKE2b-256 6328922bebeeaad13bb5436183b68e624bda261d42ebd0291be87a9443512e5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 003b35a01e6db91a6b5ce563a9340996b24e2ae34c8d6b6f062420e3aa82c549
MD5 5c031631c93bb0c75335afb778ea4946
BLAKE2b-256 8afc5e7a4afe2c5bf53c64be3c0d38ebbed86f56e77a4fa2db0b74a53c43a711

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 23b6e5affe69f3dc3c90cd3a5dd2d62f5f901aefd2102354dda2a04bbf305b8d
MD5 59a7206cf0109b463ffb5ddd06a23ad9
BLAKE2b-256 4e3dcc16469a56f80ac23bba6f840caf80f371a799a6d3d848860bd9283c411c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 48b6c88e488c243ac9cfbd264c49c5f8e2bbc9339fb5346c7cc7b153c8f2e445
MD5 b7806de44876326f283d940795a15978
BLAKE2b-256 3c50e8ec5ed3d6a8e9232dfd69c41345b48285a33b98b0cdef01323e4f245854

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4026354b4fdfa4416a290fedb2c96edc53549e918b1c2a5f34b4379a64fe092c
MD5 2e2137fc5b540092d207f8868f3daa24
BLAKE2b-256 0a1cdbad733c8d1e3fda0036d76583e4f66b660d297fc549e116f74f3c745e8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 96e6c0efdd9536abfc6596a4e8aa22bf2df14eec0dee194ac9a1df7e07cda1d2
MD5 766c61523c78fcd471109f451e921140
BLAKE2b-256 755bdc0df819330d654e07b8fd6c112d247f5d4ff167d4fa069497eb4ac226b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f6c88769e1754575a258b0b99628c2a85f7081b1def39bc0dc4d8e92dd8e4e05
MD5 29b42e37284fa1a435a98ca3b98154c9
BLAKE2b-256 8ecd27c1ad2c360acfac16128b4b739307e471b95d8714c6b03c7d198345be25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 68a9ba7e74e2497680d2042b36edfb07ad9dfe2772c29a4b66c6748da5d3765e
MD5 7c47181027ba3a52459f24a109fc7c32
BLAKE2b-256 26293bb3816078b11b6079a2f26eed3d8e20f520c6a7ca6dda41cd7288542b16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 365846ca68fac8bc34ccbfaf77b5f69b3741f929338dd56e1561553afd99d227
MD5 11441634d215532e7502830364e907b3
BLAKE2b-256 c30145de9f3033a40812e4567a92ff14f3ecca951f1cbb57d908f2c8c6964a10

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 03703349f0a731557944c3e391cd911e7a1be948c836c5d05e617a0d8cf20082
MD5 734f1a9262d7258e26f45ba71ab7e107
BLAKE2b-256 0a6587b634a03d738b5ef7ae88ad24542c45efdc82f81d6d3014cdd3a89c4db1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.28-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 eaf80d870f5a5949cfba0ba5de1ed4f6bbf6a4e6a2280bc11cb51d0f4ad8928a
MD5 63b5db6cec16a448c94f1338db6b2ee8
BLAKE2b-256 42e7ea305ad98beff7192c233122d79e9a9113775046d89ccf0497727f9da8b3

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