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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.25-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.25-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 4c9b3c86fb301744afc547e821f95b8ead27f352aa2cbdb175c28e5a3339518e
MD5 b090351993d16a3d49ff6f1e1737a3c4
BLAKE2b-256 f9ed85da47785c4b3fbdeb409d2a6174df08829ed9360531582ea7b7fd9c5734

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d1ba00407f0b6c0ba2de650ca157e2433f74a63e4e91115b74a318feef9fe189
MD5 eaee0b3342869ff85c9699473a23ec07
BLAKE2b-256 9c15d1c3cdea3eec0a1053b8b38a81f083280d0f329451ec50385e92ebadb4d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 0c9d969fd9bd0f27b4160dba280760dbcdc774ca72d051a4456198b97d064bd2
MD5 7834d466fe2674c82d47d30da2c944ad
BLAKE2b-256 0e36de15e5ec2227eda99e9ca35b86268737762751613c10b478bb8b0aef6d6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7cb989950340bef574b58ad505a72c446c1959844375e53bc5ecc4f120f8d78c
MD5 bfe732e0454e9dae96cd60cbb076eb85
BLAKE2b-256 b99ab15c5db69e3154e45796bf2572e48b3afb2a90a87c59419d773931230d6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 41c4eff2857868c9789b0a4494a716bfb2920a86ca61449b279108d2910542b6
MD5 139ab828aa3ee3b6feebab24309172e0
BLAKE2b-256 cd454e62cd50bee6a51333998d9cec833e60bad1aad8b90cac9c798a6b450085

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 46649fb8a28e2b49f1846cbe751782867d177411b2d9519cf8fd891d44ff3179
MD5 9dd68bdc0975b130dc4f169fd323cb1d
BLAKE2b-256 5f1bf01a12a8e5c89c9ac95a4ef895834906f056e5f9dc8526fdfd5675010518

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 dce3d095173a4be2d4178c5199cd740095c112c9822d2396e82b613eefca7f67
MD5 09ef429a228d5ec81c566414a8ef5c6f
BLAKE2b-256 7663a2bea204b4c88605d1a842afac1ca936bc8468a8607e4e1fabae872b76c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bfc7ded7b6e2456c61378cf2ca4234d70ca211dca188e210d033b1d5ae7f11a9
MD5 f92cc1f1db842349001c0f52456059b6
BLAKE2b-256 234d0879a78eb6240a4e33ea36a51deb3e4c51c763966df499d6c9f2896922f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 99b303384095aa13e0372f553ea158a5d50bc27a01c08ca0ebd305a481a595d3
MD5 ab754b9ce3d1138f5593fc9a86f6371b
BLAKE2b-256 2ddb6da6b3e7efb0454ab8b99c1b4724b14716ee17144742fa2b03216db05a4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 af3ddcbc920ba146c54e043cfd9fa8bd10169579e3aecf8e079f2a413137c67b
MD5 73e3649ed9c4814664ce3c1467e4170f
BLAKE2b-256 e163f3bb779d6fa6a93fcd4181c4cb7bccd57e0f7ea115ce6ad4ddf473f4d0d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f86152f8f373e3ae7b38e70316d7fae9b804261295cd4523e12caac76a519401
MD5 49847b7bfaaaa5e97bc635c3dc63e358
BLAKE2b-256 858e27a3f8d4bdfb73903a0d9122c64cebc397ec3daf566d0779ad6fa124288e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 80a6f00b10a5ca4db0cfd088bf8fa26c455fcd23fa3657762485e91f1c985a08
MD5 4cbdee4ccd634d40e1b957f433c3cdf8
BLAKE2b-256 b35fae9404bab613f0789637bc592d67ee8a9e50feb891c584f301a421aafe92

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 aa33002f1ba7459d3700801c0c47aba79d8c2ccfa21ffe4484a1390f2e16158c
MD5 58ca794b595b62d356ef8d18e59cfe54
BLAKE2b-256 1c1bae7025e51d97d82eb612bc89f0befa09b2d5afc345f279916751536a05e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ac155c3927183f4381189b4e4027ad1ee8421d808210777c1e6ace2d290cd5fc
MD5 9e229835911b20337db8c65fa93297c8
BLAKE2b-256 afd38fccc9c47c88092a82a3567337b1090c65c9df232fc9889c4c49e73a2ad5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.25-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 f7b483c8dcfa49b18453aff5fcb05cb1aa3c5a6c4755750ad3216865b8a53e2f
MD5 6009fbe97bf3628cd94a1ab015373799
BLAKE2b-256 cab42f2d8678d643ebc704677a3adfb1b93f7315c83d0ce6f07b314a2596da8a

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