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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.22-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.22-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e15104397eb3f7da233eeea9816ad5fc6f79f62c1701333388c044def4f675fb
MD5 7dbed105e246b0c7cd7e9f27e8cd1941
BLAKE2b-256 85fc4c59085234df9c3caa9827875879f515c75ed20f979d59515c34c11b2617

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 135fc529fbd546a3e03b014bcf395087e79fbadc8e5c6f3ef46dc8a70009a409
MD5 eb9b5566de7ca5eac58d5a1198cbaf7f
BLAKE2b-256 7bb9b133a210a5945649038a8aa409fe61115eedc306552358e5623f30ead443

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 1eb0f05e1c4670893476e2f40e2d47d934bfd4f9e88fe1e6b1c5dc89a649bf98
MD5 e96ddb99a1f85c76fa4b09cb8e681dec
BLAKE2b-256 1328589eaddb1236203e4085f8f81ec97b7de4e4a72a3aaf374ae9939f93c432

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 41f768992fe5395a390dd82db08259ad395d76a6509f1da9812e67fceba9d798
MD5 ef34cd18bba196ddd080023454ba1cda
BLAKE2b-256 c05066521cce0064c3280fcdf52e080027ca5e15e48532e95684889680ebc579

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3a4ce48b6576011cab25ea90efa03e8fb23eed7092a35d138b5d866eb2aa7b18
MD5 10f5e2360f4ec2a6c29800c5b56d5d18
BLAKE2b-256 2165e38f0d1858636636ec36831a0e9b0e042b76496e805979bb2c4e91db4cab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 93b3524da25ac33fd352404daa7fde05a9c2fb802948bea1f7bb7593065275eb
MD5 7d6215c3d3cc37b0e2ca0cb7c3305adf
BLAKE2b-256 99a7f0867144bf7d521b08f112c75d1e1a800f881cf79bd6e8fd075e4d1d6d12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7018413b4a76f32a12c8d94dcd8e6038d77c169bb7a00f1115622ba408df6690
MD5 04fd86acd8a0b1716edc5888d23b5bfa
BLAKE2b-256 f0caea964f2328c6b2885c7e8b8b4561fb35c468bd6d049a1683d8c66cc6f5d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e3eb3e29cef8b02fc4aaca40c7ff278d29721f10b2c5b394174d127d271c74b1
MD5 fec50ebf02c17b41b6c582702dfbb861
BLAKE2b-256 3c6c1f248c92d81f99b824c0e0303e970e9b51383e0ce7fc7129e284dfd9c7b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 35174d0bc128b5cf79f43cde38e49f08d1e0f3613b2b98badd47847d79e48a01
MD5 c208ae51e30f388c413256dd5554c1fe
BLAKE2b-256 a4ec771bb4ed479cd986276ebd4af8a0c38b681344f99b946d5e1946c2410b1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8860c7d115d02557ac5b51cd26901ef8654abd7bb42c9bf412d023dcc981dc20
MD5 b8a04dc6b95e543a9e80e2d527ab32ed
BLAKE2b-256 1afbdc6ad1b4201e655ef96956bf0d3e57f02e4853fbd9d6b59d05e0cc5789d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 aa03094a20cd8f0ea998d94259d1a538fcbfef9f6406c6e69e51f6a0919f7c0d
MD5 4c461150e80717cf029778974d510f7c
BLAKE2b-256 d05716d0f5a03673759df648edb0107477013a830717f750201ff91301579941

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 98a0059ef11a00ba5211d70f245946b30f6745f77deaeec89180e53823ba8cac
MD5 0c590eaf0c0fc9a48a4ae3951335e104
BLAKE2b-256 b2f31aed1dbb3c1cdc70fbdb5c774bcda95231b6097666d518c915b80745ab51

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 865cf43f1e0a499a48145be4e8ade88bc4ff514497313001bdb0b7b8f612fac1
MD5 50f3cace19fcf8c5073893abb61ebb46
BLAKE2b-256 d4e698a439f112a012ea7e85c65fcab916156bcb22ba9208c62c5d10647eb0b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 aec370b5cf0e76a9a312a3933565b04a9387ed0e77a440eb2a2cf6468f3504bf
MD5 5df14d1511ddf3c94fdd8bcbccedb308
BLAKE2b-256 b2a7c487a8d051a490216c5c0f604f610fe58052e9bf22ea8c995d39323363d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.22-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 cd6d227c902d968d9a75590aa31f18f5f5dcbf17fef769449e339392eab7ae70
MD5 d06096aa9b55512c95092736b86a6b19
BLAKE2b-256 97d6e11c8ef12b4a47c38ac8ac229219ebcc57a4c9f10d44b8480d3239e56a19

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