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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.11-cp314-cp314-macosx_15_0_universal2.whl (543.0 kB view details)

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

tensordict_nightly-2026.6.11-cp313-cp313-win_amd64.whl (613.7 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.11-cp313-cp313-macosx_15_0_universal2.whl (542.9 kB view details)

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

tensordict_nightly-2026.6.11-cp312-cp312-win_amd64.whl (613.6 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.11-cp312-cp312-macosx_15_0_universal2.whl (542.8 kB view details)

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

tensordict_nightly-2026.6.11-cp311-cp311-win_amd64.whl (612.4 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.11-cp311-cp311-macosx_15_0_universal2.whl (542.0 kB view details)

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

tensordict_nightly-2026.6.11-cp310-cp310-win_amd64.whl (610.4 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.11-cp310-cp310-macosx_15_0_universal2.whl (540.6 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 bd111fe983f2b0b32c1aa7f9490d670aa1170e063df4e85779b9f7af652cb225
MD5 b30ce9bd61f7897a1527eccdd787da48
BLAKE2b-256 10b17576ccc75a5b6aeec50d8af823758921cda2aed8248a3c358292cbbd136a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 363124ce36ab997210e06878019fdc0101a399e615cbcd63fdb38006eb8cb8a6
MD5 537634acd4912a721dfd031df7c5f4bf
BLAKE2b-256 c1dbd4ba078403e07afcd750ce7976347e6f0f869a713a724ba9b7a37b6f5377

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.11-cp314-cp314-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp314-cp314-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 fd150d0e5ce0248d5810d3b8fbb549350ef77c1b14a288d75ffd4f545c27e77a
MD5 425c75de4eb21fbcad58d89421401f5b
BLAKE2b-256 f3f9361102afcdb5668fa716dd14c68e0365f0ec0357d3c8e11d34b084ffcebc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 343b77b429fab415538933cede13d5b7081ba5421be8ea179a8b44b8b3e08cd9
MD5 d71b1ad176577167b6bc67f19698831f
BLAKE2b-256 f918fbb5abe916344f7f39662c8849d6f0a2b502f514d594a97193856f77fdff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2c49f46e5a042a92fc9e243b22a7903eaf9d7a6fd21a53b4b8aaca6643b84f09
MD5 2eb16e980b4706142b6f477b4f93478a
BLAKE2b-256 c310d8d56334be9076c38d0fe9de590f64da020f6d646ce516a2d3da55fad1f4

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.11-cp313-cp313-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp313-cp313-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 508fbbe0e1cff8225c765b3c5e029ba9e8adfb0539c420fc2d4ff5fd4a4dfb3b
MD5 0e87de5ec5c1c6a6c7f15a8d6e31a612
BLAKE2b-256 dedb36eff989eaa9d6cd15055e7775e35790f14063cbe54b2332c9afee407492

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c39d126dd1b9b529164b8c7ea959a22af5e6fba5542c8927c4b5035c2dcc405a
MD5 ef6d1a216b507f2c3177fae5ac2d56c6
BLAKE2b-256 c8bc08995c571a5a1e4da71fe76c11c7e95921bd387ae102072d75d0afb6e99f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c8c62a3e8b50e37388bb943dd4c13a718b4d51ece838e7cc57437565314db7ec
MD5 7ff5ed456e9c71b42b50cdfdab53e90c
BLAKE2b-256 ea06f6ae7e7ab8ac8af58fc9dfe98dafd20826d74f1a97cc3201050e2c1d8638

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.11-cp312-cp312-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp312-cp312-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 5f77fceab4188b33e2d1d3485e82a0c091b4d0f341814f868613a133a260baea
MD5 0ce49cccf3663e7574314bba8201f240
BLAKE2b-256 b7c06a7875ba51b28a8f48d96bc1c36cfc9fdc18b53fc7bd1475fe3e60f46306

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 44b76c64a226a9e9340debeabac9dafd0b03d298f0b252232af48c5b5b1715ae
MD5 084266caf39112f3dd14e4d8a6f448ac
BLAKE2b-256 67f0b6e8bfd2e5485614ea5712061ffb915dac81ac5d060db3516a111a15bd80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e8bfc9b2fd8ab7268df92c7611681b223d984a1afe218082f1ee8aba5e01717d
MD5 f21fdf44be3aa3a90e05da0d7b98d93e
BLAKE2b-256 c5a23c378b76d69b6b411260317888183a96363ed6b36fed5f75cf9580aef011

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.11-cp311-cp311-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp311-cp311-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 8ac02828516645fe4c6a36e15e0961b7a00d3c351569a24ddd97aec8e2777e56
MD5 f2de98b49710c89eaf07ba50427cd111
BLAKE2b-256 905a7e52c109a0882f8884d4a5dddd8cffb5ade1ebbc281ef2eddc5b6c7b6f42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d5c2e61ef0bf30577e802a1144a4f5323ba8b952def6a7a16bcf1bb27c04e3e9
MD5 75bb5bdcf069d16621ff1b8e2149f767
BLAKE2b-256 630db0cd7d4ebbf6c56d7a31b822431fe8695da78a5dc3bfa7507d637016a96c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0ec1dbe8da8f43e0263603a38359825ffe4cbf3af52ecd1dc61cd6016cb64407
MD5 a99e40720d5b77c3cc350126322b85a6
BLAKE2b-256 0b7402a169312c3b7b385040da2b9b39e8c1002797e11b1f6af14d761df3b30e

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.11-cp310-cp310-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.11-cp310-cp310-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 e3f9b83c1d9d497cd585aae56b9b3743adba2218bcbcea62716ed011e37b557f
MD5 6890128e1f238c6ab4310a4bdd483261
BLAKE2b-256 9c52a9b31959d5be3bf78a358044fc61bf38a4133c723e073cc76009a42a01fc

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