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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.25-cp314-cp314-macosx_11_0_universal2.whl (547.5 kB view details)

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

tensordict_nightly-2026.6.25-cp313-cp313-win_amd64.whl (618.9 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.25-cp313-cp313-macosx_11_0_universal2.whl (544.7 kB view details)

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

tensordict_nightly-2026.6.25-cp312-cp312-win_amd64.whl (618.8 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.25-cp312-cp312-macosx_11_0_universal2.whl (547.4 kB view details)

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

tensordict_nightly-2026.6.25-cp311-cp311-win_amd64.whl (617.1 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.25-cp311-cp311-macosx_11_0_universal2.whl (543.8 kB view details)

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

tensordict_nightly-2026.6.25-cp310-cp310-win_amd64.whl (614.2 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.25-cp310-cp310-macosx_11_0_universal2.whl (542.5 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 3675fc510b1a618831da764da9a53be17000e09274452206be4115b573bcc4b5
MD5 a4a9a4e5b39889bddddb9c3af784a0a3
BLAKE2b-256 a182d0f27ece8fba573870f8ea7d711edd49af9d8c1aec6d054b52df9dd805ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a94bcd83561b7d591171f8fafda3b72c8db8103c8c3a2fbf8ffa8d05431ae1a7
MD5 e5f637d2ddeeb7958fe02f493e9248f9
BLAKE2b-256 9c22287a027354c94ffd40527dc11cfa3bea56afacbb149709b0dd648e69740c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c89f50181899146f57bfe1cf9558520c6e87d389fb1e3d8898a65efb279082d5
MD5 c4a4a21d19e74ae981cc6f97e50e287a
BLAKE2b-256 51b97bfcf35215178a9f73f979c90cc9822d2d9805785ec44dde31149e288494

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 77544af8cbb9d2e3110e8b869a1ad19fe6594a381d6f18ba8788248b43d25ffc
MD5 58eb4a05189fb3d9abca2efe7dbc90c1
BLAKE2b-256 1f0d1d7504fd0863b2276d955b4ca917b55cd532e907522264a85e480a4b7d80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c57963992ae9c04adcaf34220fc4ce55c753ea4a54af4ac0ee58a40533dc500e
MD5 93a64972e9b9bce3015d521f6ceb814f
BLAKE2b-256 753c0467054463dbe4a6eaf61998a0b28e1d852892149725211a68853e49608d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 11de8e17d8108feb4628b890d140407b2fe357419d546b2ac43de579d15b6c85
MD5 3a2a7d0c0a277668bde9201dcdb6d875
BLAKE2b-256 7fc9c1c26b09dd64ee259e3c3437b75be066b87fd3ab6aa682d8cbae9d66af6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 bb2db5aedbe5ef3344daeeeac1999eb1bf92b08d3b2621e7cd27a27fb61c5a86
MD5 e38fa0ee3e2af9457a7b37419f1d3546
BLAKE2b-256 aa3b5ca90f81832cb86c502fd798dba7c6d7df71e7796ee0f3bf8fc9959f81cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 744aa90ed00275f3d0a0d259132a3aa00f364f1e73ccb1e78bc45dbe4751ff40
MD5 1e88029a267605494f4e9fa07d796a3c
BLAKE2b-256 0e3537b8439b50dd97a17a4f17871970509d57f811b36720582c053779ee3f5d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ce40d19d43d0dc2aed24d6fab2827148c33e7bb8a21c8d9d999a7d547bb476d1
MD5 d120cfd41930d05792d77beb1f41f236
BLAKE2b-256 c48b475c05ad8ac7c2ada549496486977d30e1f0aea8aab76ebf266e6a15f172

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f9bd62608625684bc8ee68aad0d34e233f1aef255182680be19b2ca0f181a559
MD5 2b71d5494e33a5bf676f87e93d30e032
BLAKE2b-256 fcf3af16845c0a5d7786b7ffbdb83e68371fd8daffbbce36da99ecbcbe1de40c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 aaec5c09024696a903e4ac967faf7e2850681ab7bd1ffdb6fcdaa83182529bc6
MD5 63ee56798c712485121daa965b5e3feb
BLAKE2b-256 7b5619dba5e578a183af5b4826110a78668331596a6e5bc1908b35ea91f14819

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 10f8f8dbf93055402037ae958bd27564194077f1012dbe754339ec0f5472573c
MD5 b3db6cf98f89d732a56c2193fb2ad2a6
BLAKE2b-256 9689740177b25de2d0a89dabe0126feebc88c3d21d5a4731eebe5f818943b8f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1b736ea60913d45d78c1eb0a62864a00078e515c2891cec5b3295ced54beec88
MD5 1f702215d798e761fdb128bec39e5831
BLAKE2b-256 87c18e92accf725cd378073ccd7e169cf8dcb746958b434bc592480480bfeb4c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 24919ce21b10cd7ab5f9ab81650beed2d4a834300d9660ba076555cdaa0b989f
MD5 29360e6d9c6a71c7032c4b728e2a41b7
BLAKE2b-256 ac7f3d2a6e3ac98aed7a68ffaefaf0351afbaa1671c5cf43f1458a9f0d072d95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.25-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 65a823515d21844529260e41e864a355db316ad503e1573f6b13553dcb0dc1b9
MD5 3e7ffd5708c0881b14d290656ff3e520
BLAKE2b-256 c1d61ce89f1f602f277f9304ad3f93342d3b444dc8c34a17ab714ae79c000a19

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