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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.21-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.21-cp311-cp311-win_amd64.whl (638.6 kB view details)

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.21-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.21-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ac4c995370e25db27cb57ac614ef05a2e08330c0d335f6e44fecb0322f3ab84b
MD5 67910e84ada86a152a53827d42d142e5
BLAKE2b-256 449552b1aad9a6a697abc713776bf91639d3b313ece37285cca5d8a34bf0d86d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2fb4277a060c56a111af8b72e3f6446788de5a5ac07120fabd4b63b019a869ee
MD5 5db932c9d2720b57a43255348f995189
BLAKE2b-256 7c3c23ea912fd09f07ca27061d284945d389bed186508ad9a2823d96cf5e2f24

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 06fdb8a2f80fb55fc4fd08364fce0dfe7a599ca40442c719f67c846a3b8ecdcf
MD5 a13c5f12c0f3aa4be13caaa1c5c2c08d
BLAKE2b-256 a2bf95ddf8894037352727ebf2a7b4acd3efcb54a8660ea9e2a6b28ecbd051c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 57f3798a7ca25a5fe0842b3b3ea40c6a80eadaf24207cb2cf95cb297cc42ee1c
MD5 7c650e942ce756b22af1000e605d596e
BLAKE2b-256 e248548fd03c3ed8196d95b5c959c3e439a89c75dbb40af0b0f79ad98ff6fa41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 aa16d74c43e825c05692265695058adce43c51ff8ed88a7cce7c062e1c4849a8
MD5 c98d5985ba073f63f3d2da8223000e79
BLAKE2b-256 9a677bb914e8c4a5347ef3c1b88abcbc6ea3dd32523ecd6219504637ff08f643

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 93f3d008d1706157ebd314b165495e0f53b31d34d3f31a56446572000e7175a6
MD5 b4d2a0aee77bdf25c77e13d4b1efcee8
BLAKE2b-256 4f47602f7953eeaf7c6e84640c62049981a0afd92d196e098db6f5db79b4fe72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 322367ed0274ada1d6833b505521efc326b0f6d1b240b7d234281a0d8e09627f
MD5 dd1e1944b34143bcddd16ca09a6e7557
BLAKE2b-256 6e3ae3bc3dc14216359d423669da8b0a40d3af18240f82ada515b6b2a5bc9509

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f14335007c49bf8a70b65e51d482796813bf41b284af0fe34695a05fcdd56337
MD5 78f5992f8934e5e91ec2d5e0cd71af74
BLAKE2b-256 1e2218659e7e1035b439baed30aa12790a33609f6f87a6522844cb2235a689df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2a9467e23dda96f0843be3baf5ea78cf1f44c576843c2a1244bbccfe6ae6370b
MD5 ab6631b2fe50c492c3c749c3260655db
BLAKE2b-256 5080090f83396a6ff122f61001e3a3da7143a5fc315a2145f4b72267c2feddc6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 489f34b5f5b62c4a71d8437e4d388f4febc9d6a86772f8f625634fc3be1c3b8a
MD5 2548b26eb41943d0846c1ff0d85c5cf2
BLAKE2b-256 ff5c63768dab0bd1b965870734ad61fd2e85edd43ee2f6c1fa435aabb4512b0a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 38460307334938a803034b54ec06a7866030fc91c9ae5e026c5d04072982f016
MD5 690fe8433bbb5776e776072d6df752d1
BLAKE2b-256 879b4f6415e300f8695c282199f93f1fc90e679d6dae3411246cf9ef810dfcab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2e9555c4a075964ab1845190bfd4618cf6c26f64e39f8ac19d0eeda3d7d77d33
MD5 dfb023348ea383f194039f4fbfd61ef5
BLAKE2b-256 07d68f63784e002918378a010d2371c99f4f65a022c68c7b82ea08306c41fa05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f1815a50f3d77bebf270d0cb6aea1d7ab16c06236683268249624c4e619dec39
MD5 bd98ef3cbc7dfcefbebdf8e1da3ae4a6
BLAKE2b-256 7bef04bf98cbcb7027bd027e48eb3fe8b2329d0a263a077db8be3bb8f886a4c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e605c233be5113fa4023da910e4884f28543b9c69809ad8322b0ced5d092a533
MD5 4a386bc9497f3a4730ebd49341c7d155
BLAKE2b-256 ae98c0a2358d2947c18e005b177fa3793b14d05cf360c4b8dc7bb83b032b38f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.21-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 43a98587475865c8cecd135b10f3101fc7462582c88c7e17ea0cb9d0aee0dfd0
MD5 b8cecc62c31d2c540e23389c43d0791e
BLAKE2b-256 47e7929181f5791c93986dba196b87e5b5bafc80bb19cc11c8cdedad731eaa6a

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