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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.21-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.21-cp313-cp313-win_amd64.whl (618.9 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.21-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.21-cp312-cp312-win_amd64.whl (618.8 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.21-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.21-cp311-cp311-win_amd64.whl (617.1 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.21-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.21-cp310-cp310-win_amd64.whl (614.1 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.21-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.21-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 979e8701a990a3cd80f4c9d33b163e03e75793e88071b724d5921171081e72eb
MD5 446cda4f3f4c5255718a148fb93e22c3
BLAKE2b-256 2c803ea3b264050bbbd2e1f43cf0cda271c64399722e595ec820dc34c1d1ff50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1551526274e9541bc3891c712eabcbd0bd86fbdbaf48577b8c747d17f21e009c
MD5 fcad370a967134da28492e93adae1fd3
BLAKE2b-256 29b1f82fe76cbe8ec2c558c09d8c836d207920a7686fafc4c15906eacbd28f00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b3ed5c49e9b1fe9eb5310197651f8ba9ecc383d310240640d216c0cd6fa5e0ed
MD5 abf48b51aa26a313c79f848b92cb8a41
BLAKE2b-256 1134b878a9a796d449a6442641923bff0137ca782d234895563a22d22c4d2353

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b63b4c5d2ffb4b72c4071f05f6c4fb0c53481c219943169762c8a1df3d80c396
MD5 4c5b34a599fa5d906453d5a7901fb6cb
BLAKE2b-256 7fdc0c8277a68e7c6241dd674eb4072415375369a1e2ba5563c3bb9ce10a9a80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 771bfd8f5b0ff157b35716435e85aac0ed3b29c1669584c3d3ffc41f607c889f
MD5 c9f7cd6bb3c82d2f9dffcfd0cc8ae2a3
BLAKE2b-256 41dd2abe372c7e2da091eabe074eb30e83ca916d2167031c4a45e67df9ff6bd1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 cc88f62594ab7e21f58a4fd2f67691ff8078eec0d936361fe0ee4eca1039b83b
MD5 beb779f0472a29880ed72ad9f3c719d4
BLAKE2b-256 cd9b6b215e73ce21d4db8fabdbfed7fef7a6de6609ee6bb38eb35d54b3f01766

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f1820037c86b0e26bfed4e0cadf0d5c7761dcfabaf5c75be82c991999751e8fe
MD5 da41e474ae6f20d46510bb6b8adf52b6
BLAKE2b-256 89a247e4646987c1ef27614e39443f2391dc58c50bed899af096aa3f3bb3be9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1886d46c54e15f5462eb764ac192189bf1fbfca27b2c83fcc05796640e3886c4
MD5 fd04a95ed8f92129c499d2dc151670f7
BLAKE2b-256 b13a40deaa8e90dcd6fdd783db38cb084a0e6ef20589de1144e8393f9a58601e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 30350505745392ecce0e8cc720327630dff049aea193f0063703fe0094902602
MD5 41671e6f3903c652c43fcc6f3675a269
BLAKE2b-256 f04cb78532709b826ffa73e2b7debe053d5a37456347c7825b8593fbc07de560

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7e6b3bb87626a11d167d7898087913a2b92702b8579ba167a4fd9fef5b9b8763
MD5 946f6bb17ed26a05143b696d728ad166
BLAKE2b-256 41703bb1c77412e3e36ac4433d9fa6d34f1aeabd35ded134df79b6f627865702

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a76e4946a71648686f12eca8b6526958448a14a45f80eb3bdf6965dc043c395e
MD5 8cee10db0d3f5d752c3019d4e4594e17
BLAKE2b-256 4a8b68db6cc5b35d19ee299b4b81029f04afe8d456d1500444cd52da86960016

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 42c27546319e1e925b072ffda6cd4fe77db08e1f3dd0164dc825199c2305ee87
MD5 f7c4cc41627d82f46b267638f3830e1e
BLAKE2b-256 79fc40511501b4eae420da14cb2d0239552d206913a5ef02df85dfb624c42ed4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1adec9fb56c533fadbce8f8b530eb5fed15df00b0095f337c1ef93edc3a64f19
MD5 ab9952005fe18e3604fe8072c217f962
BLAKE2b-256 9e03bf92ce88b6ee20c80e31ae9cadd7972cdaf8c0ee1417673c7eac4a29e417

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d70e6c0c35496c5d37a49569fbc139c644980f41ddfcb28a0869665b46a63b47
MD5 a49c54b3a5391096a8b55ce9b6086cd5
BLAKE2b-256 e6b6d799b7d5e0827ea28214452639541c91761c173206eaa32ed80c084526dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.21-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9b6806e54ab098169abae5ecb93ffd7bed30781d481337f33c44eaa9bd44d27b
MD5 e071924aebe72afa0fb89db8558d4a9b
BLAKE2b-256 82522f75042af59ed06081e9c64ebb56b41ede8b70b5c4e6e66308f9eb8d6f52

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