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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.24-cp314-cp314-macosx_11_0_universal2.whl (544.9 kB view details)

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

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

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.24-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.24-cp312-cp312-win_amd64.whl (618.8 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.24-cp312-cp312-macosx_11_0_universal2.whl (544.7 kB view details)

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

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

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.24-cp311-cp311-macosx_11_0_universal2.whl (546.5 kB view details)

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

tensordict_nightly-2026.6.24-cp310-cp310-win_amd64.whl (614.1 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.24-cp310-cp310-macosx_11_0_universal2.whl (544.6 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 db25fcc4f3cdf8617c6e046eb63c57d633797f6b38d0d26787318da3fe394696
MD5 ef635befc7852ec31f90e43ba3389a77
BLAKE2b-256 20d89fc660a3a5fb80b193ec2213caf3b43c415d36e5b02f8e51278b180c8c0b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 673baa06570522e423fdc354361affb5f5eba03fb93c74edb399ff52d2028c2a
MD5 d936ddea2a7c5e70a5b8d1e4293963c9
BLAKE2b-256 21eb4ab1868e19011860d1f108d04bb7d969ce2acb177cb210baac6cf3ca081b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 11d2d28570d8d78ab64ecf2ee8d724d3246fcc4f242cb0afe4a2003bad417a80
MD5 857ea7a9704bac8d36a25b320bf196f1
BLAKE2b-256 cbcd73627aa7086479d2ba4670886bf7dbfeb81813381e07536eccbce5bb0dc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4befbd9f27e6f2c95d2d5c404e1ba2bf2554ff0d81c2ee6d1b3a570121ac15d2
MD5 c974c915e552d953509e555260ea33ba
BLAKE2b-256 504c534ee38ac17e22719bcd6d79a4bfdff7ca8dbcb34b6a9220b6cc58daf0c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0402216ad34ac70604cd8e1b59df8d18a4581e080238296b8f85364baffb8aeb
MD5 05dfd67c8d43e72d3b9d6ab04261e924
BLAKE2b-256 36f7194d37eb34dbe73200ff008b6e55d17ecff34821123387729a91d5dcc935

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 33da1a45ccaf3c48b0fbf90de26f59c246fabbc05ba817609cb2f2bc3b64d61c
MD5 7b1979638e8fc6d0691ee687e033d545
BLAKE2b-256 81c8f9bab3d7a0ccce72abb96bc6233716f74691f5cabb467b068381324ea9b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9eaf20849da19e80cf81cd8cf9c28ec594e7586104427cdf7e808030b6caf05f
MD5 acccf4f7d5d8a8e4770e52dab7b859f5
BLAKE2b-256 00decef1b72779da7b673a489e161d1d66f3d1ba8df5bd19610cac95bbd45829

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b96fd5cde8217f5558e9383891e5aa7908668206336bafff4291e6784d6d9ad0
MD5 8b3967ecddccd6723d1951fda9e77b76
BLAKE2b-256 6b6ff06eca1591f972feb467472891b934bdb96ebbe3acc41aacce7fc802e390

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2821b71e59b222d909b25697798d99e04b408cf4a91163788a2fff4ba6d4a4b4
MD5 71697bbaf471fd79e415058c733dee8a
BLAKE2b-256 4a397ffa40b790302bc0010eae36a7cbae2e860b94da3fe2a71e8fa13fb75479

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3f5eab3523f56a9b5c9fb9912d4c93fa64f2d730e2fc818d0487ae1fcb513d3c
MD5 92c1da097f62ade9158b45940b682b7f
BLAKE2b-256 b7a880576c6e03fc32bdac028c5fba52961a6bbe67910d7249158042c9c3c450

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5999f2f3d6ae8025b367d22fee5045196753d0f7703cedd96194ce917af7b942
MD5 60cd3bfe9756a0245784d42a12fdabfd
BLAKE2b-256 db2f13d36dfb22df348933b6133946c5effe25f7a7b62cb8dbb62ff47f8c6ec0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 28bd4efa655114f6d2f2fce4ee59b480219c0f5e9c9a6ff498a27807259add71
MD5 d8b7783d65108af4040284edefb3eaad
BLAKE2b-256 a0c685151f8fe72cd75a907852dd6c3bbf34040189817bf2b2d95fd2e58e862b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 13b7cb3a2f071a460bfa78fc467a8d5099c8eddb7d60722f0784bf8629b540b4
MD5 f1e4bd3196e12558522f0091e8907d91
BLAKE2b-256 2fc2bbc49fc261c4ae068a0cc0f7401e75290ec4dc3a01c88340c769782e5471

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d11584a1636deabfe5fc5917b8899366de6d88b4f77ee782966ecae69260771b
MD5 fab87b6fc1314302b5d04bd5a38d5116
BLAKE2b-256 ee0f66cf1ac076a0baa3b8a2e4af0eb475ae924b990010c2e1a077bb3837281d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.24-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 347f121f6702dbe49501505d258e9debf9253736779a607f4ce77620b8fcb45b
MD5 de850b65cea1e18fcd34dc48d0477c29
BLAKE2b-256 4f6a61a0270abe33e635a030e207a51546d255aa66eca7ec83bb51f056f74877

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