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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.10-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.10-cp313-cp313-win_amd64.whl (627.7 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.10-cp313-cp313-macosx_11_0_universal2.whl (556.1 kB view details)

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

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

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.10-cp312-cp312-macosx_11_0_universal2.whl (556.1 kB view details)

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

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

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.10-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.10-cp310-cp310-win_amd64.whl (623.0 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.10-cp310-cp310-macosx_11_0_universal2.whl (551.2 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 d82ce17d8fdac4751250619f9ebe3ab4b9e4082754e896618a00c8db22c849a4
MD5 9c035834c617b4573dd7b9af6f285edb
BLAKE2b-256 e6fa976147188752570c0e8e05c5526603ae5f9c21adf8947a0ed09299a03814

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 16faddf43423236d5a90473c76ddac6fe615dc9092e2e74aec5af8b6ae0645c7
MD5 88b9e2ce62e0c9050246590b8b05e084
BLAKE2b-256 7af015e7b2a293dc30a162f078578ece86d182d0f42f3f754f033d1a499d39f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 cf807576145419f5a4b0bedc0a134b3a91e40a2b1148a7a63a14a9ed00598253
MD5 b2897ab3409d3fc30024cf481fc296fe
BLAKE2b-256 c642ddbd74536fb457988d3fa94da9d3560d83d752247dbdaf724cea08ebb1c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4750a082daaf552910f9748fd8a333c940437f3a0db155b4f0afce55abb92abd
MD5 8e5b2a83fe833b76a94952dc10b70d1f
BLAKE2b-256 7a1ba660f4243c6d363f1efeffe6826867b4cfbe76d359dc654cea1e6a4a990e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 fd88b417caad7f5f74a0f34883a5edf98951f94595c6de62ef60590ed0d319b9
MD5 3ad724b990bfc5256697e79ab9fefe28
BLAKE2b-256 3560c4848c36ace0d2c8b9ac7856d32c6640b67f55e1c0c2b67d4a03fdbf9938

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 16dfeb0782c0785c28939aaa0f80d6f841f6b090d0f83c4a6bab642a2f9645e9
MD5 32345bbee876a46f99844251bbb8d50f
BLAKE2b-256 348a04c589a3b65d5e5927cff556637af6d2342797f596c09f6b1b1b493ee4e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a87a58f18ef6fa7530d555e8267dadd1591fe645a634b15dcb84438d27a70381
MD5 b59f5cb51424abf25f2ce1865750a376
BLAKE2b-256 499d5664689ad3ce22415f36f336e13a6389fcfde3b9ac09649a211d8137df58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0e5bf0008a51d5600e54b87439028b8b1e2926f6ba8a258394fa0008b4f74ca8
MD5 2b7dc4010a91efb5b0c2b0289ce5a6e3
BLAKE2b-256 4db7fb7f0acecc613c3265fdb991a957da04e279733f31b9401dc3f9ec557047

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4e26d5fd87824a9386f5377aa36777dbfbfff8527d28776451e5ec09fcfe1be9
MD5 7651b75994cabb9283ccbf5fb5965673
BLAKE2b-256 d7e9d0e7e64292effe5069c0090aa106eb9b68b3be9c506e30950f7371f2c6ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 913ee39feeea355d80a20f1cfef43814a542c2b4d41f4a20171c63254671ec89
MD5 18f30c5917674338942d4e6b8ba8f0d6
BLAKE2b-256 e0db2aa328a477d4ca67279a2244ceba4d6ee3e49fc135eca94579f1c81b7722

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 892a47ada641171d072ae3ffdc27ca485366b71f52efce45cf1ef1f2196425b9
MD5 b06e329c894e50299b5e422fe5c95bb3
BLAKE2b-256 3df2801ab36d98ec2b6f0d8ed1f4430a907f2bf5608278dde7eb731ebbde9040

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 857919c823c870a24294c025fd9065f58f4beb0b0ec662a4a5ac70ca4ec8e175
MD5 935b9b15817e71ff2a366c73e0ea2a22
BLAKE2b-256 51023841f2151903aa983a183d34c3c324f061d75963e0e026be202564d862ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9e3be1926800e817ce4b0fc49f54fb426a1b578a75777c713b4ab19f87937eff
MD5 7f032f8f9cf152b743bb02a3cd3ff6b1
BLAKE2b-256 006447c6c498526389e8d266ca90774dd1e66e3ff0ffe096eb07ff66b3eed098

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 19fa78c9bcf59c4ae6df7717021cf773b7c2e687531a885b1378f30e1176553a
MD5 34dc304c1d884f203809d67c56c23055
BLAKE2b-256 40898a7af2adb04452e1ec0f5f7adbda6a540458d1242e46df401d77f90b60f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.10-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 db802edd8ead67d12b1cdea947e792e819a243f88f2901a6e8c1b674d732e1fb
MD5 d2d69f60102d7c8ef8ac1643c13144c9
BLAKE2b-256 1021364115fddf74e0676c18d132c69297e980ac0303f72fe311cfe441a4a82b

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