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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.1-cp314-cp314-macosx_11_0_universal2.whl (551.8 kB view details)

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

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

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.1-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.1-cp312-cp312-win_amd64.whl (623.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.1-cp312-cp312-macosx_11_0_universal2.whl (551.7 kB view details)

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

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

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.1-cp311-cp311-macosx_11_0_universal2.whl (548.2 kB view details)

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

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.1-cp310-cp310-macosx_11_0_universal2.whl (548.9 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ff94307c8870de01a4ae52a7faa0b9754fceea83fa139f57927aa78e1c12a452
MD5 2b53bbfc7e7ecbf6478736bc2c50ae90
BLAKE2b-256 4b4cbdd09b561adb8aee4fd2bc2b0e9ccb57f6a2d7b6c10b6764f0569a8f0733

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f1af4c0fc15f585b7ccbcf72b920d1449006ee3428289170697074fd95fb14a6
MD5 3a915ea8fbc9e67eb278a0a26617fb63
BLAKE2b-256 68f4d3aadd4c5db5a1b79f985fe2b775baddb7a7d338d1338da40031d8045c4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9fa9cd77a565fba7e1c88aa848364ef5a304fb4dc555a72185019d1f40e0770b
MD5 9b27cba97cd962074d7a1d482778fdc2
BLAKE2b-256 c85f3b86456f846cb8154f271e3d69a979a42f81116c3960020192975e958fce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 92446d9ee6f799e384b2e79ade44ed9ff631ebc64c82ee08129f35a7477c2b73
MD5 465b20569a1d483b0419a3281d32656c
BLAKE2b-256 f9b95bee4dfd9a1b0f3a7f387b791800656cb1da93c5e07a411f1fbbdf8ebcdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d2c59f01b5ab3c1ba9bd2f713d2750e70f1ee6af07a3352edf0dcdbb0c7e0e10
MD5 354286f8557fcbbcb99c67d5d10c7db7
BLAKE2b-256 fcc5b45dc3f7ce5e8227e305420cfb0a611ec9253d306e19579e69f575dec4cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 49de155b110b067443eb4ca772f058514550f12be3f1dc6386d59ce8acc0192c
MD5 836228294d7f6dae79759875bb8990c8
BLAKE2b-256 708767db91380e6e2eeb766dcfeb43e080c8f92d3bcac1c21a11f009a89cf6ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c3dab6a81a8fc71226f7a2ac6fec78b6fc2ff553afbde8369e84a59bd9672bd5
MD5 1216ad3fc62dc1a80eb0d129e3e08eb9
BLAKE2b-256 d20ab362636263c81e7b9293f16534165563b1ec044a673c0fc73e66c9b6fa4e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ec906296040bfb12778a30ab785a42104cc984672eca7f75eebe7268e1f8d5af
MD5 8bd4a2c0a680ad57bdf2ebf33f50bcd8
BLAKE2b-256 a8616f8a42395d2bf11beaae0483413ddbac67fd7216743fb7f76e9d5945b53a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3694aa2c774357338ffb1c7d8aa63525cff0f78fbb4f4d813430205d2f87402d
MD5 5d5e7b162a1fab0241093dade9e9655e
BLAKE2b-256 80684f3f9becbe0d827b865456b9248ca4e8b1c348ec74be46ec1e7fd35809cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 41bb8da93d026b24b50f137a042b049525736992a33d0234a52759de5f45f064
MD5 bcd343ef576998238b884b27d40004c5
BLAKE2b-256 d7ef25c6ed53d29f90c4f7c3c5523e2d41af849758149bfa4a3d9f591171bf09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 546af665bca2c5faa88697de995184907976563ebede8545bd5206388e6a2bb7
MD5 52710e799fa4c20009f30aba081a828b
BLAKE2b-256 8bb1c05e4c291457666bb60030d553af15685927bb221e590efd57b836be7233

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ebbb72890732426b8a238dc72da57396a30ad2106a6e5a4f85f87299adcf6f02
MD5 2c3bbbacad47ede28517be4fa6cc9f46
BLAKE2b-256 7a03a13090a216e66c541a2cfb41e82e618e483411f07bcf8ba4569d409a88d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d34c0301bab9696714ae1eb1adf9a80967062ff674fd2d77f0b664516b738463
MD5 c856cf9ebd9b178876389dac556e1023
BLAKE2b-256 e7d9cc0d8c6e497a562c313fe86dda7c4c927f1b2296e1e12ea962fb9c2fac9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 45978d371e3492ef7514569c4e37de8a7f5b7ec39dc2ae676e080391754f7914
MD5 8377c2d5e5814afc2f52f9cf7f1b1046
BLAKE2b-256 b98a28fef721120e1553bcacc9afb3b3a76856ae94a80cc9dcbefbfe40ee0577

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.1-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ec1cd750b9030a35d4e2f74e9a23b660ba5d92f9305af04c9dfdb3312960b3a5
MD5 e9255a3d05687323b0232d5084d92d47
BLAKE2b-256 6114bb12e35c62bfbc2a4e9250e3e666a491d3edbd9ba12c46ca7cc826af8fb4

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