Skip to main content

TensorDict is a pytorch dedicated tensor container.

Project description

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.

Project details


Release history Release notifications | RSS feed

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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.17-cp314-cp314-macosx_11_0_universal2.whl (544.9 kB view details)

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

tensordict_nightly-2026.6.17-cp313-cp313-win_amd64.whl (618.9 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.17-cp313-cp313-macosx_11_0_universal2.whl (544.7 kB view details)

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

tensordict_nightly-2026.6.17-cp312-cp312-win_amd64.whl (618.8 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.17-cp312-cp312-macosx_11_0_universal2.whl (544.7 kB view details)

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

tensordict_nightly-2026.6.17-cp311-cp311-win_amd64.whl (617.1 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.17-cp311-cp311-macosx_11_0_universal2.whl (543.8 kB view details)

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

tensordict_nightly-2026.6.17-cp310-cp310-win_amd64.whl (614.1 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.17-cp310-cp310-macosx_11_0_universal2.whl (542.5 kB view details)

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

File details

Details for the file tensordict_nightly-2026.6.17-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 998ac16f579c07270de4ad2236e7bc2445d7d62d295c52f422cdcf07452a479d
MD5 1a64f1e5c4a3abffb281c47545a2160e
BLAKE2b-256 d1ef29cf3d6e2bdb086525a34e0bc09605c8d1fcd04e98ac50d930b72c5c4041

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9ae539d35e80ca069138479fdedcd9bcf01ff8a59723722837c460e1a80484ae
MD5 aa0fd9c0f9a61c524987c32b9a180199
BLAKE2b-256 7c0e8c1fe75d10bcddc68ac6e52757d34a0f3cb37e490ad30e0b0c0cdfdfcf75

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 df816990143f6b097dad309ed5b21be7055d4f1032636f35747bb2e2216e5e36
MD5 7ca82fb83e1b7991d377620ef2f44309
BLAKE2b-256 ff7dd6e950d108633664870c02c9627c35ca0f7c700af3a820a35ff4567c3e81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 487f28801b778d3768390eb6b9f9a40f82e05911039437516b042ce238f7344c
MD5 53a3fd845b792ccb121a28d5b9c9629d
BLAKE2b-256 c2ea730ccd3516ad31b848dae32d0e56f94fb06e53c4de9f61b6c64128698c2d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 209855b8d18a86d128b392095465c130ea2d3b2fd14625dea1d870a72b71da90
MD5 0a52bbad748f0b4da86de352cd374a5c
BLAKE2b-256 2fe21539a8c87a7743c554262a74094db4079df6112611f55f5078e2a4695911

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 95e1b3fa3009a3e4c5d3ffe7fad6519b648a16f939826aceff2d798101ca674c
MD5 847bc48470b89cca2daca58d0b23d4aa
BLAKE2b-256 ce589ea20c9f1c55bb786741be53f3ad9216a05d0ffdbd17f00edfaf82a39a03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e9210ac30153cfedb9cdbe7e548b1b775e4c91d343fb57ee05ede5ad0a1ee712
MD5 e5407eb00620990fa4f130dcbb6451fb
BLAKE2b-256 ff4907cb7bd65280bd84600807cb1f43a3540759c356de4300622cc776017b5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f09c89b70f29fc1c6adf56c6140dcc087820b57aeb9318426464e565db66e14a
MD5 29ead3018116025e7fe450067a45eb0c
BLAKE2b-256 a0587a5a8bf741b4bace58a48bda5b078fbdf101b7f8b4e6d1dcdcb7e27ba3d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 35534885619a70f1548a93fef44c12b5be1df9afc80a9e86a774049115cead0b
MD5 45d88575437b0ca8c87db30d08dd6ba4
BLAKE2b-256 7acbda1291fc3e0e1c3130720d425d3bfedee8ff0ac4d390687dd00fe2ec2c0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a9d3db100d5bd8e1a2f00f82eb79139f08df51c31bc45c35b313434bbc81c552
MD5 b3f1b91af229e5ed8d59a70f2e9a8b9e
BLAKE2b-256 248a48cc2b62228369350c5aeb506fa8e953b88d84afcadcdfe917c13646c7d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 981b0cffb534d469dd8f3d3b2b5aa81c31512aae103452554ac66ec99854e8c4
MD5 e8e4a044906085a6e83aa8df68a5f77f
BLAKE2b-256 8859f77e8fd62f4d4ecd2e511f71ea7d86516535d4959b061b3a65e4901faf05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 331da8621c4dc0ad714ebee81966755c7c8ad834fd9c69fa8182f953ac1c2e53
MD5 660aaad4ba84e08af7c84e187a971725
BLAKE2b-256 e006c01b1e2c4945df091515714a6f60a850bc9967d5540eb6ee3be16dfb4d3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c2363bc46d223528484f59f1fea54feaf1c453d170d1764b801577b569159405
MD5 eb8e631da398c808990faa6974956c1f
BLAKE2b-256 efc082abcfb13fb07fdb5128ba3372d7687e04439620091efc08b6245a8b5d5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e8f58bdf85ead8bef0963557bf1785f1ef0e12d20f7edccf9081303947e2fe8f
MD5 34f3607fbe98d7c072da6f638a2a816d
BLAKE2b-256 ebd4921af77c45c2dd924834aaa243aebee4237bcfed9141c6939a56d3be94ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.17-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 466c8ecc47e0173eeae3217203e4830cb8c6db6a6610615433fe4710044d2272
MD5 4437671dfbf687848883d5bd42548a07
BLAKE2b-256 8e6550e76f132459a1816257498d48e2b8c4a7e12b30ae14ec3489b4e6435679

See more details on using hashes here.

Supported by

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