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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.6-cp314-cp314-macosx_11_0_universal2.whl (552.3 kB view details)

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

tensordict_nightly-2026.7.6-cp313-cp313-win_amd64.whl (623.8 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.6-cp313-cp313-macosx_11_0_universal2.whl (552.2 kB view details)

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

tensordict_nightly-2026.7.6-cp312-cp312-win_amd64.whl (623.7 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.6-cp312-cp312-macosx_11_0_universal2.whl (549.5 kB view details)

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

tensordict_nightly-2026.7.6-cp311-cp311-win_amd64.whl (622.0 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.6-cp311-cp311-macosx_11_0_universal2.whl (551.3 kB view details)

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

tensordict_nightly-2026.7.6-cp310-cp310-win_amd64.whl (619.0 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.6-cp310-cp310-macosx_11_0_universal2.whl (549.4 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 3d4431a659ee9bbde41c9460f83d86fe4e3ac3a114dddffff65b1b87d5690480
MD5 aebc7bd3ec3a7836f49e7756904bc557
BLAKE2b-256 70f1e595e8ac0d96ebb5acf9e40184954f834ebac263aed7ed494265b7251506

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c94eb4e115ce4ac7c6c2ded796b50ea1df8fe26cc601ba1d6953dab4db143dc9
MD5 2b7b904b1499e40abf3f104dc3ad5b13
BLAKE2b-256 f0c40c081236377b4f7a9e34015f715f6b5c63dd811c1543698f2eab095b48e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9937cfeae2e9f45f41590a9e0d60ad1d13896a618c2344891f1364c959fd6e8d
MD5 3ce63d64d6a79e41e53e4514a0c00d8e
BLAKE2b-256 c8df264c0659637a2f04a60d17ff4ede671b494550c510d62627b32a0e460c3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3866f54cbd01040afa493a6ec548da0882bdfb8ad78a89cce763e847df3963d1
MD5 cd0da13c22457667ee096a11af1dfac3
BLAKE2b-256 198fed57e96459ad365ace375ece4e4cfbcf1f9ec3d8444fd934d034055368c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 59fc6f635b66fdb9cbd1cc6d3da3a67af8e885a810c52d88ab39ed4c50957209
MD5 21b6b1270a2d6ed50b80040d383c5fe9
BLAKE2b-256 142019abcb16f845717112ad1286d4ee8102138c0053fef42ce55f23117e474f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 1f3d0efa2be31a615e8210c6ab88a521efaa58092a49ad2e35d71b9842decbe2
MD5 d5575c1b6da51133578304ecaa7543cc
BLAKE2b-256 68d6f833f4688fe35dccc5e126e87b83ffd2fee16f3c62ada94b116fc726fc68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 37b2510da7ea3207092611fd9c2ffd3d4896cce22b33abc07c52ca58d8136188
MD5 7dd6d429ec7bea0abfd77ccb4f01efac
BLAKE2b-256 d14f54914277b1f744244e7a2cdb0a15a5dc28d4dc110726d9ecd806c4104164

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5b974b5cae9a16a0d141e5a44497af10cd3fa43c64754b2ed38df466a8aa2a61
MD5 e1badfb5cf0a56f3d3cc376d971c7eb3
BLAKE2b-256 89b471a12afbc272dc30cbbb22d4f9e043c6082290f9befb45f0a0b8c5521789

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 7ed198f4f4c26d4043df4bd7a09d1fb80fbd0ef668a5c2e9e2127bef0fbb51e7
MD5 a0f91b5b0d43822ddabff6a76ebfceee
BLAKE2b-256 fb40506b410ecf710fd25d3d38b4092078c7a5a128b8a40af3c91b961cef9542

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 529a470709bb87d359622979060604ae6e04bc46e19bacf4efe30c1bacc9369a
MD5 361665a94574324489d92666b647c17c
BLAKE2b-256 cb0ece9c328235c95ebada63e492902b2acbe0eaaf1b7c5c5b26dbb15d61be39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a66150c75e5123ae97883b14a76c07857f00838e6bbd9f988a9984885180f8b8
MD5 e0e0e4f84da6ce84edbcaf8b4e7b104b
BLAKE2b-256 ae6b6f368dbe9eed820f599934693c2a63fd374e86de98e64b75750321943918

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3d7a3c704217f5689b5be8d34536af77e8ac3c111d1a2a0c4e82d6584d8c8a88
MD5 e2eaf68d0cece4946989ca3885dd407d
BLAKE2b-256 03e0f25c8513fd9f08f5604b0eea8e74252f3c929de16165b5722f92cbba1475

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1c3efa72d2e72077e1db4fb65bdf9b66684f1cd69efd010fbe35eea1a104bc72
MD5 f12c6e806bf343c8b72e98d5e22f1410
BLAKE2b-256 a3398086db79bab8d1e2f949b3b7693ea95f8a334cf1235b66b16da939ec393a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c78a0919bad76026fa489fdbd3c896f2a7e94cdcb9b159177a78ef2238ce419a
MD5 c477cd4cd448db29b977eeed3b76f39f
BLAKE2b-256 6fce6a1294bef5678b48f9db50d508da2543ca024d16dcfaf610208bb537fc21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.6-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 f632c687e5129126f8bc5d832436d2ad28f3f3d2d0f91527ff812e90c3e089a3
MD5 6d126520f7a4168f6a37ca1bc8df68d0
BLAKE2b-256 e671935f7ac92b072f6c38e81335ded36aa911bb1b283d1f0153556b81fc9a4f

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