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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.19-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.19-cp313-cp313-win_amd64.whl (640.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.19-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.19-cp312-cp312-win_amd64.whl (640.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.19-cp312-cp312-macosx_11_0_universal2.whl (568.7 kB view details)

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

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

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.19-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.19-cp310-cp310-win_amd64.whl (635.6 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.19-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.19-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a04e801834d5ab7e4721ca6b9ffd03a373b8d72beb1d0aa6c09b000b5269c975
MD5 633fd51027f87601289f078f1a3f8ed2
BLAKE2b-256 d2730f1d160f3e80f7682b56bb5fbea1d49caf6ec51c9d01eb24bd3fff421ba4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 facc64bf8c843929f4e94087636f7b505b18c666b77d508fb02a95baf964d141
MD5 c6a68acf6cdad2906a887a4e8501b0b0
BLAKE2b-256 3480db0b3602aafa91059c803dc546e65bd6ac91456de6d5d708898a2198dcec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4937a58e8e6560262d94dd948af8a1446c096e07bb9dd3704def8a9cc2987df3
MD5 d382757ae6f0518d7b57dc62aabe9089
BLAKE2b-256 66763e97bc9c49e42eede240a64c20b31175a5e85ea21e166e925f68e9e18bbd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8776935e20e41cd3f18613aed049af77485e84973ce7af15de7b96712ea5819a
MD5 8907ad1316b89deaaacb7802f04cdd5c
BLAKE2b-256 6e7efa952f3d79ac39165ccdd6faeb32826d4be67ef4b4cd75436b1714f43054

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 fa8018749c1fa9220ef6cfe0298659fa2a743251358e7cf3b2d63c76dd22aa67
MD5 8672ec0c5009fdb6cadb088fbee14d11
BLAKE2b-256 237dc00cbfc2cd3f05cf033f0ed42045f98bfe9b64cf272d15a629c17cdff755

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 07bc284aa3dea3dba6e5787d4b1d4530fa41713820ec392c33ca318cb200e943
MD5 f0e5bc2dfb1afa5147f31ab5e4e50b6a
BLAKE2b-256 245d51ac85a3f8ba1e29e698207e61a133f9aec13402421019c77cc8dd1583e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a3fe840c2a0a2b94077e4ed88ef34470c20d5fb7cb3edad76bff63ce2c1d6df6
MD5 7b2928d5eeb22be5c214304bf6a50192
BLAKE2b-256 687e694ea509d6564f341f9187d149ae93c481d7abffbb282125658d19b6c641

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 711840b21bd00a9e32bace5716a903cde4b2729fa61d7648454d2c1e37dad3cf
MD5 92f0b5183b57692452c362bb59ace996
BLAKE2b-256 eaf9b9c9a1d16298fff2b7cc5fee37a14dceb9ed45538e151103cfb9dca30c4b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ec0fcafb063688c727a9db4902cd76090e11a8a30e753cd2d25ffe637313b597
MD5 a2d5a1e563af1e301f0d864752a165db
BLAKE2b-256 af6a8b349f1c18a450d01d756675222d1b41fadca27a643ebb7b399a529f75da

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6560f774d119324bfdb43e332131a1a2152d2470393fbc6ecd2b8fa8378cebd8
MD5 779e7cb585c57e540d5b8eeaf2379a2f
BLAKE2b-256 addbea099482807dbb45975dcff66b1bdcde7e182928beb1438bb64f36662ce8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 02738329554a1292844abfc6010e0f4e36511dfbe07943ecbc9301538a29a091
MD5 378dddb3ad527f2f107b5aaf230be48d
BLAKE2b-256 d1035c21930637ae58906b66c995b3f75b96dc44cb03657ab435a0a564509338

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a199997cf65705db1b135f6d572245d7d7e0bcdf630db7d212c7a9e827642d89
MD5 e90421e0c94cd51fe6b81a2ddf44c84b
BLAKE2b-256 8188b8cc334d05c465e24a65df6f36699183d06cd7f5141914833c0f48c91b59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e24c569e241b37d42a57aa0decca72639781af446b98b57c953e72b280baf439
MD5 cb848c13adcd7992929d4fd40d94d22a
BLAKE2b-256 10d899497ab19ca3bd65efbab6effc48a2fa48fb9c2050f4932171ebaf1dcef5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d4c54c918c67753972180f77b382acf924ad33a3da83cd29d274689cf76a7ae2
MD5 75dd7518f52dbeda3ca6c6680df938a3
BLAKE2b-256 1fdd1d8dedf8ebfa202b0e9274a7bcd2a1935c0251a6da963e3681a8e577294a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.19-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9c2031cc8c0d24c4a0e16a10fe194438c139f7cca61a25358c384f7a3506cb20
MD5 acfc82ae792735f33632170856ad81f1
BLAKE2b-256 bc1f72d1d25ef0b3d2281449deddd9ab3b4f3186b9e3d153d36aec269ba7c538

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