TensorDict is a pytorch dedicated tensor container.
Project description
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); passnon_blocking=Falseonly when you need an explicitly synchronous transfer. - Shape operations without boilerplate: indexing,
view,reshape,permute,unsqueeze,squeeze,flatten,unflatten,stackandcatoperate on the batch structure rather than on hand-maintained lists of leaves. - Low-allocation workflows: lazy stacks, preallocation, memory mapping and
inplace=Trueshape-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.compilecoverage 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=Trueshape operations, includinggather,repeat,repeat_interleave,roll,reshape,flatten,unflattenandcontiguous. - Improved
torch.compilebehavior 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_moduleand compatibility withtorch.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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tensordict_nightly-2026.6.4-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 614.8 kB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ffb60e7f1f2df183f4941269be06d8a33786749879016f55f9622867b6bc2ff
|
|
| MD5 |
d260d675e62df258c11e8f8866915d2e
|
|
| BLAKE2b-256 |
3447e1828c03efb9be248ea67f06ef001f900e3eb71bac0f634ccbe8d1387063
|
File details
Details for the file tensordict_nightly-2026.6.4-cp314-cp314-manylinux1_x86_64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp314-cp314-manylinux1_x86_64.whl
- Upload date:
- Size: 560.5 kB
- Tags: CPython 3.14
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b82d401ae1f0c375311769e01ef8627a12cc928dedccb414527c76515aca447d
|
|
| MD5 |
f4d8af7e7bb9d445489ea21cfdb36e1d
|
|
| BLAKE2b-256 |
b6c338860114439b0ae67281b638c34b601e99eae82362ef197b6a159ca517f1
|
File details
Details for the file tensordict_nightly-2026.6.4-cp314-cp314-macosx_15_0_universal2.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp314-cp314-macosx_15_0_universal2.whl
- Upload date:
- Size: 542.5 kB
- Tags: CPython 3.14, macOS 15.0+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
927e7005e8c51e605b198e49d86bacde63f6a5a65f57424f753f542e3922cc6d
|
|
| MD5 |
87bb00b071072f3669cc421ffdc37555
|
|
| BLAKE2b-256 |
1409174d60ab67478105b448131d004b8bab274006e5e4c80a4f9e195f9e1356
|
File details
Details for the file tensordict_nightly-2026.6.4-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 613.1 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41f253864a3cac6cc065c7582039f8f257ad2fa51c018a19e45a9ac2112fc0fc
|
|
| MD5 |
a848e6086e1ea47c40878b989a23aadf
|
|
| BLAKE2b-256 |
882ee9133085382b7a12a37b13249762e81a96ebc73bd0732ed71ea666002cc2
|
File details
Details for the file tensordict_nightly-2026.6.4-cp313-cp313-manylinux1_x86_64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp313-cp313-manylinux1_x86_64.whl
- Upload date:
- Size: 560.6 kB
- Tags: CPython 3.13
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5688883945888cd706d18c45da4a555d1dbeaa1f24170bd3d42645d03b1002d5
|
|
| MD5 |
d02955214fb8425d0d4e3752b12a671d
|
|
| BLAKE2b-256 |
5d12e0f31916357b13de98a7cd36ae0bef404baac6f39a39bea957c843ae0ed3
|
File details
Details for the file tensordict_nightly-2026.6.4-cp313-cp313-macosx_15_0_universal2.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp313-cp313-macosx_15_0_universal2.whl
- Upload date:
- Size: 542.4 kB
- Tags: CPython 3.13, macOS 15.0+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
95882cf74d9a7fd3ed9c2b7d623927ebad60eb3e908d655100bddfe50f89dfb5
|
|
| MD5 |
67c7064d71fed53af8f84f082808f61b
|
|
| BLAKE2b-256 |
7766d80043af21d1debb23df7ea574717212ca6a505f2d8a53c18e29857f876b
|
File details
Details for the file tensordict_nightly-2026.6.4-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 613.1 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8961ce268c2d08584d48842bd14eb4010446dd7268ac675b0862291f2718ceeb
|
|
| MD5 |
4ec29704ed146d2099148a38212991ee
|
|
| BLAKE2b-256 |
b8b6e38fe86c9651f7c6b8fe4da4902aadd675367772b6abb3a0d5a3190f3455
|
File details
Details for the file tensordict_nightly-2026.6.4-cp312-cp312-manylinux1_x86_64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp312-cp312-manylinux1_x86_64.whl
- Upload date:
- Size: 560.5 kB
- Tags: CPython 3.12
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25d6a740d849cd2972d162c6baab01e1b74055a81cac91be14eafcd958be98a2
|
|
| MD5 |
7de99487069f8c396bbe550c8ab79bfc
|
|
| BLAKE2b-256 |
8641fff85cd85f541583c28d453e07476b68db2d4f5179822b6a551cc213b8ca
|
File details
Details for the file tensordict_nightly-2026.6.4-cp312-cp312-macosx_15_0_universal2.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp312-cp312-macosx_15_0_universal2.whl
- Upload date:
- Size: 542.3 kB
- Tags: CPython 3.12, macOS 15.0+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3659e858cbb428257d9ae17b2af1d950a4955643e7ccae77635c5c869f03778
|
|
| MD5 |
7bbe1e8a2ab8294e7c9919a683199cf5
|
|
| BLAKE2b-256 |
3b06338c008b9eab693ec316a0f920ce258131c2b8a3e5bbf887214c4f3b4885
|
File details
Details for the file tensordict_nightly-2026.6.4-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 611.9 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15b95373824122696f76b8ab5b1ea4f496be41472d71e6d4a8ecd107e3139dc1
|
|
| MD5 |
163b19eeb1e1042df6e6db5b9f60e925
|
|
| BLAKE2b-256 |
43a8fed46ac48df4d4af66afaf47e170f91ba0ac48242925b410c7d55399e9ac
|
File details
Details for the file tensordict_nightly-2026.6.4-cp311-cp311-manylinux1_x86_64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp311-cp311-manylinux1_x86_64.whl
- Upload date:
- Size: 560.6 kB
- Tags: CPython 3.11
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a86270f37f292c0ca7f88456a6648d0cac2cc855e9e94ddb9968a8f36e914f43
|
|
| MD5 |
9567d17fbe0013cfc45b99f89f323e67
|
|
| BLAKE2b-256 |
452d44255ce41cedaf9bfdbe23d3e10ec4cd7be704f4845ab95c93507cd9110b
|
File details
Details for the file tensordict_nightly-2026.6.4-cp311-cp311-macosx_15_0_universal2.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp311-cp311-macosx_15_0_universal2.whl
- Upload date:
- Size: 541.5 kB
- Tags: CPython 3.11, macOS 15.0+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
850a75e630f85851246d915eea943a144f9f62796d26ce8f1a53704de4f38d32
|
|
| MD5 |
6f3024646579c6b7349adb9ccd319f68
|
|
| BLAKE2b-256 |
ba8fe7d7640b17df47e60fa90f44b9de2fe4dfec1dc08bf62d02bedf515ede0d
|
File details
Details for the file tensordict_nightly-2026.6.4-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 609.9 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eda95a6850b906588b6ea263db4267b95dbdaf7f71a1aa705f292bbb429c22cf
|
|
| MD5 |
fd33beebc3fe7bd97d1ebfc25099f2a2
|
|
| BLAKE2b-256 |
8f7f49fe73ee394df440bc1a0382366debd85f025211b483f74e13c884445a18
|
File details
Details for the file tensordict_nightly-2026.6.4-cp310-cp310-manylinux1_x86_64.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp310-cp310-manylinux1_x86_64.whl
- Upload date:
- Size: 558.8 kB
- Tags: CPython 3.10
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1900643f38f53104dc9a8a551c75ee96f7670235d430d006d95c3ea2be705a35
|
|
| MD5 |
c3a21f2858d8ea352e9801d9b412bdac
|
|
| BLAKE2b-256 |
97f108a2415a8de22cd1240814a56aa8b583fe38253a85015b49b8a667fd0b1c
|
File details
Details for the file tensordict_nightly-2026.6.4-cp310-cp310-macosx_15_0_universal2.whl.
File metadata
- Download URL: tensordict_nightly-2026.6.4-cp310-cp310-macosx_15_0_universal2.whl
- Upload date:
- Size: 540.1 kB
- Tags: CPython 3.10, macOS 15.0+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d48b874b7ac4fd3ef57126ac3b45eaa012208a73b24e94cdccc0db1c1aafe6f
|
|
| MD5 |
54b3424d427114f322ddbbbdbedbfdb1
|
|
| BLAKE2b-256 |
6eefb875fc2787f76bcf46c56c20edeeda1bec70244846df24c2abed60bb0e82
|