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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.17-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.17-cp313-cp313-win_amd64.whl (640.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.17-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.17-cp312-cp312-win_amd64.whl (640.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.17-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.17-cp311-cp311-win_amd64.whl (638.6 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.17-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.17-cp310-cp310-win_amd64.whl (635.6 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.17-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.17-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b243154628afc966a52f3cfe00d24388f4ab3e5c98902097dc93f68985275051
MD5 65f87fa89aba08e407a55bd800bddee3
BLAKE2b-256 198c364c2690fd8ddae4d0d95ee8086b6fee042587c9040facc5f9a41b5f7854

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2bf4ac3ecc7887a9384c6163761a9fdc81f060a4e2b9791d215b3defee46c885
MD5 fc181f9df3216a1d19a7675b54a1dc6a
BLAKE2b-256 bcf2a8ab609dd6241d5ae426fd4ac439f6e446d28f5263198f6727fbe4373e34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 12d082c8c5de5f95bd30382fd1b6ea1977f0f0ad894d47331905454828251dc1
MD5 43d9e826af61ed424df13d215517c798
BLAKE2b-256 1c25d752cc9a5de6e56835c1103b26110874a8f5f63d858a5f2478c7fb8c18be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d6a4e3bc009104bccde6527052400df8b7f84ad5b13ac757cc60c1273e0b8bc0
MD5 18e06708367c82abda70001d64f39eef
BLAKE2b-256 922b6034bf6e838f0bed36e45edb8974f9da99adb53865f50baf4daee6cb935d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 76e6f8781ea720e52419aa56cacad338d61b0f5948f1e40f0f39649158af78fa
MD5 62c20caddfa19bb4845eec30d79f8249
BLAKE2b-256 d2df23206fc060c6b2c3c07d28a0d5bb44452bdd01524400270ae5ed2938b4db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3e6fb50aa63fa02d6b8b4cea8ed771362da43a78edcd7c088f8dc0e345ae9a9f
MD5 3f2f04a103c5b445432bbcc0be8bf264
BLAKE2b-256 19b36005a1e870f0a97fc6c95a7bdeded3000b59c0c3800642b1140e12cfd3db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 61f150aca323e06c278d2149184f3865b9055ae56a60ce3300bfc2ff19479808
MD5 78c003ca84b28e031def5a7aaad5837c
BLAKE2b-256 ceff6cc54862a106e5765f198d5b1d62bba7b087a846e0b8cb110847991c0b63

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 545c0b99e3ca6fab485b0422b644597058cb863e5358bf4b8ab49977ae7ab0b3
MD5 7df6a73fbeb448a0fc1d29daae8933ab
BLAKE2b-256 cc21c8788486d4e09a1951bd2c32ea3d60fa24bc323b634288db37132a3b6df0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 87d115ed1df42219751adfb1e616a38b053b4a41db5d8698d95495c35b02e975
MD5 8865e14087135317b964c6b4757188b5
BLAKE2b-256 a9e2d81e32b434b65545b650fecfea5b7e9bf8232968ac72c46a6f4fae0ffa45

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8116bc845b158a55657dc723a6dee7c7cb75db58ba8bc1530ccec4cb35a868a2
MD5 a202321f5266526ea96ada8b5f2f7e7e
BLAKE2b-256 59d535db33af8395ef3a6d8312c56b821700e89df3844d238ff1fcd98a8bf08c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f367fb415d64ad9e8d6a7e972838acab37d0467998b123397e61c2b869921778
MD5 d9ed4072fc3fc224f7cdf5ed4d90b072
BLAKE2b-256 a78103b4ef247744a78daffc17a567673fbf5148fddb989a202218fb8bb2741e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 748e31b4548fc60db3b3a324711e8b30405ef2040f0670ef5ece699fb117630e
MD5 6b0c266ba059a711acd6b016dc55a101
BLAKE2b-256 fda2fab24d5988b105fedd1646c2b6a38865b37d7cd2bce0429538cf71520a3c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8e0cb57851a3dd134b707b1d5c54122dab4820f845262e634f298ab08411e41c
MD5 372e25b11a68d9652294922b4fa60cd1
BLAKE2b-256 c388688f4a090fd067add502b8bd4d431189b93ba97c843a3b2a8d5c8e2b6ed5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ada42068a41fa9d6decea7f62146a5b845c43ba56d2272386a9ec45b66816d6c
MD5 2a95eadc9faa8d0ea66e33a562b44516
BLAKE2b-256 6ce4ab923bdff79a358c063d1868bf3305d4c3f7f42cafaa745609509e553a90

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.17-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 61560e70c683e7a3d52148385201d8871450cab1df46ed06afe40f0776423d23
MD5 78d30a03048a6927d41c53f5e18a0e2f
BLAKE2b-256 98c106c9ffbf624207ef4f47cf1ee9587e2784ad3b6da678444fcce8be58139d

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