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("/path/to/private/batch")  # memory-map every leaf
reloaded = TensorDict.load_memmap("/path/to/private/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.8.17-cp314-cp314t-manylinux_2_28_aarch64.whl (590.8 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

tensordict_nightly-2026.8.17-cp314-cp314-manylinux_2_28_aarch64.whl (589.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

tensordict_nightly-2026.8.17-cp314-cp314-macosx_11_0_universal2.whl (578.8 kB view details)

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

tensordict_nightly-2026.8.17-cp313-cp313-manylinux_2_28_aarch64.whl (588.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

tensordict_nightly-2026.8.17-cp313-cp313-macosx_11_0_universal2.whl (578.6 kB view details)

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

tensordict_nightly-2026.8.17-cp312-cp312-manylinux_2_28_aarch64.whl (588.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

tensordict_nightly-2026.8.17-cp312-cp312-macosx_11_0_universal2.whl (578.6 kB view details)

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

tensordict_nightly-2026.8.17-cp311-cp311-manylinux_2_28_aarch64.whl (589.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

tensordict_nightly-2026.8.17-cp311-cp311-macosx_11_0_universal2.whl (577.8 kB view details)

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

tensordict_nightly-2026.8.17-cp310-cp310-manylinux_2_28_aarch64.whl (587.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

tensordict_nightly-2026.8.17-cp310-cp310-macosx_11_0_universal2.whl (576.0 kB view details)

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

File details

Details for the file tensordict_nightly-2026.8.17-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3638d443c39aa1fe0cf530ecdb165cf7b1b6ea7abfd8bc2bb76afc5bbfd2da2c
MD5 172528f2b6d30f9cc65ecdb1afa7a6cf
BLAKE2b-256 21062bc7e3c89a888583c6163d27b7b61f8710f49b3c7c2d17f804932a7b844a

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.8.17-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 feeeaf9582a5c88020da859e1dca62bb4057f13ade7ac3d7c8f2d64265b2d0f5
MD5 43de56a8bab94b2d9ba06fb65d5c6eaf
BLAKE2b-256 fa610fabebc175dd57506dbcffc10d697c7798a1b29d02cbd114576a213de9c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 113533a44ca93d74f87febb4c9484e819f7900a0a62b049ceb53b6f4a3b9ccce
MD5 ff5216e89e11404924c61eb6ecc3d1e2
BLAKE2b-256 158a9168e1d10122f8c8473c95b29840175b279f95eab1d55a4c51a084fd1e59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b65558a80ec6f04647a36871e69b6254fddac0e939166584021c0623e68f7359
MD5 f44b9da1f407341cab0be33653d1249c
BLAKE2b-256 6412c24a9e13932e2996e57bca7cd14be460ae642d3cea9717417579d0a83e41

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.8.17-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6f08f462ce76c6cc5eb132596605fd1272f1a92c3d112e2642e76924dca9a372
MD5 92162dc9d9aed6c43d59698eb20de0be
BLAKE2b-256 3b818db5ee5b85f6e190f45e92d08409bd3e2dd340acc84f020ffa48149e1268

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 64ba2fd090e65b36b928c6b820187e692ca797161117b6ba456be588d45294d0
MD5 64ac446a24fdffbca1b1a36151ae665e
BLAKE2b-256 3005079a5863ec1b7a9bdba4e1514748cb8b5ce98813d2e6b79bbebf473abf79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 0ed340865d0b0474bf13dc59d72ea17d01b40b0107b4a87a2fb4d5d3ba23b1f7
MD5 5701dd36929234bb6219a040d4560f15
BLAKE2b-256 86e5e5c4fe93098e81721c9334bdbf5496b17103924a03108683808910aa5e6b

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.8.17-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6f4c1305d3c6544d52ef682d396a610f43c74fcd0adfc3c5e5f35e96db29f6bf
MD5 efec4353982e4b79b3a346fa5926a200
BLAKE2b-256 db387a93eacc6e1341ce43bfcab6533f801881432d2b30c5d6b346ac98e7b2a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0356be7a8da5bc0caf607de86422d058cc55005fccc9d6634c29fdd5c796bfa1
MD5 2243ea7f9ab9e225cf0b519a07470352
BLAKE2b-256 17eeab0379628ae46c286826192d01189a36485c15498b755d80f9c053620abb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b2e59cab18768af5692a04044934da33c608b460e6f49c4e46776f4b062a6495
MD5 b3d2df88bc74e528be37e4969a6c490d
BLAKE2b-256 025a173fc947cd8b8a8790be8b77f3d1a3fb655108e2ce3106651cc5971b6a83

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.8.17-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6e663eb0658fbb3b998995009412599af9c64914da4d6b3468e586ce67dc7b82
MD5 9e91304811c5653355a58bb6ba9e6d47
BLAKE2b-256 edcf2c2cade891d3a48ff5a87bd362bc17dc75c02bdaa229d9868e7aa6acbbc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 006e1b972a764567d7e96fd66bbe412f2ee7c9ca52d1357aea9c6ea864b74dd3
MD5 f32f48d9d7c3a61f3f1644d51701016a
BLAKE2b-256 ffdb5ec411991799cc612f7b813783041108968f40a5dcd668feb1c8bc5aecdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 cd073182caa678cd677f6295e140d838127a8adcd938000513692d2a60532a00
MD5 1324526d6fe726c53e2a11a46eddc968
BLAKE2b-256 39369a295c703e87edff3b757fd22c9e5cfd5fb564654ce0d5caeb04866bee58

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.8.17-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 44eaa2b02f5c390c18e0ec746ccce2416717064e0f9d50bdedbc651443111223
MD5 d4ea3a2ff93a5a336caffb63cacfaafb
BLAKE2b-256 203092f222804759237192e9f0169474e1c7b426ac56c941b08665375ad06313

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 fdb037cbeca09899baee2b86f433212a3fc4cb2837dc1890695f88d29f9b0ca0
MD5 9b46a6dcb47c9f779d15b58259e11861
BLAKE2b-256 d5dfe18c82bbeeaac849de8e3d3edcc989fd0c1a95b21774a66f791286085122

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.17-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8161f240170017b47e85ecb0459d31e954ae67a55491a0ce15a2ef7c9706a1e3
MD5 77ad38f6739d80dc29675fee9aae2aee
BLAKE2b-256 cb916a23995c1c8e67ced4c4c63e1dacd73bbf759734165cde8b07b56c7110f1

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