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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.4-cp314-cp314-macosx_15_0_universal2.whl (542.5 kB view details)

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

tensordict_nightly-2026.6.4-cp313-cp313-win_amd64.whl (613.1 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.4-cp313-cp313-macosx_15_0_universal2.whl (542.4 kB view details)

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

tensordict_nightly-2026.6.4-cp312-cp312-win_amd64.whl (613.1 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.4-cp312-cp312-macosx_15_0_universal2.whl (542.3 kB view details)

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

tensordict_nightly-2026.6.4-cp311-cp311-win_amd64.whl (611.9 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.4-cp311-cp311-macosx_15_0_universal2.whl (541.5 kB view details)

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

tensordict_nightly-2026.6.4-cp310-cp310-win_amd64.whl (609.9 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.4-cp310-cp310-macosx_15_0_universal2.whl (540.1 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6ffb60e7f1f2df183f4941269be06d8a33786749879016f55f9622867b6bc2ff
MD5 d260d675e62df258c11e8f8866915d2e
BLAKE2b-256 3447e1828c03efb9be248ea67f06ef001f900e3eb71bac0f634ccbe8d1387063

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b82d401ae1f0c375311769e01ef8627a12cc928dedccb414527c76515aca447d
MD5 f4d8af7e7bb9d445489ea21cfdb36e1d
BLAKE2b-256 b6c338860114439b0ae67281b638c34b601e99eae82362ef197b6a159ca517f1

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.4-cp314-cp314-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp314-cp314-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 927e7005e8c51e605b198e49d86bacde63f6a5a65f57424f753f542e3922cc6d
MD5 87bb00b071072f3669cc421ffdc37555
BLAKE2b-256 1409174d60ab67478105b448131d004b8bab274006e5e4c80a4f9e195f9e1356

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 41f253864a3cac6cc065c7582039f8f257ad2fa51c018a19e45a9ac2112fc0fc
MD5 a848e6086e1ea47c40878b989a23aadf
BLAKE2b-256 882ee9133085382b7a12a37b13249762e81a96ebc73bd0732ed71ea666002cc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5688883945888cd706d18c45da4a555d1dbeaa1f24170bd3d42645d03b1002d5
MD5 d02955214fb8425d0d4e3752b12a671d
BLAKE2b-256 5d12e0f31916357b13de98a7cd36ae0bef404baac6f39a39bea957c843ae0ed3

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.4-cp313-cp313-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp313-cp313-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 95882cf74d9a7fd3ed9c2b7d623927ebad60eb3e908d655100bddfe50f89dfb5
MD5 67c7064d71fed53af8f84f082808f61b
BLAKE2b-256 7766d80043af21d1debb23df7ea574717212ca6a505f2d8a53c18e29857f876b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8961ce268c2d08584d48842bd14eb4010446dd7268ac675b0862291f2718ceeb
MD5 4ec29704ed146d2099148a38212991ee
BLAKE2b-256 b8b6e38fe86c9651f7c6b8fe4da4902aadd675367772b6abb3a0d5a3190f3455

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 25d6a740d849cd2972d162c6baab01e1b74055a81cac91be14eafcd958be98a2
MD5 7de99487069f8c396bbe550c8ab79bfc
BLAKE2b-256 8641fff85cd85f541583c28d453e07476b68db2d4f5179822b6a551cc213b8ca

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.4-cp312-cp312-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp312-cp312-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 f3659e858cbb428257d9ae17b2af1d950a4955643e7ccae77635c5c869f03778
MD5 7bbe1e8a2ab8294e7c9919a683199cf5
BLAKE2b-256 3b06338c008b9eab693ec316a0f920ce258131c2b8a3e5bbf887214c4f3b4885

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 15b95373824122696f76b8ab5b1ea4f496be41472d71e6d4a8ecd107e3139dc1
MD5 163b19eeb1e1042df6e6db5b9f60e925
BLAKE2b-256 43a8fed46ac48df4d4af66afaf47e170f91ba0ac48242925b410c7d55399e9ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a86270f37f292c0ca7f88456a6648d0cac2cc855e9e94ddb9968a8f36e914f43
MD5 9567d17fbe0013cfc45b99f89f323e67
BLAKE2b-256 452d44255ce41cedaf9bfdbe23d3e10ec4cd7be704f4845ab95c93507cd9110b

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.4-cp311-cp311-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp311-cp311-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 850a75e630f85851246d915eea943a144f9f62796d26ce8f1a53704de4f38d32
MD5 6f3024646579c6b7349adb9ccd319f68
BLAKE2b-256 ba8fe7d7640b17df47e60fa90f44b9de2fe4dfec1dc08bf62d02bedf515ede0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 eda95a6850b906588b6ea263db4267b95dbdaf7f71a1aa705f292bbb429c22cf
MD5 fd33beebc3fe7bd97d1ebfc25099f2a2
BLAKE2b-256 8f7f49fe73ee394df440bc1a0382366debd85f025211b483f74e13c884445a18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1900643f38f53104dc9a8a551c75ee96f7670235d430d006d95c3ea2be705a35
MD5 c3a21f2858d8ea352e9801d9b412bdac
BLAKE2b-256 97f108a2415a8de22cd1240814a56aa8b583fe38253a85015b49b8a667fd0b1c

See more details on using hashes here.

File details

Details for the file tensordict_nightly-2026.6.4-cp310-cp310-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.4-cp310-cp310-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 2d48b874b7ac4fd3ef57126ac3b45eaa012208a73b24e94cdccc0db1c1aafe6f
MD5 54b3424d427114f322ddbbbdbedbfdb1
BLAKE2b-256 6eefb875fc2787f76bcf46c56c20edeeda1bec70244846df24c2abed60bb0e82

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