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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.8-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.8-cp313-cp313-win_amd64.whl (613.2 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.8-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.8-cp312-cp312-win_amd64.whl (613.1 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.8-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.8-cp311-cp311-win_amd64.whl (611.9 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.8-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.8-cp310-cp310-win_amd64.whl (609.9 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.8-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.8-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 bf634f87eae202c87a22e6baed6156241c47567f36263c3b07495cada67458f0
MD5 f3ac544f687a85e0dfdecdc2afb5fa80
BLAKE2b-256 92c3300f1f112be2f07801ac7e07c83fc5bce6581fcf0043e1543a62e702b212

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f42518943426006289224a310166abfe9b67da973dbf2fe52378f319971af557
MD5 af171ef943af6ef8e1958e3d67ac52ee
BLAKE2b-256 45a8afd73a95c8f327c07a90d600d0c4e2942a512456794eb8948ba0ed0a635d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp314-cp314-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 e0f5aae3583d533913c70f9e337420115879600ae5124d652977ae2ebb2351e1
MD5 9c6a58117f476c5f46faf2fe53a3ff06
BLAKE2b-256 58f8cc870b79861b2f254222777a7d16c5f6e87a24307fa831815c1089e8ecaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d4abfc7750a4ef17fe60ac88da42d41ea13492357f06cf99de3044f794f243fe
MD5 2932bd09cab0e03de03fee8f2a0b1d7a
BLAKE2b-256 a0cf092ffed4fd98ea073403d9c7dd9bd3e281b9692eb890ec13122716160059

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 863daaca0d4c3933d706e670ee890b88cd4013589ededd804f391ad5c0603dbf
MD5 23aa48c949cf5ec67a58f5ebc4ae1808
BLAKE2b-256 e756583a40585196a676bf0b323b85c7297df271843d0b9a6eac994506d6557a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp313-cp313-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 abd636bb7a98919926a67ba9234e1fa5b7686dff6efdfb04654678046a644165
MD5 bd2e302b527384d4bfbae16f7d70b69e
BLAKE2b-256 6daa56b49f10e897e84f29ce5ac393d98a958345b726c65fabea92406efb78f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 07d98a70a1cae835826c6c95770a4cb4f09e5331e2d3de5476cbc6e53851ad9a
MD5 46a4a56998798a696f8f37461fa52ff7
BLAKE2b-256 f1693481819c0a5eb46e9009e730f7df333e1d0ecf1f1ccedc5ea7260396cc89

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 15aeabeedc7bd11eaf992f0e9c775fb2960f6263ed807b88de6bda54321bc6f9
MD5 9bc33ffc82f40b04d6311d525944e26f
BLAKE2b-256 88ff22bc354e98d7fc4f45943adb486bb97e7664e0dcabbce2db019b8c25aadb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp312-cp312-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 75b94b3b3ea45c84ce8618966bada32a5b400f677c5c7ca9ececf6f5c499ce2b
MD5 e2b12b56cb49d7d5c7833e28f75855a3
BLAKE2b-256 48f3b07b0b6adcad674c61e077b4b5a47543d7e650d93b7aebfe6904ced77886

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4eea0d682c0ca94918a3b29a5496f38f12fd3097ad60ca2a49ad1933187f6d59
MD5 be8a2f3e74fd68222b2c8aadeb84791d
BLAKE2b-256 db3ea26217879efc84e3e29e451bf72133d99d3e55402594e5e7acc4e3269099

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7586402d0cd74ec2c0d87c5604fcbf5ed011f8a8dc39799cc055a053fa958797
MD5 543232fba3cb73b424a5384c6af821e7
BLAKE2b-256 e57b299c4c00d708a2c297ab3e5167bd538b4a3a6ac35f8f1040b24657a3a5e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp311-cp311-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 b41bab99c9eae6b45ab0aefd143453d95d2393f739cae67953c11ef44d34a895
MD5 730ab905352b594b25e3846b17a2543e
BLAKE2b-256 f6677be97fc3f881233d47080dcc492011e2f6c5616566108cb97e80be6ceafa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b573412b562d5d4e386527d769621e785319c9732462974f84904324a7f51b8c
MD5 a9169801b7c382a6acc21fc97c6daf7e
BLAKE2b-256 8c4166cd1bb65c169edb662595afe4720ae72c32e1f2e856c323af1806e2fa81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d8370437d35a1631db8d23802ef6bb824a82ba885e9b91563b9ca8339261a836
MD5 302fc27b3369367737a89027af1b8b27
BLAKE2b-256 6eb1ae253a68da32192b142c6a446f1036791582a1a2111419be347a745db70e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.8-cp310-cp310-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 ea68cf265d76162ec4e9d34d1b832cec82f9f6586a32c3b0d5aebff17a9149bc
MD5 70c4d651585487fec5f51a622235fe5b
BLAKE2b-256 834bf6f9fe8474fe521d17ec639dc2733ca2301d0acbad828c81f043c8a57fb4

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