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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.16-cp314-cp314-macosx_11_0_universal2.whl (568.8 kB view details)

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

tensordict_nightly-2026.7.16-cp313-cp313-win_amd64.whl (640.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.16-cp313-cp313-macosx_11_0_universal2.whl (568.7 kB view details)

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

tensordict_nightly-2026.7.16-cp312-cp312-win_amd64.whl (640.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.16-cp312-cp312-macosx_11_0_universal2.whl (568.6 kB view details)

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

tensordict_nightly-2026.7.16-cp311-cp311-win_amd64.whl (638.6 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.16-cp311-cp311-macosx_11_0_universal2.whl (567.8 kB view details)

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

tensordict_nightly-2026.7.16-cp310-cp310-win_amd64.whl (635.6 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.16-cp310-cp310-macosx_11_0_universal2.whl (565.9 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a495c4ecd82c1df6ab4580b69abd0a1346530d3ef872f123b9ab5f67f7c8e918
MD5 a6bfdea6e57aa348050c34228b915258
BLAKE2b-256 394f5dbf63e0ae999c95dd31588c83a4f73546ae9d4785823e2d2a98ef5f829f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 89edcae98b11d6cbdce38ce64cab7f2a2b3717786f63f28f5d8748861562a3df
MD5 ed85503e2b41b9947524d9786157bd81
BLAKE2b-256 205bb50884aefa14eb47f7a0d999353deb00ba7ed0e2dd0714cce1fe47938225

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 e133e14c50215ae8b38a224dce9d9f2a8c0798d71d5a51c4f143a214e6660f12
MD5 d0cb3081edb1cde94c218a1b1117736d
BLAKE2b-256 77d5f2329afa06fd716ce9094dfab8f4a4f9b98506fa25400745283c097d8ec5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 426fe579f317447a5b58d8efff2f14e343976efb9e518693ce32271772591a38
MD5 74707986183767931941d7fc7399bc1e
BLAKE2b-256 f47b3ab3fdde2a9eedfc224f8d5615e9cee813f66ff10c41fdd35b31ceffa46f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3620f78b4d52e0ead3460ffd7b15ade19323dab558b43c4ab361a6adc2fddc00
MD5 584c1761550c2ec2fab714127b21e66a
BLAKE2b-256 b09a2b2b2d316d908b04b57e3cdf23eb57c3ffe27f8ea2d558672476f5405644

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 33c879cf4ee3e0bf20e27c0113bdd84437d6d773efdab85af1ef8608adca74ab
MD5 8c21a305c84c5b3a89de4c3987033da8
BLAKE2b-256 a733e8b851e6c84d57538e88e9814f31fe46af71e6ecf69c5a45076fe0341bed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 07653537e7d736caeefffbf129c0eb5af5bbea972fa3cb6d41cd6595890b6bc1
MD5 9d97b0028ccc3a1a877f6334100bf1e3
BLAKE2b-256 1d113865e4d574074a15dbc39cbdb3c962f428a4470523056e5e723fc079ec0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 41025f0c3e0c43028634402c3f6dc4f3cf4c7cc7d09180c2bdb78192c26f0a06
MD5 c635051f2f7e26a42eb17846b433038f
BLAKE2b-256 230591240410c392182f277a93c22c630cf4d9d02ebee82ffa1b2685ddfb97a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 18d6cb183a6690d94c557b468d83c0bf0514db3d239cc02a7d871aaf75bfca26
MD5 fdbdde53ddeea7c358acdf1895ecf7d7
BLAKE2b-256 788971a8bad8ccd546abcf39baa65fac260ff5788a3f2e53070dc527cd9c8948

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2678d22b8caaa70cb08de72b2c97228fb1dc28ed0dd79e6df6bedaa8b555134e
MD5 ffbd5d5044fdf7f097295f80fb05c0ae
BLAKE2b-256 c18700c37c72c7e222724dc32f911a7498582157d5b429db5f073df4cf332354

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c31d5323693badd4e320001436a8ebf4bf33fdf4f7d0eced635cb0ac185414b9
MD5 93488d7fac7e96d26c3f4c44ee32f4cb
BLAKE2b-256 741e3057da81f26eb091901e7807b7a9ca89fbb08014d834e1d94b4f85433f93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3860e5bb12e087892e2c09cb5c05a672d7583dff1d1893e0d4c579567d5fbb23
MD5 021d4d0f42e01dc162fdf31b0dab4eb1
BLAKE2b-256 431e881d0075a8366e88c59fb5de77d5b817cb383ac915655997fc88af598ee9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a20940fa09dbc3386b7cde706fe3099c946c1cea16014f263ed4bbd3ed5a4bbe
MD5 98664ad1d1e1335404501cf80d6863de
BLAKE2b-256 538bee716b9d9b31373485e13454a814ae08f4a530bc943cd400ce35e830d765

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b88cc1f3e4670615feaf05acf0be52fa557c0e8d362279c0d974ae12f534d7b1
MD5 be55c906d20bde13d41f3256888d4bb4
BLAKE2b-256 0ebb40a2f823760baf5adb98713b831ab548a86b034e4a6c3de61f0d0c6faff2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.16-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8ad2f0089d364508b17305caf36be7225a4b2ca6332d9e5bdca2af623f8ade49
MD5 44b9fed326435daad57291116e9b0a82
BLAKE2b-256 efa968422fd6b6db7e5efec5f8f46c4c36af56502972992baaf2097019dadad3

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