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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.23-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.23-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 9579cbf451389f3df1109bf701369e687ad2991ff15a8bb28055739f890ca745
MD5 cc061bca0e3d65cdfb7e89e8e1132de4
BLAKE2b-256 b9901f88aac53fe7ed1d94b6de9b7609bc79753c9631124a8f6f1125295739e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bd1496a6ac4c28905ced0e884f283d6d85b9992efff60af7fab7e1a252aafb1f
MD5 a792204a10d70b2c7e1e5a1cbb214d39
BLAKE2b-256 8dc54cb5447d4aaab20122ef6f4c965399f383f6c55c05300106ef7d9f22db4e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 12e42e49d30d183aa3087d7fbe7fa191836c1b23156d38d884f179dc226baa60
MD5 5173a76e815342e41745388a9ef61108
BLAKE2b-256 ea9029efce7c1e9f9c2aaf6396fb5cabe26dd1f960efd9aaf4db16d3b0e1398a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 dc36ca898c30109124b9fca5a8f0c1d62de224d7f687b54ec17413aaff8a9784
MD5 c31cda4be7c71611d2f548114b2e30f9
BLAKE2b-256 21e4e0580ba622a72e5b4d8f728a772ce081e203cd6e5c113925f3e54c401e1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d91b5e8f48ef3306de46345061dd955eaa9e3646261b2cb3dba0e67a54c2b3d4
MD5 466092470abbf9d9e32de1041b237a7e
BLAKE2b-256 2dd87e21bf7c6ac46d57445d5785fee29d159cd1e7c597256c16b4b61ac753c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c0cc84df052cf1d9f9bd87496e4ffaf34c8d8d4a1adcc52b42c5bedc95ccd14f
MD5 5078d609c2ac9170a00d6ed4f6aead86
BLAKE2b-256 c60ecbfa993fbc7f5c7958c4107d79c8821b318b3744134c907a9c263be277b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 123d9672af79e5bb9e1651e45c568363b75563c41d10bdfd241bf6df7309716e
MD5 131d84260b09e314a79a20edd6244637
BLAKE2b-256 52c9d6b99d563cec7dc8e66681b5496c839e48b2d01cd4c0a18726f7848806bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 33946edfa8fc13e7e83e64dd4441c53170e22764a3ef38aa0fb54229c51e7da0
MD5 f1d2d8930f1e0fefdf872ca7c2a55771
BLAKE2b-256 abeb9a9bba824907a90d31c4dd1a121b2eb9363c3404141670b6bfdef952b982

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8d84361f48d58b554523d4bacc11bc55cb2a2773f053c9ea41196dfe3eb1d5c9
MD5 d0a6c962743d0c6c7a1cb0eac287e0eb
BLAKE2b-256 79596f459818f1aec59ea022769570a34bd0bce686597c5329501d2a4eaadfb9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4a8819c32c243f07dc16b115f5738f89b38f7f016dc11f541bad353f604f2e91
MD5 de8448e93ac602ee9247f5207b6fe32a
BLAKE2b-256 695602c5c3da0f5b828f32b0aa5bf890e3778bddfd75e278e57fe52c93efc6c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a8e41494fb0e95b696e1115a88c2c38009430df2117eee07d7774f21384afd82
MD5 c7cc8f4dcb0b297051f0e6278c33d09a
BLAKE2b-256 463ae333dff1af1cfc5e871f2e300e82dd83de208408a9349816d49a2a5408c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b168be25d0a939d59e8ebc49b3de08fcb4b72068f34cae11728da43a0bd5c4a0
MD5 91e6b75a03f90fb274ca00453fa21385
BLAKE2b-256 4c440464d9dc412088efc176502642a212ac285499ecd8e2032e7713ccf510c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3a3d791d74b4c917fd502836b11a4d6d51a8764801b546223e3b350868d6a33d
MD5 ecea771f01b77d052f50784c0585c6bd
BLAKE2b-256 1e6e319a5f20b203e91dcef406947dfc3e32933ce15396df79ef23423a790947

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2fa43fe0e147df982cd7441000f48b0608fc53ad32497ea869bec7e4839c8dc1
MD5 7b889ef976b134753c4e4225dc2dbff4
BLAKE2b-256 0099d7f20d9627f9bd145b1c2c5889a7d5ff33c4418b5e5d9b589e3f98539c3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.23-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c35f39ea993365cd6cbe318e84ce86dff61c2ae55f2b9ef62d3a7695690343f2
MD5 e87d7bd1a460b1694a12b6aa913a4df4
BLAKE2b-256 40dd79f24c4a55ea9c33e2646e51c764f11eff79a26e4caa5ee75b0d410aacfc

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