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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.8.5-cp314-cp314-macosx_11_0_universal2.whl (574.9 kB view details)

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

tensordict_nightly-2026.8.5-cp313-cp313-win_amd64.whl (646.5 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.8.5-cp313-cp313-macosx_11_0_universal2.whl (574.8 kB view details)

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

tensordict_nightly-2026.8.5-cp312-cp312-win_amd64.whl (646.4 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.8.5-cp312-cp312-macosx_11_0_universal2.whl (574.8 kB view details)

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

tensordict_nightly-2026.8.5-cp311-cp311-win_amd64.whl (644.8 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.8.5-cp311-cp311-macosx_11_0_universal2.whl (573.9 kB view details)

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

tensordict_nightly-2026.8.5-cp310-cp310-win_amd64.whl (641.8 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.8.5-cp310-cp310-macosx_11_0_universal2.whl (572.0 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 36ad86000f8b76801644f1b9c0516890e188586071054d363465109a464ac754
MD5 bf08298553512110e21be1f915afc598
BLAKE2b-256 097fcabc9940735d8fe30236483977f1e3f01e804f2273e30f5e9eb17833a29a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 91d6ce06299de3efdece158a1f086008db0717ec489c5e64e74cea0519301d84
MD5 b683f0980c778316b527ea12599afd1a
BLAKE2b-256 57d9e8f841c0d6d9541cbad1e346ad038ad55b7cccb71ea665b95b8a3b77934d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6faf2ac53cbe3d57c8514d3ccec54ad46db60b216ca731f625eca0084222904b
MD5 6a2db784186410bfcbcc309c18fe8dcb
BLAKE2b-256 d8ab1b44421a7692951c6744054a0ae525911f8d3b020cd992e55f466d7d8d38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3ffd9a476329a83dc44ee4818f0abaec9f757d0a8f8230446e7aa2021a72777a
MD5 2832dc68b73887334b55232e111f3ce1
BLAKE2b-256 7f3beba00f5b0bf84fe2004866dd1a5fd442fd94fb712f202cd55f735cf2585f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 baf276278f1448ba056bb5779629f3cb42db0808db3027af5cec81df1e18718a
MD5 d8b6d1064724c569a20731e8bae924df
BLAKE2b-256 7efa7110d2865f99e178e60bc1e5c2631fcbc918e6ca0776e33d8f54872e263b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 81195923cc2e304d607f435fcb2f1b2bb8bf85cf35215498b407fd129470669a
MD5 35e86b76974d81d5a0fdc89d974e7ab0
BLAKE2b-256 6640eaa36be82fa66a2420bdcc96a08ae92688be8ac86b31985ec51b9e129a87

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a45af0b4731c02ae49e5679705e957e5f105c1ac7414f17acf22887806c362fc
MD5 91c1e5f1d0bf073a4b549803660d15a1
BLAKE2b-256 dcf4c214255b7adc1a34f30dea8e4f09cdf19fcfff31045aa92a71f4f254557c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0e358e3f0531eee5a211a03446f8f364400ad4a522ade9956662c0798cd5403b
MD5 33997eedcd3f0dc8d187072fd2ac5605
BLAKE2b-256 9c258df02ce72de5235c5605de3bf557d6b741035da32b39deb7956626c86471

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 606edbd13eeb45931c55f59f37943b563cc48231ec5ecc5a9351cb45f42b64f6
MD5 1feb74950bf500213427994f01daf316
BLAKE2b-256 fad3591ad834816148ac48aa3e9511a3ef08c56254b5c31ff388b2ac15273a27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3c8426efc1f4d9663aa858ae8601ec75e41ea1f4b148f361f47219e99597684b
MD5 458597230a21874bf6c1ff58f9e2ceb4
BLAKE2b-256 5acd9b361b213162cbb6d8ab6075ceb17c42e99112ce54c668d448f791cc2e1d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 52c9aa0cf28a0725f487c2c219c4995f5a5a1545c941aae19f469dd536f8c49f
MD5 9bbd69623c1c4169fbf628e696a30565
BLAKE2b-256 2975939431b035a08d61c3267ee5d0b4d3484bbd9d13d06084e012301f3c9859

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b7cc37015e4fbe347d8aebda610d4ef63136a9eb0f01e4d2fa9c893f34564b2e
MD5 953d2def632458148854658508f36b23
BLAKE2b-256 22a5ae2548ceda55c13e719e20efcc58b61976d83888c351c707cd0449ae9b52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 263be7cae43c6c383e125db1f1c52e46097a0e7d3809266432ea052e1baf44e7
MD5 a7b4a987ee0dc11dd8be3efe73a4ffca
BLAKE2b-256 9975dbcc019e98cce543fd0f81b25fbbe8873712f5d642590978b337331a0c67

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 70a0a536efa0d7518a4c25de52fd87f88367c8883c266243e88629222ccaa1c4
MD5 6adb24a7ea89e34bcfd282242789676d
BLAKE2b-256 18e78feb6349f2d7ddc59bec0bf2ed20f88a498d54d3ea45c556e26ea53b4bca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.5-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 66fba09390ffd4cd09513373cbd11f8ad370a9475b5a74886c244f21c05c0670
MD5 fc0585d6b07ef4b229e16f07b1b1644b
BLAKE2b-256 87504262f6e7e96b3b85382958ceb56953fa3bc882de1cbb0b3a5298219ab971

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