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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.18-cp312-cp312-macosx_11_0_universal2.whl (568.6 kB view details)

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

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.18-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.18-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 9569f854bb756324021e49ed46ec234ae0e653197487e841c18ced8eeed73dda
MD5 7ba950aae9564036d372c1660005907e
BLAKE2b-256 e319792db24956a2b500118bde69b52742502dd8330066edc29ccfe111d274a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cf557296f59e39cf41e969e3f1008488c2bdc8a04987cb9af2764d28542cf030
MD5 ac97f15731c80002e11e583a3b9f1819
BLAKE2b-256 6f1387dd695dedc7f56be7eec808cb52961af198db591d9e7a52cca6124d818b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 45ad8d8af73673d7a87d72e728298b3c0f482679a68f5d751cd4be0a0c561595
MD5 b6b24a2492422147b40fe2249230109e
BLAKE2b-256 b82c97ddab3ba3b19011ff82cb70e45c0a603b46cffbb5f9b59d6a7d3d21dfa6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bb2cc4d2965d9e0d753480a3b2cd4f8bae4c2425ab4057b6803eef6c282d0280
MD5 cbbf03529562bee334a25fb936ebc768
BLAKE2b-256 d098ec26f53ac040ab06ae855e8694b475df437d5b92dd3cdea961789dd8e70f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 aec6661ab1aeb58b0e4259f7274491e767c0c178cd793d3d22ce8d7b7b2b90c8
MD5 16888933e47fb026a935f213eba77087
BLAKE2b-256 5eea12eebad3d475dbf4c6be00803f6a8482300a577efada69a76ff14719afe9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3779020f316807a8146aefbb03afef41bbbfeca1d681f5676509296c868ff9bf
MD5 b86f0c58f5ad45b09397a4e954ef3a3b
BLAKE2b-256 9156ddef538d132a9ca2b5c5e9ab6441febbfdc538b11afda8f408bdbc35a8ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7fb04b647944696a97860365c3c3ea39bf5bdcd7c02c34f34ce8b6564910c3f6
MD5 9eb12825a955177caf045c06ea4d2b14
BLAKE2b-256 fa170a6debb9fe151031f6590fba6460ae54faa0dcf6b3f1d12d463cc6dc1d67

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bc44ea1091899ac799c7afb03c20bf54aa51cea0ce945fcc79f3dbced516b679
MD5 65f2c3121f266fd28909c2e6bb484820
BLAKE2b-256 9b87166695798cfd812d742227b6e62d80d54d0babe109cc1026461ec9246a2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a3756d96e8aae7142e8382b747554987d4a0b468454b995fec8c5c3a3b2e0662
MD5 a7ca7ff9398c9459c66f85d414d4d7f7
BLAKE2b-256 7d67f83b2baa186bc8cdb7ac66a86fa71933bfb60618a964297b2d919c05aad1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3e90fcbdfadb790b61083e6ee30e49075acbbebe3947fe10de36cc4a26b1da09
MD5 15f5a33d09801d443c8c4091b0d68959
BLAKE2b-256 eaa52763b857626563ef18c8149f8dc8579a2f0699dd7f683a4867c612996e5e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 63a19297fa4f4e72ffb37c3ae81f384ec5c047fb4c4e6ab6103b139371158e3a
MD5 05974f0ff0d6cf0045f34357dd9a0861
BLAKE2b-256 6e15eb6814daf5505a1bdf6f2c7dff62f6fe1fa0b637811cc3b06975585396e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a815d985c99677471bd108609dc7c951f6666f1c163f88fd4a61f86b93d4176c
MD5 55e4e5fba8ff0de089ef16a98b7f19e7
BLAKE2b-256 ec5778bf644088b50cff0bd9a686642772a92d7cd0a8fd82657e723a94098111

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 39f79a74fa669aa04d58c2fbc7ca1fc40947f1aa5e83246b330ae26f6b79a012
MD5 66cac19dc90586ae924c92c50c673961
BLAKE2b-256 d022219db203b1fdfc840af207889f8af1f8979a49922d543fe19e10e671d53a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 df5286f4d0e830085bf3d9e1bda2a5d9142e837212f9a3e2cab8ff833045b379
MD5 edfb624d1b11e618f265983f17d4c388
BLAKE2b-256 07f2efeacdbadc580a3d9b5042fc02da75d0df93a373d200dfffdedc1202901c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.18-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 01ac9ab7ae01a81f17cba4559365e9338add9f895188b53993820f358924a92b
MD5 3cabd6070815782e749a20428dd256cc
BLAKE2b-256 29cd93ffeaf8ce5a590b77ed357d699550878647ed9cf9cdfe3dbe20cfc8babe

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