Skip to main content

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.

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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.26-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.26-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ff5896fbef08848f266c0bbc24a004e61c7a33cb9aae90a1ea6cd1c05c526660
MD5 9065812c136ae7f6217de720e1118beb
BLAKE2b-256 0b9903c59c888f7633609eae2d13e77d09a81a0e93fec3791b2a2a8277247b4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3933ac09dd5fed7e323a50d694234de90d7ffa80a122e435a0ce64462c231553
MD5 d0f60e367695f9e7e0424ff1b4a1c732
BLAKE2b-256 a7071e1ea5204de482079f7e98f441a47ff861d238ddcd8254c3a636058447e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8d1097c0b3f35d225b6d6928a551824e49d51b47a046e57bfcedffff29495659
MD5 717ec10b3b2539cdbffa27d4c25e3452
BLAKE2b-256 412f2beee0a3154987d7455940b8dfac9f0b3c82d80f36dc8dd44120299d4679

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 378e021dfd722b7f39b412536c97010e62edd420bb6625f2e9f2492ebb6c3e34
MD5 610df05a37aa65d31f5c586fa8ad4c14
BLAKE2b-256 6e5624b3568c183e6067be5dbb0ac49272e54f80173f623c59e048ef7ab0b05c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9a7cd44bdec7dfb662c671ac3ceb82963841f1fc961319b1a90ad0119c2c9cc6
MD5 1207e70e4bce255badd39cac59407ede
BLAKE2b-256 b19dd7fcc659629a15a261cd20aad975b0da992da56dbac8631169377b5dc9d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9b76933077c214336d1e7e2b399870e1fe7864179b219086f889e465420bea77
MD5 1b9aebc66b8fcaf3f4bed2ac568aa675
BLAKE2b-256 444c399e3002e56ee2b56608514a49037eb6f90fe0beb789dc21f83a2cd9c105

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e50598d61342723bfd599af371f1fbc3cdff34db9578ebbf092cdf443687fb73
MD5 3751e40465e91a62285f2991125a7edd
BLAKE2b-256 644384d2d404dc306cc5b84a0add1d93f1e7fec58f7fe9a32c79d697717bd332

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 fd52b4454699715061f278aef2b3841d1f2f4c64ff02fe99f5b4d881feb27495
MD5 2115da9dc7c19941679dc0d5f43be1df
BLAKE2b-256 8d78f35be67440044ac83623ad1be675db78d56799f1444640397083fd81b028

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 5635bd82fbd2fbcae8f2162b3fae99f569ac5afda67dd5ff62913b3c0dc481cf
MD5 d510e9ea1e1877ccd1337eef6b29143f
BLAKE2b-256 6bb710ab40ba985314dc2dac106ea97506f5bb4237bcc858ac48a93ac9d30439

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a83267b8a96534ac51c1792f35298cea3354b5b62a7de5db37592157c4784cc7
MD5 0a5e9660a2f7a276ae017927fb82d899
BLAKE2b-256 43df464c970c18bb15ca72370e12abd31554e4b63e5a10a94ae14c16dcdf1dd4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1b1ed480a334fe82f3f56c3664a7d78cd07731a7ae6aebe42c878ec47c4afe1b
MD5 5699ad53d177be576f17fc4cee586c76
BLAKE2b-256 9ee7d9c33637077e29906a2145d122d8f4a20b7888f7d4b372aad4a4511529ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a0f5a929c2dacd477373f8ce503f408ba36a23efaf3d826061ec10cf34828708
MD5 9d1fe87158ffbceff70c047aac9e536a
BLAKE2b-256 a09a25a9e1690d90de7e16906ecfae445fa1bbf1a37d0bbe2f7cfa797dc3c20a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 468a6d33234a5e94235a30501a97271d9bb1d7e0029b8f086320926504ce84b6
MD5 87d4cabaf26d0009af09cbcc7b54ee0b
BLAKE2b-256 e3ca07d04835ebae961faa0eec24bec8c7a96a341b6249a4142932e00c3c7151

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c4cfc725f86da1dbf755cf042b08099fd3f3e6a3d57393d3e036a6663e4fe5dd
MD5 caa26582cf0d8cdf350353694d5a8e1e
BLAKE2b-256 36842ffddc397a5cd0fe43ef17745b652097e339a112e5a38bf96ee4199fc202

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.26-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 23a05a2f0bb390112577a5ded399c9a5ca2c7f6865ed28b261989266d69cadc7
MD5 412dba1c1eb9e771b8c5f3170441088a
BLAKE2b-256 408bba3fdd52752a46f6bc3bcc8f653d2281e57e9f3f3382f279b3f3036a6372

See more details on using hashes here.

Release history Release notifications | RSS feed

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page