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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.12-cp314-cp314-macosx_15_0_universal2.whl (543.0 kB view details)

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

tensordict_nightly-2026.6.12-cp313-cp313-win_amd64.whl (613.7 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.12-cp313-cp313-macosx_15_0_universal2.whl (542.9 kB view details)

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

tensordict_nightly-2026.6.12-cp312-cp312-win_amd64.whl (613.6 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.12-cp312-cp312-macosx_15_0_universal2.whl (542.8 kB view details)

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

tensordict_nightly-2026.6.12-cp311-cp311-win_amd64.whl (612.4 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.12-cp311-cp311-macosx_15_0_universal2.whl (542.0 kB view details)

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

tensordict_nightly-2026.6.12-cp310-cp310-win_amd64.whl (610.4 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.12-cp310-cp310-macosx_15_0_universal2.whl (540.6 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c621ba40cb5a392bd047e20d50d1f25bedd6609775c76dbbd54f21ab675784b0
MD5 e9a5c2229623b9839b1779ad3e7617bf
BLAKE2b-256 b0804736aa61b6ae7e1941fcde2414eff8927498b741cfa39107febc47cd0768

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 76c840262c488d49453b5d64966b98858b21e47f8508c3e33d8780b94eebe6c0
MD5 3b50a74e7ac903e9ad2ab81a9e26be0e
BLAKE2b-256 12d543114e4fc8d4bf352c265d02d392a999bcea052251680026548b8c1503a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp314-cp314-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 f8327fc423bf8cd03d6d1a11045d9d7119d4dd60bf4bb230783b2d1f4ef26c5f
MD5 aed5bfba1c80ef7ec19b5b61bedf29e0
BLAKE2b-256 2b4587f9121cbb91aa1481034d21e8bedad05cccf92ee12fb4b46a9df3996d63

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 da62a82aeea598e9cf2ac6f1f7300791f9299fd087d9fb1b310e9a84c0ff76bf
MD5 ff8788723b07f90905a103c48b59b4fe
BLAKE2b-256 76f775fc4d2626fea82639f810fc369f6010c165c1b01a88e73e0bcd8d503a9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0838ce094b1e36d85c4b12cfd4defeaa2dc59018fa6fe43a595db93816db8219
MD5 90345741036058f17af692d2667c1c02
BLAKE2b-256 a1ebb5fc08130638ebab567b47d410eb8d57f66a2b39c9748b412429feb09454

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp313-cp313-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 6447766f87b54006d4df307bfbf317dd230e7498b686a2ac2c2e48a6c59b8b1b
MD5 617ba4e2659ee67afa3ed6f39915d22c
BLAKE2b-256 b71634cc04d2fb254c2d47e6f5de10887f2070c845f9e3c243f15ed2588c3ff6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 465d8f618b0b035af59982ebc5e5b03ecad94f1cccaa88986dd6c8c2a8730b3a
MD5 267a234c68f9fd712ad57ba523b60159
BLAKE2b-256 c5e4d1d24ffa0f001def9ea8547765b214b1e997f998ca875aab14573941f5b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 42fe28dc345e6558295ed8aedd730b479ac822294e8bd9a79824f1f379889848
MD5 d1fe2e385a2954ba6dd076c9f4a41bf8
BLAKE2b-256 d25eb8920977fbcdecd204703cd0e1fc6273cf32a5158c438cf37e12b22a6e9c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp312-cp312-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 3f63ff1d703a9530a7b881c160340db4fdd22bb2f13f8b67e0be2c5138d0d184
MD5 def9a59e2122f84d1c1969033b78b356
BLAKE2b-256 8ccd320c09b2c3b742a2152e76d4a456281ab44f620ee329f09501b8526200aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b5c73af3b8cde8ffa34c2a5baf1d7c18b74ef05da0d6ce52dbdb293637d12631
MD5 4d780d14ce0a7ce9fe2072c2fd7a7a98
BLAKE2b-256 8d93bd25706fe7a1a4246f7bc50ff31e6c4eea186dccd649c4407410521732fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3e463100ebb8fab3918de4c4d40c513711785ea84b7bafff2e0135a9d0737a39
MD5 a799371b592a9b9cced29652511601ce
BLAKE2b-256 ad3cab03a5e862411c52006fffad7108a208346156185558a5019ea655b761a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp311-cp311-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 f5becb4e0390eac4e644a22590dc4844d40e99b4953f735703bcc9d8958d40e2
MD5 36a80686005c74a60f165ebe34e395bf
BLAKE2b-256 6842cd5c8977ade956fd711818c1b18b989c6d3439caf6cf90736550a226abdc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 65e9b933ea5867f342407dcb65247109b04ba889f269bdfaeb7ea89574328934
MD5 724d8d3ad22517f4335c0e577b73c43f
BLAKE2b-256 5a661d0c51b64f8a23a91b74c6e4fdc28749d71c90a791958634cdc9286d8b43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 60d3a106e4c0205aac9c410e70e1387a738e8d7ae27e60631544b50a50436953
MD5 ce2c9e187fc42183544cbd8ff662ca0b
BLAKE2b-256 c01fcbce42105f5f3440aa42861185711792479dbf1da86617f43b857fe28fad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.12-cp310-cp310-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 07d9248edb1447a3a6ac3f8a1438b510d063b23946ec2c41b8d11a25fb725b90
MD5 4239f4078af2b455d7ea4c3a3e5f0b2e
BLAKE2b-256 1390ff0b7b0f49ad1afa00693b3aa748c2989a8f0811d0d3c52b59b3cf909578

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