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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.30-cp314-cp314-macosx_11_0_universal2.whl (546.4 kB view details)

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

tensordict_nightly-2026.6.30-cp313-cp313-win_amd64.whl (620.4 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.30-cp313-cp313-macosx_11_0_universal2.whl (548.8 kB view details)

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

tensordict_nightly-2026.6.30-cp312-cp312-win_amd64.whl (620.3 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.30-cp312-cp312-macosx_11_0_universal2.whl (548.8 kB view details)

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

tensordict_nightly-2026.6.30-cp311-cp311-win_amd64.whl (618.6 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.30-cp311-cp311-macosx_11_0_universal2.whl (545.3 kB view details)

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

tensordict_nightly-2026.6.30-cp310-cp310-win_amd64.whl (615.6 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.30-cp310-cp310-macosx_11_0_universal2.whl (546.1 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 37fabf0587906bc972eea4fe648b23829b5f53c75e6d6576a828458ee508c38c
MD5 c746f1b50ba2d07d4060e311b3a08118
BLAKE2b-256 bd834a8d215d96bcd66436c2337631213f6593cc4ec6b9964c1e750eacd26dc5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4162bb0b7bf70293ef853076b2e4bf30e8473a589396937997591a43e11ab1cf
MD5 33dea7c1859417cbc7c07bdda0f6dece
BLAKE2b-256 57e55788ef70f84b54ab77aa39aa812d9d523983adc5a11e4b66de5ef5293fe9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 279592f471acf475f82c986f0644f6a0cd689012356704936ae76dbdc8d24898
MD5 b645d69a30890026f7da334a8152e49f
BLAKE2b-256 35aec80a25136f2017f7b127b5c8f56bb974262269d495029621ec9463159462

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 41bf194e7729533b6135b301a19ffc997bc65cd0178a822c1c544709f4ecb727
MD5 dfe77507134a455660494b7bbae130fb
BLAKE2b-256 9e87a9c19dc5c2fc3e5e61c754fdee1970989c61e483a0602adf8df1a46ad236

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c1b8ae08d287add6d336978219465a1ee003c673696a76cb5dd37b8996d63a18
MD5 c9b5846683ecc275b5fb304057f7e928
BLAKE2b-256 327a742d62a5d27ce37cf58eeb34a94b67432d6f49b181dcfcfc7401b6a96b83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 fbb91cdf3882d4b84399aaf9968c5afb83b5e8b876c70f6bd97d0672b4878a12
MD5 c601f9e14c4186c79d27b9d2550c6d46
BLAKE2b-256 1589efb1215d3a0326d3a80f39556ba8bf02f431a72068922b4905dcb7a98c8e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d2edbb87983cfc60aa3c64a86fa311a066f1530f08913b8905b799ed0a53ae67
MD5 ee2bf9c46111cfe781c91abae0956c26
BLAKE2b-256 692244ba303ce145a2ef4ab6caf142c65a8ec74ae99cff153da92eb14b358a09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 92b4f0d836fad09aaa9ac095dd25489065759975c2ac4c9b6071bd21aef55982
MD5 bae0b4745ea931cd5289534baf7e253d
BLAKE2b-256 6d56a4d8ac6e72ecaf2929251d7fa5b6cdf1d4ad99df6ffde1979e88372b1202

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 0a968e8ba793295c150ae75f086a9baec17c766aee4bb8c5d956f04da7f94392
MD5 40341ca059b26a091ea9f84bb75661a7
BLAKE2b-256 84d4991d7cc17c3da1c47373504eea9a931687648587480f814fd20e9ea06195

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a2a4f3b149f95780cbf4311ce43d391bc0b6aebbb02ec286fe7e9ea4bca84379
MD5 45bb7d84f49e898bc91a729b06c2384e
BLAKE2b-256 d8cd2823d7501c89663ebfcaa9c4b00288612bd0015e90e1eb29ce4e06940f33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d7a586de8408d132b4acc957836a17b425186d6ad466f1797e154195a7ba1834
MD5 45692c4672b5dbda5f7c2a71d4d05954
BLAKE2b-256 8ea1a0e51cb65c46c5e0f6d321da48f7a320c53528ed9ce9cc19a53776eadb22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2bab3c49a9955ded7fb44f3b2966cd0e22ff3f3349c49803bb67adbc95bcbff4
MD5 c87f9babc699f9bd7a99701e8429e338
BLAKE2b-256 bdc3a64b70df4ac6b6ee6b99f60c2bafc04de721ce3ed0c30507576334c3a41d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6781b2a24367992d01bdf823e4fce5ea5b92603f4099226dc0089cbea3887877
MD5 e984c40a7abd7589983934578f29674a
BLAKE2b-256 079b2d5d226d3427ad198b30de3876ea3881ff05e50c8c8e2da7ee2d78748fbc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5fb95398514f3d511f3ed708162b82e173ef145b7b15f85588280109dbd06c1d
MD5 376bd901909467308bcbb41910f57539
BLAKE2b-256 5155fe1f2bae01d41819c6bc1334e0b289ff00687faa6238100abf6b654824cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.30-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 1673144878e3ed6c021ec61af38ca0e17805d08d2e23b9eed3d475eec4824ba0
MD5 a2ddb1db83ad03a81e3f9e27e01c80d2
BLAKE2b-256 6929a4f9afb44b605b07ac3b8f55d5a43850eed9aadbc83469cf0306e5744738

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