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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.27-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.27-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c87a37736be5ad26d6627eea3f27afd0d6e644aa892c66e05cce83201baa66f4
MD5 97cb2b3fc77c86df27e7a0f26f6b5a9a
BLAKE2b-256 6dbe162233214018a359b01ed573b7c3377f6940464096991f6892ee6895cdd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 752f835beb048a337e05dd10c1461e3f3f3f48579ca53d925100ef0d78d82206
MD5 caf03be8fedf9fd761377bcaaeb0f3af
BLAKE2b-256 0beb95c6ba72620c214d2bc4659c203df3ef6d322c22771609c9b32ccb42005d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 929f66acc99e435ca8112e71151819c7db288ec4e9806b1ad848e199c892415f
MD5 81b374d55ca3fa8769fb1638f5b20f97
BLAKE2b-256 25dff0ac00bade046da8eeade9914efde5303e53d3788207d1d36203dc8679ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 238fc50c02ead35a0571db1f8c1d5e968207677437ef727098702a2f5ca6fd9e
MD5 e988db3e4921dc9c00beaf21c5590502
BLAKE2b-256 606380c41d53927122b2aaff18f7286bc675941dd0c66e83d0d3e42f979841c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bbf727328a5d244ec14b67febe6a08d490c4d01231b6520cdfee25d27e283f3a
MD5 53ce14c91906991138c2735da085d8af
BLAKE2b-256 39349ef3d071b803ad1f3cf58332c02fef6877032ca1f9c5041c317c65483081

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a56e89aa30d17820cc7a467ba2dc48a1a2789064d65d2d82fc53b1dec0f4baa6
MD5 947e76a37233fbd9b53b90bd8c701007
BLAKE2b-256 ea0765942f92ec51d5027072315b4e7ccdd3cda78b8053e3de593857f9d3a297

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f0a990518ef7920d2a73cb5b3bccd81143918409b0db4025de04b9f686ec3223
MD5 b7eeb54079251b5d744c3f441527d7d5
BLAKE2b-256 318898cfce31305f63b567775bbc6bd79dc66e5311ab18a0a8b73a7a3624fce8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f712d8d89f814aa809081fd241ac7aa2fab0105a2bb40fe4f64988e0b09e49f0
MD5 c9766577f315c6a4f2b9c374e5f9a74b
BLAKE2b-256 da2f5916687784ac598717931151dd0a8a79060df21f0939277d0ea665260bd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4ba924b5a746cd8b10f031105eea7d7dc8dd2aa5db21cab7df67ada379940c8b
MD5 5b8ea55eaca78d583c982d1d177cfdce
BLAKE2b-256 df765798a09bb80b4a58525c98e0e2021a569d3abfd65dc2fd727945c6b71c96

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1b8048562cf98c37eba88a90c0f8d2bc252fe9c7f6dec2bad831974c1a26a68a
MD5 00098491706a5987836ce8193ce0a947
BLAKE2b-256 6a17f713db577c22f647888eac0aefdb21f16431b4988da1481b1e88b95ab0f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f41baeb6cace1c1199077b79fbe4bb973d2ec6b05915864dabac661242823bb3
MD5 6a16e86cb3d225af31c3e0e0bf0f3eea
BLAKE2b-256 d5a0f10ac30e84d79913ab3342cb3eeb1f981d2f6be7ab0fb51d0b1a28e490ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4bf2b83474cf25e1a9c109d79a32a15b03be8b9a30ca64b6c397d90aa4cb7bda
MD5 9c2bd588e6667fda114c277ca897c313
BLAKE2b-256 959626e0f21c4eb7ad8a233933051cfa131d17e0dec73b2435976ab8b78adaa1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5063e1a69cc8249c51228a9a17920c6cc63ca4f360bb0e96246bf3f82c28a82d
MD5 6dd338572e3f7c36d786985f454a9cbd
BLAKE2b-256 380fa5b8badf87bb70d0ead648ca6be2ad7359c3d1957ab25d8c490b5f6c2ee6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7e23b59324faad1824853aae190cc5859d3b1d749a90056cd8307bb784930c84
MD5 41f44dd69c7af5367cdcdc9615b99ba9
BLAKE2b-256 52baf5ed5f82298b29a1ed4e622083158d78f0c330d629404c68be5057f3131b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.27-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 1ac6f809a9e40096dd8df83dd19abcd237260fcd8a770d21f8d0bec1b15e5444
MD5 007402b002e661d5af16ee0787eeb9ee
BLAKE2b-256 5521771c5c5c2f93872e6ec7e31bdf42274d54a3e3e7d99c29ad5de001808d39

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