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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.15-cp314-cp314-macosx_11_0_universal2.whl (544.9 kB view details)

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

tensordict_nightly-2026.6.15-cp313-cp313-win_amd64.whl (618.9 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.15-cp313-cp313-macosx_11_0_universal2.whl (544.7 kB view details)

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

tensordict_nightly-2026.6.15-cp312-cp312-win_amd64.whl (618.8 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.15-cp312-cp312-macosx_11_0_universal2.whl (544.7 kB view details)

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

tensordict_nightly-2026.6.15-cp311-cp311-win_amd64.whl (617.1 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.15-cp311-cp311-macosx_11_0_universal2.whl (543.8 kB view details)

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

tensordict_nightly-2026.6.15-cp310-cp310-win_amd64.whl (614.1 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.15-cp310-cp310-macosx_11_0_universal2.whl (542.5 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f757e64fcfd276a5b229dce1514ede4b2ae0a6f66b0b0de0a90576db7c0411cd
MD5 02c57fb3c710e6477df86c1483872c3d
BLAKE2b-256 601cbb84e40221f4466750482184550d2a736eead954abff2ca16b064d97cb72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7e46798242e69243cd2c0c50d1dff418433fc033cca5176ea8d5e94ca551fef1
MD5 1417380579c452edad4e315967a35fdc
BLAKE2b-256 e2da4c24c65002693ab27df29176f48379c16510e9616259450c36bb9b3d7e2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 e474d9a00b715dc4c9e2a81b9845325e229c4acadc097ae81447c822649afe4e
MD5 53e8931668ac8149b9c051f5f722c9bb
BLAKE2b-256 7114d6a07781509c12ce87b7bfb4840d66469cbc528c43ebb594b8e5cc175056

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 fe4082fadc5d480bf1271fef0b07b91bc756da1888e651de7742bd08f3e65002
MD5 97875df88ff306969e6372c47ade713a
BLAKE2b-256 01341a3500c4a6cb99302bdf149899429a2c0f5e46726e196c9e515e932cd4a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 74902a3f1f9c0c4781d01ab751bade270f863d22ebd29d10ff9b32b06fc47b35
MD5 9bc129b84de5fffbafbc6a272646db2e
BLAKE2b-256 f23ccd3f8cc76c4d2380397a46955b1d4c080426b92df72ddaaddaacec59ff3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 141285e8b2c2b93c1366b1d34e8650b7affbd54772df909cfacd136d87a89817
MD5 9f8f33919304cad5f9ed073545f3e01c
BLAKE2b-256 5da456097c44cb67dfb9fdf42c3a6339ba07547316acf922764f491d9391872c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ea126d50e14a36e3db91a4fa08ac4552f9d09f1e0373ab6722ca90dc6065232d
MD5 eab095606ecd234746543eb2f9b8b308
BLAKE2b-256 47690a31871994c3d810cea7e8471e6cefeca65413ec3c3a7bea8b7181f36dde

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7e5be558545d12e941d45f5ca75c18f5f02d7a19722c7ce2e817166648db0261
MD5 586a6fa84ee1fbd5ca19c43b803846be
BLAKE2b-256 3948023ab29026c7bb83fa32bfaab886a2de35202b6f2126452db1ef2fa59e82

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 1b33022ec5d0fd66bde0ad5571272200c57af275b3a13f3fa6cf658ea8e7aa6b
MD5 216c847c4eae7e6ed6863da9777980f9
BLAKE2b-256 93d283e0d3c3aef3c908d295ef1411dcc445c20f5c9aae84c077be66943d702a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9b89e415bc52ffb57fd4282a673fefdaf7dd7d5f064ff991f87f77ddc0d25a7a
MD5 cc73c383d938a66e0844187cf7b93243
BLAKE2b-256 a172a3ea2713bd60c9724aee5ea8b98e3ee575342ba7233fcc9c320733e1e049

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ba48f57f80ec0fedbce50e06924ef39e4fcc8ba99fdf231a274ff07df4acdb45
MD5 edd996fbbcd8c8db76e3134c373fbcf4
BLAKE2b-256 0ca10d0f2b1c2ffeb79f14d98b2019980769b28e11993a9c714d1e3d1782f71f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 35efabb2b05c2c13ee222aceeb51b25e91ef2831d13309f7619fcb2c55ef0516
MD5 88cf5445f486206b67ae3c4933ceea14
BLAKE2b-256 9ee4f60ce85411ab8e974ecbd1fb69cbdec5ae6ed6a37cb07f1f378f04feea2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7a41a37f5afdfe7225159ffb539f349251dfcf2bea0be04ee620009aa87f877f
MD5 c46e9c6dddca1821d45aceb1141390b0
BLAKE2b-256 b817e973c61cee85c9412bc0674cca526a958bde4cfd73ef295495aba7e95fe2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 31500dea84a37da7907ba531cefeb20901ee5979258aec10008fe1a8435b057f
MD5 839a849954daa3027205933d2841f4df
BLAKE2b-256 e0176942ef9d1954ff1be9bd5cfb67c821f6774e1fcb1bf2ae448a43f35ab71f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.15-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9a4c54f9790d6810cc1d6a6610f8fc5741e71ee3518d1bb17dcb650b4d4eb075
MD5 ebe53fdce8400670c4c2911418c71ec4
BLAKE2b-256 e90c75f71ec3d0469fdcd05f4328fe61fab022896c11c7cde7c4240f8317c6cb

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