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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.6-cp314-cp314-macosx_15_0_universal2.whl (542.5 kB view details)

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

tensordict_nightly-2026.6.6-cp313-cp313-win_amd64.whl (613.1 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.6-cp313-cp313-macosx_15_0_universal2.whl (542.4 kB view details)

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

tensordict_nightly-2026.6.6-cp312-cp312-win_amd64.whl (613.1 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.6-cp312-cp312-macosx_15_0_universal2.whl (542.3 kB view details)

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

tensordict_nightly-2026.6.6-cp311-cp311-win_amd64.whl (611.9 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.6-cp311-cp311-macosx_15_0_universal2.whl (541.5 kB view details)

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

tensordict_nightly-2026.6.6-cp310-cp310-win_amd64.whl (609.9 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.6-cp310-cp310-macosx_15_0_universal2.whl (540.1 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 cecc068d17774cb73938cc556a74193f4128badae2491969e59d94416a8f1f07
MD5 02f8d87eea48714cb25ec6e49ca1d967
BLAKE2b-256 7fadfa4da0d3f405597d4d6a5ded6ebb925cc3f3e0d4c5525b71abaaf971eead

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 baae79fbccffd742108959f68a7af7dee8a0d15c39b019ea16c7c27f2f3fa7b6
MD5 343c2541a42c5174cac6907e6abefe85
BLAKE2b-256 49863145cfcdb8942344d164408e4957f3324e7173131b1f8783e3615e64518a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp314-cp314-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 fd5f506333bca448b086b3771aa6a0abd91b0ceb7d1ebb6c4fc15524768d9708
MD5 5fca408bf1a2492901ae5e678d48005f
BLAKE2b-256 fdf4c8223ed2004512c2fe48a86ef4d9fa6eaf8bdffaf41034b2bf121e7624e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7b5797b5d991bbb93ed73827dbadad40115e0d967aa94080737bc4121bcb867d
MD5 75e42bae3fe18688099cab0e636f9c7b
BLAKE2b-256 d33ccb7c5a4d52ae16b6086703e4f232f562807c74169d5843f29b1165ee043b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 382816ead878bbda267e14db94501639080f5d8c0e71f53954d5437cdc70a536
MD5 213ba04759ef552673851162be953fc5
BLAKE2b-256 d6bd93558f768e1bc3701734e2b32d11c10e6ae0cca170e1c7501ab58106a371

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp313-cp313-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 7b795cebe8b370fd48775a8b48420db4dc3c936d90f49753e22f479a57cbdc12
MD5 793492448612986cff06c4dbfae8d193
BLAKE2b-256 bbb52d6b918ae4fc71b6d102d595485ba5b30f6c2cd3e641270be848e5b03986

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 35fa92d5a2fecbf435d9bf4a8d235c5c812f5fae0e479db02145503998147295
MD5 c72b7ad90d2de818046ffb8a2ea9c65a
BLAKE2b-256 9489f4a37309ed0d73ef980f6bf0a01827594633bbeef0653bf08ddb25fb6d20

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ee840f434d3e1171e46d36ebd21682a200f665eddd95899cf395783fcd5342fb
MD5 03e7a294fdbffb708a54d3db15e5b1d3
BLAKE2b-256 957be54bfa61c8dd427f3a8001cdefcee77a847f2193050d9d435ba6a6bf3756

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp312-cp312-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 a8ca95b8d4627e1990d99bc58b8b18305b641a419ad2d1f62b47d6edcb3a81a8
MD5 63af289dca9e89246c898cbc9396cd35
BLAKE2b-256 2ab58e0fb668832a87ffd59324f3dd941a797cc4aa0625ee17ba41034f59f618

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6c07e50925f4b3881023e54f054b97fc57befb27eda1f649069443f3b8f41972
MD5 e1f787bfd578a8ff898778d390268c5b
BLAKE2b-256 3faf2f6300ba8185b7baf1691dd2c4cc11475428f6fceef0268ee3baf236a4b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5c865636c533a13a24bac21e4ebe5dd3223decd397238984c7237c473eac91e0
MD5 ffd5e3922e3a8691b3d4d263ea263c55
BLAKE2b-256 118780a55d3f4f90efd82b184b89b23a5dd950cb8146e83b1ffd291ff871eed5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp311-cp311-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 6d9c2ac66d7126fb33400574eba85d9dee3bf5eb567e1f7e207b3bce44b0c9cb
MD5 37c065eb29d029ca5a1a484b9f901448
BLAKE2b-256 d37307d7e7bd400fb7ad34a5bb534a7d37e2fc0bdfdd546de12a626131764ef6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 00c0e1a792871dd1f8e8e97db559505df063347a72ef52cb5fd111b8a128e808
MD5 85ce65d5de6d2cf58ab5e33e0b67cfed
BLAKE2b-256 3c829344ded2ff3263b69a3bf4cf263c06cdf2fa16a8ec57a5087b9b2cf9ef62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3c74a1aee56ee5878d3e1dd93775c053f6c17a5118062f79f9132e46ee9709b2
MD5 ba2fca6bd14463ee5116963de9ae2dd9
BLAKE2b-256 605b4822895d4c554f9034a374252486fd78edbdf19c8e1c645be8248ae5f0e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.6-cp310-cp310-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 2bac4d5201fd757bdf0dabf734b7ad2a9263db367a9564344d75c6a4c4c34e72
MD5 b5d81789646ae34113f35cf6d5f08472
BLAKE2b-256 f168e5cbf7e6a4625c044feea806f82f227b226782244b64723934cf7b450e59

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