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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.23-cp312-cp312-macosx_11_0_universal2.whl (547.4 kB view details)

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

tensordict_nightly-2026.6.23-cp311-cp311-win_amd64.whl (617.1 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.23-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.23-cp310-cp310-win_amd64.whl (614.2 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.23-cp310-cp310-macosx_11_0_universal2.whl (544.6 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e79e350fdeedff60e5ef7d211e5b08835fc852765f3c1d16e2b3e6411a1cd7e7
MD5 0e6011c6fb2bb9a6151f7f62d6722610
BLAKE2b-256 f2bed35c6c1a7b8ffe22ff0942fd6a97e05f773d80015aa0aba0f12cd4d05131

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 378dbaf718038baa68b103e1f795983fd15686447465c3911f30abc84dd1e0bd
MD5 72e2ab272da22c225fb291a6b5aba92a
BLAKE2b-256 7cde1722fc64dfdd449381ef1991fa8035819e0ab650fcab3e38d57c3e2f6fff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6adb4b22af669f178e73044938144d4a0f620128f7d382b1aab3de3df98addbc
MD5 b735f568f3e63965cf711382a9904e62
BLAKE2b-256 3b93443a438ad89b0ca8d4de272ec5af8100ab0ccdcb50e937dec596adbfe24d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a6b0661696f90395be521b8fdd5f04b4dafac6cc429b871a6c0785fdd53951d2
MD5 ab7fb6f6baf1da9ecc9f40c04ce0cb5b
BLAKE2b-256 f9f7a3cdbf2671807913f2821f406f74293ece01523337a3af261d16719a5a34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 eef18c3f881673a9c6fc3a87e47af80c8e4728940373747f08b6e3e266d36c72
MD5 e434b0e3a98aa173d6658659951ce069
BLAKE2b-256 1c0bb1cf837e9e37aa482f6d5c7825af1301ef9abb4a5246959f002fa8ce9d11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9b91e3f840444df070a184ef4c2eb0debf71eb72e3e0f8bb41279f0977f719e1
MD5 c07c6ef999ca0416054bd68573fd9342
BLAKE2b-256 62c1d3cd9ec8ddb2e783b608d88ac7a23f0690f9957b268ad0e824bf5da4da52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 eaed90313d90003e8959d6e2a2d39cad149a518176a5811d5a7c535c2722c0ad
MD5 a8d2b260e6dee7bd16cb1f2e45b34ef6
BLAKE2b-256 69a688ebe18c02927013701ed294788edce875d480e18b5dbb791b16246f44b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3d162e074e4acb2b3e3cdc133896e5a3e3c4e9548a4acb6e0dd9658528cdadb3
MD5 2d77957990e414125d79e66a4fef0a3a
BLAKE2b-256 0821bb223a934ff887a1da41e895632f9ab1325b3907f14235b84ae4f0f8f1ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6e380d8a1210688634cd951a09843e03d771535ac7533092eb0a18255ccf73ea
MD5 88404e85df75303235ac76f683d1db7a
BLAKE2b-256 2a2f20388923004ff7e0502f1993386a06294074199c1e91259ab178e204ae41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4617304f06e473b0322cb047fbfbb1e77d8caa358d1825428913ccb2c4acf3fa
MD5 ee070a3b9886792ac1e729ba2dc5458c
BLAKE2b-256 eac410d671da327575fd2318b9a2c05cc54ec0c6bc300d338c8e36cb6df8bf65

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 62198cdf13bc030b73e1e4d4f18b39f6f946cf2fdb807003c9280cf344177bec
MD5 463b29f2ac49db5b1c3566c5c4aab67d
BLAKE2b-256 fe620a3fb6b74f393f523372a3e063fc1440467a69aa0c37cd4a6abf140714d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a16d6f78e6440957dacf512436d977b88f1952c315bfa06bd8e6d0bffaee53db
MD5 f458a5d4d4dd61777f6ff0433543f231
BLAKE2b-256 c14c17ac112ac542c40b21196563a87d3db192974faacdeca483f8ff4b51dc01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3fd91ee5ea093d6a46b73c85c26734c009dd7d4d05a5d41e079ad96d6c1c8d5f
MD5 b0713e6a5622920b08f00144d262f980
BLAKE2b-256 f7f05bbae038384706cacd3fd21969c1d957559ae71cb28040964eb484e4eb0f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 20f57376689dc3e38503a2e6699d641eb47953ddc8389e0336dba0d39e123831
MD5 27d46fa92f41bc62a59b5ed59f02a91e
BLAKE2b-256 db1c27a282b90166c8f1f2b6c91ddf19fb035349ebc3e06229ec591f40147c68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.23-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ec612bc8a6bab6e9c54e9b966600028cc792c07fa175ced03595d766534e90c9
MD5 68a9c8085893cf51523d9cdc7971db4c
BLAKE2b-256 26b9aec00068efe572078efed32b3f160d702b41fa42b5252be4af3ff61e36f8

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