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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.15-cp314-cp314-macosx_11_0_universal2.whl (568.7 kB view details)

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

tensordict_nightly-2026.7.15-cp313-cp313-win_amd64.whl (640.2 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.15-cp313-cp313-macosx_11_0_universal2.whl (568.5 kB view details)

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

tensordict_nightly-2026.7.15-cp312-cp312-win_amd64.whl (640.1 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.15-cp312-cp312-macosx_11_0_universal2.whl (568.5 kB view details)

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

tensordict_nightly-2026.7.15-cp311-cp311-win_amd64.whl (638.5 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.15-cp311-cp311-macosx_11_0_universal2.whl (567.7 kB view details)

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

tensordict_nightly-2026.7.15-cp310-cp310-win_amd64.whl (635.5 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.15-cp310-cp310-macosx_11_0_universal2.whl (565.8 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f28cd086ad9f57d60059462bc25a2fb1f38c8d86bb3993ef0982e4008fd91ee9
MD5 07d825e5ff4f51e4329bb21030df0147
BLAKE2b-256 38afe95ca7ade010cb1bbd03924cbaa7c990b1882f3bfbdbfc2b597c808ae22d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7fbf9f08569afab6a22f2c2f9b707d61f6c5e1b9d10fee8844f2ff5308702730
MD5 5bf4ddf2246ce693a98d75d5492ae156
BLAKE2b-256 03d76cb958ca9fbb5eb4aa1fd26d823f470a87d13fd167a903155cbb511eb079

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 5e02971a05552eb034d2fb999c1e773cd9db4943e0826ad6f8415664366f7d00
MD5 0d0ee0124f0ed75ff6624ee64b6ec81d
BLAKE2b-256 0c423a29e97af1cebda397314a318214ef4a1c155ab0688bd53c7c533dc64a5d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3d66a08aadb3b9f0279fb8e040c3e36638472ec89124ed006dd3d2772aede2a7
MD5 f7eb7e897cef0fc55733652e7a817526
BLAKE2b-256 c0b4b3680ef54360dd1091455dbc494e9fe00b0cb759b79444a80cc3e3cd227b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 58160a112de5ad1e9b9f48f7d9c9041de36c63abdd43d8ecde60801bb16af978
MD5 36118df8081cdafcf57149b822164ad4
BLAKE2b-256 237e60d2c4aabdabf4b3e45b32b20b3646a60902d83ed4c35f95b27753acffa8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 608ba056d46d1557a9d8392a65a8b61cd3684737cb6001e03cd8c89cf0453b5c
MD5 716a82375d4fa33c0b868cf57a5b21d9
BLAKE2b-256 194ee5f7540bebd9f0cf76b565e788ddde0cffc2e4cc255128335d73edcd460c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ee7f05e149a1db38ee21d66db2393539c6faef33b6a73147855f30f976c91359
MD5 077fa50c84508a302b4a9162e079e7dc
BLAKE2b-256 4fc0b0d2f5d70a0198756dd9dc5c6d4cefc6a213a6787dccf73bf3d33341b55d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 77e5df188268fd96079e38b6c6d5c282940712f94a1477bd63e617c2a87747d7
MD5 a086d7646892dce133189190dc2ed120
BLAKE2b-256 318c1178d9d6ea86fef66ce0ca4b290e3fefd31f8aa65131f296726d63555621

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 cc0c817b9a0fb4a904b8dee2002cf38211733ed25293bf066dae1709e5188a38
MD5 d25b00737079f881fbd9b79b900038ad
BLAKE2b-256 16b09e8ff33127bddc8791c9640e359951e6d17849137203116ba26a29a3004b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 810d7ab3964ac80ebb8be677634fac2f106c9462016a892904a1a412926e9108
MD5 b84bcc3c6c7bb8800856a3dbd51d8d49
BLAKE2b-256 b2e399be8d43055d20cb0c7961773890bc84905b9aaf625f13dc0b115c0940c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 660e6ced787fb1afb1cf24c3fb07f5602253e90612e176ec6e01e77eddfb84ff
MD5 125400d3d84522e1532e66aebcdc69b7
BLAKE2b-256 0b2c3675a1c7077094490cf1172109b5639607b92234e1a95c1daec5d3a3725d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 d8226654d36ea20466428f277c2cf52f0621ee1d3df7949680f31a8e6668a4d5
MD5 fc23a00f34d0b8aad9f9f1f38dbf4c38
BLAKE2b-256 60a8ecb5dc721d8499b7ed7ba585a6c1c29d5759fa9a9ba2475adf44383faff2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 75de33e734d9ae83b117fdd73ecc82754a53a716e40740374cc9103145bcb903
MD5 c80797ce018a3e1088be614c73f8d832
BLAKE2b-256 453b84c315ceba4ea2047bc525523e8ba7d2c8f78a89fa0b368a6a0222216e04

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d326c0d688f8d9ebc223583c48037a9b967dd89424a9c2b36d102ff20e2ee2a9
MD5 5015f2963d504c134f9f7f5e126a25e4
BLAKE2b-256 f79c6428d8696a366077917a97222243ecd0576eb98e9a122d411b69feb255b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.15-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 63e94a6596d6fb2d7d6ab828913da4891f3956b0de95df38b698c154c3b8cb16
MD5 c127fdf647b1752c29b6991b436fcf2e
BLAKE2b-256 e12dde3367487653bc5378316b0052d37dd2a5599e626865816372a74fd346c1

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