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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.28-cp313-cp313-macosx_11_0_universal2.whl (547.4 kB view details)

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

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.28-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.28-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 60fa9ff6e9b5ca9ddb807bc972c4d78210cdbeb6a8b04f412a89eb78ebacfac9
MD5 0ea2a786ae9d1a9967151135b279558d
BLAKE2b-256 5890916440f1a3ea8aa6bf76a462dbafcee86bcaeab42657e1b2b9b2987ddc62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7b4db0ff8acee0c0c17dc6d02b89c860eb7887d592dd71e8cccd1f96192991db
MD5 0b583c4aa6417574b655e179b2b22795
BLAKE2b-256 9d1a0239a7cb506c97eb19731355270059260efab840fba55bd31cbb8e76fdcc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 74aaefde4f47411e1203fa2dc9b32f73d61731b914c6a9ab4cd040c0347648ea
MD5 336a84e8a8c0b533845ab02fb45388ee
BLAKE2b-256 0d90db79206c7f222d133e714a56b229cc347dacdeaf7d3c42421a8b3756f735

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f798a16be5d3a09dd9546b34aad61e2529c281cd74f706dcd977482a00ad2013
MD5 85f808d2c77de38a6aafca32c0bb9b9c
BLAKE2b-256 5384fd365ffb0d7b993c496dc6cf38e2c27286fbb46d91e701b94c39134206bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 329d3d9dd55c93d8556647c996dc9e12409bbee45cf46d543d9b08821d575c73
MD5 c3225b4e0af7b517f2f6e739de8f6b1f
BLAKE2b-256 bb2c7de664722a377f57fb78edf5ff154fdeb3c80d88c376eab2ed8bb1ad6bf8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ac61987250042003b4cd9707a693626951f642fa408bfd45aca0b89d1e8165df
MD5 b0c22f98f2f3740db9f9519b76b0b10d
BLAKE2b-256 d9a4ce4aa7fae8ac636805029097f4c3520ef3140f6b95c8e3ef9f4009c7af29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c5fe29d290bb9edfa28ef98fa8e65400e969dca350987510c7a31d13e6e59205
MD5 6f1512a24d6d4cb32941fce5dc20ee2c
BLAKE2b-256 28ed24c13daf2ebb8fa6285c533551df5b06b6a98813634b403a799d59481efb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 847e128c978719492b3058932dd32339d03b998eb472d67e3dbe248093813404
MD5 6533888a4c888bf54023b32370a6c33d
BLAKE2b-256 e00ffc1b5a5f3396219a904ab3f42bcff77b25e2c5943ea7b75792f01d72d72d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ea6c3e0811e0baaa956ce69bc102b2281a4dd3feb2748bf100cd0b664956da61
MD5 b30a1d50e01a660d1563514a220fcb14
BLAKE2b-256 5aa607ce2d92ca66f2658e8dcbcb5f16594b0327abb71ab0d6a3d1b5a2891861

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2ba389bcd27d9a08b4c3a7e7ae95399dd739d9154a888fad8c1505fdd8007b34
MD5 d8ff61b4dd4e8356648f96116c958a55
BLAKE2b-256 ab5a23c0934721ed80121500e4a6a11773d31a7f87867826991b539c0cabdaf1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 858ee5eba43b22ca48cc21c2cf2802ee4edce462b91b8d8f7a493a724afe670b
MD5 71d42cc6f78e89be11be655333923256
BLAKE2b-256 d5d598cf425e298b4e357177cb33a8d4d239225259a75989cfac0523aaea4c13

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 92483bc49a79702f08cddbd85e578c78c3a545bb906c2f604f153fc6b0e1720e
MD5 e2f10dae38946366e44b973e1056cb13
BLAKE2b-256 c81a1491c38bcc0def3e4624d5c4e7306914a2755830a4dc2e6b5262426a9812

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0cdcf5cf80633dda8599fc1a355cd12cd478c41308ddc76315fc2a15f68db573
MD5 3da55f2dc18864785327be839e6cb9c5
BLAKE2b-256 f0ca806ea46e4ed791f0cb1f9f7211a0534b458d795fcda5ad7aeb913d6e4448

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bacff09b16ea304044230b0fd9c5c408db7aea7277f16fe044159f44dbb892f0
MD5 dc65df55b31b0266db5cb700f7d804e5
BLAKE2b-256 8994b9eba7ca01497b0ae52fb9b81f2a5713f521742447c188be60f757744df6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.28-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 81821e61fb13078d9ba90699f9984866f10f55cd2950f52cd12782346c5b5f7f
MD5 112603b63745def7f8857232b7e16613
BLAKE2b-256 e70a4f4669162265e3d0532fdcd72bde9a9cef7e434b54b7b79d64ab746ef573

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