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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.8.2-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.8.2-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b19cabbff3ef5e80ce7fae280480fa0eca7be800a3cdf4d69643056288d32758
MD5 e16deffcb8fc0430a8e3761c0572857d
BLAKE2b-256 8d0d0c9fdd3a3630a1cd60a4b84d3969ff5728a96eaf0a15dbc8287af5429714

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f39ba3c6421eac6eb99f545e8152a85190e9d56e30db5364c7303770e27744a9
MD5 1c021672b0cc7fb1cb88e1ddc60667c9
BLAKE2b-256 c42e1773e91fe42df8b843ff802cbf06c8247a805855e6874ee864683f4c32d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6f5c59a4276c0776a5803a5d45ad176d38d15fea51a4ab8ffe5bf96cffcbd0e4
MD5 075d7a7f2c8c0255a75a398af21c9b14
BLAKE2b-256 1910407d5cf5908f8b5cfc116a7983cc8d6cd21583b7a405430c90e88cb0137d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a4556f34af6b1d6957a70853514126d4015d6dac724378f1fdd78591ea6674bf
MD5 c8106a6b2678e14ac272b0bce9c95fe5
BLAKE2b-256 880ffbdaa661752a8d4962477054e485d1b3a5556b41093c158211e8e23d933c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c58de9729162d9f61959b10d853279e6a20e8ab35b2320ca0ca7201e29649904
MD5 8ef729ba80c93714c9c02667b54c4c76
BLAKE2b-256 5062a569b2ab1df7352c84f21c0703e65a96a07ec3448c0603aefd21aa9c22a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 23eebf172609c7fca68a11ae00a2d9aad3acc564861b9df513aff0575e7c3a5b
MD5 5974461e54dcbb5f1d9bf952d7bae0b9
BLAKE2b-256 42bc6374514a129edc7c13992313cfcdd23cbdd8c538699c442dc5fd25a01e22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 04cb9956af02b8439248c57488cfa13839f77659dfdbf2c983286b78373e1a54
MD5 9959f15abe2c07a174ee0275b023ffd0
BLAKE2b-256 d020683f1386f1b037487d1c7b6f3cc0421fb7a05aa5e844769d830fb81dd190

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 93cb66fbcb101208cf8b457ea182c83e52c08863ca17130b0ac3c2b716ebad79
MD5 61820dcaa151e0b21d05f591a48226f3
BLAKE2b-256 4acabb7af14705f379c47a33cce12939e58fdf1c721cb17005e0036dd05c86bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 30fbc0c5298ec4fcd1e1c6b5b709669a2ac251b88122237338aaefd7e6895adb
MD5 87e6474f7e252ff85e665d55dcbba307
BLAKE2b-256 a5453eec81293f4a8d27f7f29412004e1d2431e2f77ac840ba656b474b573e34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 13668fd786312ff596d499279dec415f3e5cb627e0ef62878270f782059c7301
MD5 6e091693e27561a42f018c4fa07d67ac
BLAKE2b-256 c3b1bfd0358801e944493a50f1a9fb0dc3b1f27cc67893a24d17b5f68ae68f40

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4e898c60b34ed288c6434a323fda09090bdb5d825404e12ecc28f6df18acac9a
MD5 06330c46b245659086923aaad9cc616b
BLAKE2b-256 2e4c1c0e8de3b6fc7b1dfa40caf8a2ec53f8a4a3b017407b7e292bc717283208

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 660fb0396de2bc8cba97aa57205a16804bb06982413adc7944d53f5ed48573f7
MD5 727510a50663148c197b90d3acb2d984
BLAKE2b-256 e90d5d06f49292036f1bb5d6ba69ed4d8952362b0bc1edfbfe1fba1ae925e018

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 19ae1caab74874e49a842b0f95fa984163ff1f1162cd26a55d09755235d9883b
MD5 1a71139e167ced02d79350923717718c
BLAKE2b-256 4db393022d03ec0ed7e1d21122555cebe71e66edc2542198a343a7867b6482c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d89fac2bfe6da62901179d14eca44bc16ba66dfe9f3541492dd334a1826d96f5
MD5 d4f503c70a62653751a940b502228d6e
BLAKE2b-256 30cd21c1d8d4f9fefd95bd11627ff532c4d11af6dff6f06c10b0378109dc6f6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.8.2-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 29469661970955d1a1d5c8bbb7938ca0a13103097afe36a90954be3f7541fa90
MD5 b88f8fae2333b43c82d14821dc4139d5
BLAKE2b-256 5150d0f262af89f2a73d160bebe40951c4cab3d79259af933a388cc3d6a33367

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