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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.8.3-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.8.3-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 5bd2739f9244229f0c9f4c164594915fe8da495d92208236cda8b9c7fe6ab71b
MD5 987fe740a0f40cf0876dd877380bb2d7
BLAKE2b-256 77ad7947d1cb172881942f72f09ebd1b57b10386b3cecd773f9815e7fd6e8f92

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 065106cbb633e34a21f574d5b8958058679f46e0bcdd9026e54f03965c02e5d3
MD5 e9b449d44fcb8d38c938b8bfd0dc51cc
BLAKE2b-256 41716067d269ad46014c9813390c69b969ae318e7299decba8451ef07b54f5d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 97597ed6eaf1492a5f989acc593a745ce4d03aecfd692acbc905bdb81cdf9fb4
MD5 e92489f6c237fa570b0d72e03bb1d1d3
BLAKE2b-256 71019e2b392bcecc4ab458731ad58c5ae00be62da82d27b6d8b82586b15f7e39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 20ed581a0362e592dd83091e34dad2db3eb68c38a3892a27c7f6e06c70a06ce7
MD5 a3ec26748026d2165f3d8cb07af5f591
BLAKE2b-256 ef50ca9465b7d22707590a779a93470eca36fecac53de3fba8b52a08ac280988

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9fb04c78c3880e5a470326835c1060a36c37db6ba24a8d81f5931fccbfa80baf
MD5 3a0b5d3fb6f5cf79a140bfa48b3f77eb
BLAKE2b-256 3c4a7731e7a353329b5f8708e614e49cb7f0a23e5373fa16cd30728fd7706627

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 10e99b98a71f91717a98723ae89664ea2d0fe45da5483ece3c9bed3c6bc0aaaf
MD5 6a5be64f8c03c7876b9f116d2d81fb50
BLAKE2b-256 83fe191dd797d74335fb064b212da849b0583e6f298ff9d6e0082479adb34383

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0f5197845feb6bab3af84571ae6235f30f4fc4839c8b3ff8362fa3d22c457964
MD5 f6830cd5171474862303cc4cf57ce762
BLAKE2b-256 0edff6fc19355f55dcbae782444c3fd202a22346828400d15372ba16d570c9d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f4f71fdb829c737661ac0429650556531d8bfc08a2362b002a9ded76a5869a06
MD5 1982abfd5ef99a5cf221183eaa11f0d5
BLAKE2b-256 e500bbd2f3ca4478af309ff686930eb01b3b7278077fec4044392b00f3670aaa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 43d15c7f53b7a56679865bcf59f8afd86bc261a59a627ebb0897b40b75b8d54a
MD5 20eb9e66e33d0bd0b25854dda08f7794
BLAKE2b-256 3b6da3ec02cd86a8f19152de2e7265700f425303fc3fc903b9f7f6a487831d26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fb1cc59ae59edba84db5c01626ede067d286bf815611c36cbf2b9c1cdc3c163e
MD5 f58e1d2d654fcbaa363c7439e02c99ad
BLAKE2b-256 9b6c2422c3f4e08e82266fc06cad588902ddb126cb8a07266294c8f82be5ba35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d1aa22fc27048aa7965ef8facf39f0e1403f1f7a46fa644b70ed05cee0d85688
MD5 f978f4e0b5d95602267b2cacd684256a
BLAKE2b-256 84e4154d93e67281e0a2a97070295c7f3eec6b0ab797d8e65c0bcd24a5a33d43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3a6fd2a91f45339d0ed8c4299a129d53df3e734b9b8b1d73599ba1180815bcab
MD5 6edcdd792fbf04c33dcec076f8b0eb54
BLAKE2b-256 2f68b8c8d68bdf8c4c6902f92f7b743c0ca2d14e4a00f750a3e43a125a183fad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c0d32c9bb91716fd1525a6709d142c790cfa94bd9c113c59bf00fa23c1f2156d
MD5 1444d9263616cac0d4d6085fbc10a665
BLAKE2b-256 c3337c0574f55972a8bdca5f6e722fa61f39f095896f23a1be0d5fd401e33e65

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ccebc4c99ece55f6e3e98411fd2e44bbd64c2a98fcf53e2960c95b01e3de136b
MD5 9a2a6062bb10fb0a5fdc97203f4249c2
BLAKE2b-256 565bb3e6affde1598b88ad18a077ba1e8ee29854d6f51a625ac0343da64f7226

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.3-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b482f6a2d8b4c15b8079012977737ca5af55972b14076f82c3f471a8265b2d38
MD5 18bac027346a1a9f978f0dcf18414de4
BLAKE2b-256 a5c8bf8c672b1f232a612dd24d911a376362199e9c63672d4ce3681910f4f036

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