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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.4-cp314-cp314-macosx_11_0_universal2.whl (549.2 kB view details)

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

tensordict_nightly-2026.7.4-cp313-cp313-win_amd64.whl (623.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.4-cp313-cp313-macosx_11_0_universal2.whl (551.7 kB view details)

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

tensordict_nightly-2026.7.4-cp312-cp312-win_amd64.whl (623.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.4-cp312-cp312-macosx_11_0_universal2.whl (549.0 kB view details)

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

tensordict_nightly-2026.7.4-cp311-cp311-win_amd64.whl (621.5 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.4-cp311-cp311-macosx_11_0_universal2.whl (550.8 kB view details)

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

tensordict_nightly-2026.7.4-cp310-cp310-win_amd64.whl (618.5 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.4-cp310-cp310-macosx_11_0_universal2.whl (546.8 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 79744f2180b1eb69fb6cc2d72fbfec6625a61255de1aa60ba0146c766741c074
MD5 02c28d6f64469bba3f4d6eebae20d83f
BLAKE2b-256 9ae4d66d9987f84e02036454642c8544ed8fa74813fff88fc4e4228039ee9c49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 54b6d6860e40e253bf618af8cc25b0267d432c6d37192138e99e5d1803880657
MD5 a1224570836529781fa074abbd7acb3b
BLAKE2b-256 8ae010994720db5bb96e7700acec236eebc677cbf176ea12e95458720f19be57

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 bda85e452260e7dc4a74991d977914a9b1b1f517eca146176c0e56b2bbc3ce2f
MD5 e95f1c97831978893f8d81f54c55fe84
BLAKE2b-256 bc93ad36dcd8faa9eb82388bdf116a677c7ff86b92d50d73cfbd465bda63d310

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6cd17da5e035eb0c1b7ae0d374f3a056ef1dcb2174fc68b6eb02b25274799058
MD5 1ddb86314af5e6f068b5593a270cc5d6
BLAKE2b-256 da2e017c8124cbc9edbe5d71a89e0a42f9f3cbf5873b3004bfae2df8738a5c3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0b67a19f5692b58a1a9a44131b7e7e095a9e2bcd0df8444d88a5c8723752c1cd
MD5 54bd25e8162e56ff803fb48f232718a6
BLAKE2b-256 5cbbe72714cdf4be9d07044c8083bf857ace7e0a944ec1e4b9d934e2d84d141e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ce6ef123a2748ed82349e33094a5b898a7d3084bf7d404d4a948b45cb8f2d19e
MD5 917642ac786ecb17ec406771d27dac03
BLAKE2b-256 14feaf21499e17e158ac82dbcfeb49eeaf4d8e4132699167b13b7440758464a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f3d8d938d4542e71a23a44ae8049fae7090e9b8d633ac69284c4cc0a71a4acab
MD5 d0025376eee067c299a2588ec870e6f6
BLAKE2b-256 913705b2588a2efecd90e57a38e9e5273677f642340c1609b40998ed6903d6c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 009791a41caf02d899b55b7270d34b1433a85d8abe8e125f6316ef07165071c2
MD5 3abb4dd425a294336bd9c10b32a2342e
BLAKE2b-256 372370fa7a76a632296a6364691f8a6260b1f801d9c826fe6c264097aabf7b31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 dbf0fb8eca1d41456bc4ce15b4b82f65dc7d5e1823e85676f098d6bae6a1874d
MD5 e753894e7ab8e93ba9a88c3d40706547
BLAKE2b-256 bbf99c8a6cb1d3eca5d08934a51c977ade468cc9937453ae34e81b38972f121c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f9e2d9b20e79b739807907f3b171be4ab2ed7ed78dd0ea37d31a50b5cf19efb9
MD5 444a9f828b25c291104978bd6d3a255d
BLAKE2b-256 e2981cb4fce50cc3412f1055f2f38ca5ab293df37775e9e34d12d389a735c8fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b29288a587b92a9ac4ddb9006fc2557aaa632c2d06d5da90c955c53769734b82
MD5 4780264f29f9096600f80a01c4543c4f
BLAKE2b-256 f3dbdbe4513970b98b17bc8f5ca18a685df75880abf3277ae026e682f23a2371

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8b684b21cce83abb554bb0c4c382a9529b7ade9be2d1f00be88223eb506ff183
MD5 30d1b6d01fac0e73f0b4b97368720fa2
BLAKE2b-256 d5d22c3f3aad7a917deab732e6579563e35291d88de6affa5d8499f62d74613a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 85fb1a27fc8ebd97d56fbad401a467b1aaa88328070675d1608a760fc4d61bf5
MD5 20d668e1c61b1147ac044696756179f7
BLAKE2b-256 3876a605d14aae90e5a3574304420c294ae5470bead6ebc34560a3e830d7087b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e6a6f2a244548a53bea04ef7416f5fc0984c0529701e9ab77dc78a804fcfd053
MD5 87e133986928bfebd91c3c818e594a80
BLAKE2b-256 0712f49511b7b141e6fcea97a6171ec3ecefe8b54ffe4ec76627ca99215c0637

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.4-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ccf08b4e688c92868315b36425685a4e94158b157b5d658440a0dd1d651412f4
MD5 77ae84f8970a7e0f4285cbf9893d8f09
BLAKE2b-256 c1ac332d3e820ed0d48b017f6024b0a8a40b76e956419690467ee610dbf636f4

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