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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.14-cp314-cp314-macosx_11_0_universal2.whl (568.7 kB view details)

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

tensordict_nightly-2026.7.14-cp313-cp313-win_amd64.whl (640.2 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.14-cp313-cp313-macosx_11_0_universal2.whl (568.5 kB view details)

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

tensordict_nightly-2026.7.14-cp312-cp312-win_amd64.whl (640.1 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.14-cp312-cp312-macosx_11_0_universal2.whl (568.5 kB view details)

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

tensordict_nightly-2026.7.14-cp311-cp311-win_amd64.whl (638.5 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.14-cp311-cp311-macosx_11_0_universal2.whl (567.7 kB view details)

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

tensordict_nightly-2026.7.14-cp310-cp310-win_amd64.whl (635.5 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.14-cp310-cp310-macosx_11_0_universal2.whl (565.8 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 82fcc2abe4acd45c31ea3c023698e84a2ecfc27fefe31eebc5c4a4804e0e86dd
MD5 e12c2b087ac96a05ed531b7a97827f40
BLAKE2b-256 f754cb4759c5e1f12468fafeab79e119ad06c9fc3979a29625a62aa60380b50b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 11be8994c0c3b0f5b0713a8d99cbf5022d14566e6a7213ef4884774ba1023cee
MD5 18bf40c96b3d9f44be0945edab9cdda6
BLAKE2b-256 4f5f27b978e448b476b9d1f48ee5f5eccb5ba8542c8beea955cc8868b24f5d1d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8baf6331573b91204bc0d478a4aeee775e5c3405481bd139461c03d7a126ad38
MD5 b6e19a72b260febe24798eab285d4421
BLAKE2b-256 779cd212894b40bead04554f4e754e7bcd4412e2ffbc02aa3c47c13d830e453c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 732d319019dc4e8795e89f2b6ada1719373e2809cddc93f644c107f26b0b3522
MD5 de24ba298d772c7eaf26ce09ef1c0c2f
BLAKE2b-256 9e25f2f67b35599a5e737d28e05d802955f601e3cfb9a009004444dafa65884f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 46e8d71a69d852107e6f8f329bc61a974926f2a069a4c63d0543ebb3f39b9423
MD5 327dcbdea591fea87c00a43ead1b2b74
BLAKE2b-256 538194dc16e8c553bb6b38fa9f68956ed5194fc5d06e7e71b86dcebd71173789

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 49fad98997182a6817f438f74e87691c448830429b8e8adba19d1089ade00661
MD5 1cba7855cd0e079936daab2a804dfefb
BLAKE2b-256 99f73d3ccc42903f0c980cbc28ecd41014dd2153f0b22ba5e6c3a68f1013f844

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f6e6f79fb05f79fe8b91633294aaea452f54d97e88ffed7c0081bf6dd579e0bc
MD5 e9e0033d1d4c78b9bf4d3c4bac6c2d61
BLAKE2b-256 f0d7da182f33c51fa0239b56fdf8db2e6332980177e395e4abd0290557722c3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 640fdd72f52fa4f981c74ad92f34300853f3a437ea3b44d715d7d5db0833efaf
MD5 98af483c0a87c483fb521092257bd585
BLAKE2b-256 9f0aff4829073f1af596fea074364cb2902e82e8a59bd96166aa44a0a80db173

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 fdb63f640db02cd90ae820e1225af58d49c5d018b703f3af0f8024aac567dcb1
MD5 d75b24a094443268cf54437f5e717b9a
BLAKE2b-256 4be414ec4a9df9b704046f233afa0e9c8ba2c160565ca7707eeca6fd50d39b4b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2e1915dc63b8f28bb8036507e2343201dd8c5e92dc1278a20852822f98f55c56
MD5 797ac9cd20e1eca4a8797bcd756c00fa
BLAKE2b-256 44083b7dbc7f77ffe0298f0e54245cbce96f43b1767ed925a7466ef14072b2a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d445c8bb49b4c36ecb0f4aab318c67fa8c9c20fd7f0f938da3aa69052604b9ac
MD5 03b585fec95dfcf0d5c98cadeb8c489a
BLAKE2b-256 9f13c8c2e2236d3923258800c2268f1fca73d16d9093f0b252332f60e0ecc6df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ce6b51051de8b524fb08834da7d8faf8aabe0fe578f1ab4afdbf39f8a31921ef
MD5 4002ad19d93428765add70289df53f70
BLAKE2b-256 d2e9de2e4f913498da8ae43d725889048cc5bf514e251c55e9962fa7516005c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 079df93685671321d3cf89315f025a41e4ae995b9b44b2cbe171f29b04886aef
MD5 372cdbc4ec337760b41ef0d0b7fe91f4
BLAKE2b-256 408282202165a1687827948b280de7fff4a48ea51393798d7b15c2a0e37fc0be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ddb56b049f9fe45298e08fff3aeecb6ffe59f9e7c0e5d34b93eadbb73caf81a5
MD5 8d98c01affb6c62865658ef06dad6877
BLAKE2b-256 e2d032ae1d2ab8e3ae6b16d7ff16f67e60a3ab3251509d7683fdb25e049b4488

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.14-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3791d09134a628d05bf1638ebde790027cd8513661868f54460e44129cd4533d
MD5 cbd7b4257c3ed3879fb20e12ebbdf616
BLAKE2b-256 8b3d528ef3f11922dce4355351348e6af7177290569948b1ab6b4d32ebc4d943

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