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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.11-cp314-cp314-macosx_11_0_universal2.whl (556.2 kB view details)

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

tensordict_nightly-2026.7.11-cp313-cp313-win_amd64.whl (627.7 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.11-cp313-cp313-macosx_11_0_universal2.whl (553.5 kB view details)

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

tensordict_nightly-2026.7.11-cp312-cp312-win_amd64.whl (627.6 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.11-cp312-cp312-macosx_11_0_universal2.whl (553.4 kB view details)

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

tensordict_nightly-2026.7.11-cp311-cp311-win_amd64.whl (625.9 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.11-cp311-cp311-macosx_11_0_universal2.whl (555.2 kB view details)

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

tensordict_nightly-2026.7.11-cp310-cp310-win_amd64.whl (623.0 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.11-cp310-cp310-macosx_11_0_universal2.whl (553.3 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2c3e6e02c80f0ca918e8078d3bfd60e3311f98f3c4e5a8f541c28c414d5a9884
MD5 8092d4cf8d6aef835abc1ee5da347440
BLAKE2b-256 8ff8221819700fb99e84da5804ce684d8a8d865275320534853d0c92aa7a73bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cb2db418219a1fe4891d8c85660e469900b73fbbc6a6740ac8472dd99211426d
MD5 5d7394facf1114f50ffe1e3c75cd24f2
BLAKE2b-256 248b1aa3cc33462aa0bf26bd9c3ca3dee865a58542b254a421781dbd420ac07c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8bcc2eeacb509b3984c419fb648ffac3367505fef1ee7c8d9cd6d32123115b5a
MD5 cdbba2c691762abcdd261fcfdac24244
BLAKE2b-256 773b5083438dde0d4f7ab8a4cc7e94d87f5bdba1e181f4b002f75fcf739e67d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c90df507bf5b000c3ec8cd1477c47afa6b46e4051b66fe1b34f7f780dee677ac
MD5 035ddfb7eb024c83cd83a375b5fb4133
BLAKE2b-256 539abf129abe1a976a19ad52d3fd2a6a0a7d5140bfba7f63063ded421e9014ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b2a8b8eed8b7bdd02a5f78f9a8d0b54dc401a2d776194f61794179117a0c877c
MD5 7ca97d7567113c2c38482d417297de13
BLAKE2b-256 b7f119dd5a4df3fc035183e47023f1751040ddfba5cdd2919dda5294cf4841de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4a8512a65c484972a4f88a4efa51998b6f1c55d5176acbc8254e7d8ddcf5953d
MD5 ca4c1317ee3c54c7565cb849f51a166d
BLAKE2b-256 70992fc9e4848c306b5121fc516e805ff04e710e473eed5331f7fd9abaa32d8c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2e998d929fe3f26e76212fd7f160fe45ee718822ff7f1c10c53d2632feb0b4f3
MD5 4b6d5be927c4931f896c76ae8a89b482
BLAKE2b-256 6bb73a3a96820babffdaea629b3e17eaa8ac906a50fa357aafb2bf3a7f50b02f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 fa9f01a1931ac5991b18b89312e625dbd63bf1ce760f4015a2a4c97e8903dd19
MD5 096225ed1b70f56b211db08cf7f867f7
BLAKE2b-256 a83f207032d3eec5d524c13e779e506369277a8a73c0476bebbc96982d068654

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 f1ce17039f45810488b9f64e9ec65007728e9b9e137b23124bd65d429c5fe229
MD5 ac8e07b9bac140fdb64ebc2d2380dfe4
BLAKE2b-256 b47cda84b51f887bef86e8b028bdd1e51d233ae86e7d6327f1115e1eda74e177

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5bb4eaf2ab8996cabb27dea30ab7f984cec1f0684ab62bd9194dc02a774b39cc
MD5 0dfb3c1ad4ed0c2f8a923122ec997b94
BLAKE2b-256 2560e12b1f906b84fcd3ffa60ba781b1d1321155bcbbce1c2783216ff964a2ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0d51adc20752f823ddf567b44f417b9808385ebb2dd3fca0a00bc5b5d35f7ef4
MD5 fd37f0ec9e424a83849d91d8d5e0845c
BLAKE2b-256 a4dc1a8e3ed35de6bb20779b3f4cbc70031471a2e025c78e96898a7f530dbfeb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 01af59f42a55b27075531fa9ba44491c1ead975a7fee5892423160d8ecc0f627
MD5 6ed2b3cbecfc0699761420b4957fff97
BLAKE2b-256 d895ee984aeed18aaf626136dc2f873f231bba38d366a843069a8044748f7c01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 196aad8033b5d4476cbc93c645166cabf31ad25e52fde5cfa9d432625de3367e
MD5 58c1ad60d8fe4a4f2cbadfadedb9d8be
BLAKE2b-256 c8012164f5756761fcb005593212dafd360b27d7477c1ed669b4c00c03078e58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0ff45fc0ec34edc62a7aa9479a0e1e9a9802190acfc83be16ab51751188007be
MD5 a4d3c1c7ab2495ca8627e150019439fb
BLAKE2b-256 d7d7cdceb8403e7bc8c8cca0c417b24002a0f05e07db28dedd42697e5300ffa0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.11-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 5b9a1e34c5ace1c84288e75a976d06f0dde23079da9578d8c1be2827ee6186e2
MD5 8ff3df6d0baa27b74f5362fa7c13b7cb
BLAKE2b-256 20167ecc69416c33640bbb823c4a1dd1fa0fbdf61d0e2972da946887d7256324

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