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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.22-cp314-cp314-macosx_11_0_universal2.whl (568.8 kB view details)

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

tensordict_nightly-2026.7.22-cp313-cp313-win_amd64.whl (640.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.22-cp313-cp313-macosx_11_0_universal2.whl (568.7 kB view details)

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

tensordict_nightly-2026.7.22-cp312-cp312-win_amd64.whl (640.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.22-cp312-cp312-macosx_11_0_universal2.whl (568.6 kB view details)

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

tensordict_nightly-2026.7.22-cp311-cp311-win_amd64.whl (638.6 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.22-cp311-cp311-macosx_11_0_universal2.whl (567.8 kB view details)

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

tensordict_nightly-2026.7.22-cp310-cp310-win_amd64.whl (635.6 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.22-cp310-cp310-macosx_11_0_universal2.whl (565.9 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a92a9f58bf993f4c10e64e46ba60c8d295f81375c83efdab5235cbd8f1285355
MD5 5d7881a0e93dd12379a7dd534729db16
BLAKE2b-256 733b358bd23aac822c7aac7b0bd2d38155a27bdc9090e30dede07da588eead85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9ba7f2414ff74b0245cbef0b51f36b640e781f120f792dc890a15c632af1ba0e
MD5 4b8fa6c275cbde26898d64729e068030
BLAKE2b-256 d26c92b80b64ea2e9887857beac5f00d02ca0b3caa076d400cc4d796a7ee88f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 478acd0bd791131e673a0e1ebefd8a1ea9c2c6ef117728e2330f72855fbdd9dd
MD5 69a5a2b054a5b42c10b691dd62e28180
BLAKE2b-256 1e93e839c02a0de8b7b59b5403edcdb1c2c57bc6b3de4bbb13061a90846a6b80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cb5d8b9c4a24dd0d47ffcb837e54863af2822fe772d0955a1f6784972ded0a00
MD5 9025bd35a780671dc7e4681fcc765d26
BLAKE2b-256 63f7ae9fb7c9cc97146fce5f53ecec5ed15bb22f8a6bae3f169eba9fb306dce1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4bcc27ba4612843453ce7ddcb148d010811940a9a8368a8ad857f6779d63de4b
MD5 5f9234e7dc3593dfa590edfd67c25d3c
BLAKE2b-256 a6a976d31ee7582f5432e17c1a736dd79c4ee3e07c80b2994bcb5ba8af2b1baf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2ecf2caaef9ed9b00dd15085744a89b9f9cce2e45fb3590c9775577c945e0224
MD5 e861e9e0bba48ad282db7ad043198b55
BLAKE2b-256 6881a3c4c73fdd1c57e53f4d3dd2bf58e6465b8d0a4e289dab86abd43ec42d34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 84e27f09036d18139496412e07b2937feffe4f5e365c7a180d054d8969e0117a
MD5 4955be943de42a4c7382e7f1c934d24f
BLAKE2b-256 6d3c5fa44b9b4d78ad8c38b99bec5411f2ba5b6e33c163976f40beb7f12e802c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d0a44766cf213cbadf57b7036ee22894fe40a50d246ebba903a88a88fb5ab13b
MD5 6c5c8cd0f1d556aa03354193c6cbbd04
BLAKE2b-256 8211cc7d81c0fa3630c55a4d142925efdf193a1a84a71945eb200d8df4f125cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 7eb79b5f94eb7e98cfa7d31eb97ed55e8c00fef3f1ab130ff483f00f78790602
MD5 6b0ed3045e441381289a63eca2f046c7
BLAKE2b-256 5543a2b539f00aa56e9537dbb7071f3568b51ef0e42cbc55ba36ec42d3e394d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f658ffbf98475e3bfe2b9afe4340405dafbc5e034e2bebd5911ef95c2440d80d
MD5 203ba311e9985ca8cae77c07606343ac
BLAKE2b-256 6f0cc2377553a21d9c248a664ba0ebc7ad10fc1ca83a2293ce0ce8af4611131b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bb33d2bfde939f0ba3431eafed8c456647d699db3c38e93a8e77571d1085eca1
MD5 f05772ffba9f516cb17daddd865f9bd9
BLAKE2b-256 fc6271bc56457e699f1f1a84f4b2cfdf60a1b1406cbce46a05944143d73474fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9710de3b0e54300df79286a9967bc63a565810d2468028b15ed5166bd6a09bb7
MD5 ff8df02c7dd9ce3cfd982b84391d5452
BLAKE2b-256 bd9732679f7c916709fa9bb5fc969382c9644be43a3b0c81398716d62f244086

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f204056f64f510ceb93bbb610da2e095d6ed8f32ba2237b4cd336aeb02b95970
MD5 f87847f675c88c1d728f1c82c0f344ae
BLAKE2b-256 1d0ccf28f8cbe08fca0c481169aa167a04f6ed3c6c55bcb5a41ba92bdf3574ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7eb8f5e21601ba11a06fceb5638171035d284bc8db9c8d8834cd376d756a560a
MD5 a0ccdd9a123cdc2e82f514833690d11f
BLAKE2b-256 3c416a305e9ed25e7758ed79f494b648d3c434ceadfd3a6c3fc7e6ad442b90b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.22-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9935cc963e6613c8311199a2a3bc84d2f95052144cb3162f3ed944ea757321e6
MD5 86f64fb51e3b777bfe2f7781aac31829
BLAKE2b-256 1f953af2165aab8b194f5c26d3d5fbe759c243e41f172c103fe67c9ba265382e

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