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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.8-cp314-cp314-macosx_11_0_universal2.whl (553.7 kB view details)

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

tensordict_nightly-2026.7.8-cp313-cp313-win_amd64.whl (625.1 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.8-cp313-cp313-macosx_11_0_universal2.whl (553.5 kB view details)

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

tensordict_nightly-2026.7.8-cp312-cp312-win_amd64.whl (625.0 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.8-cp312-cp312-macosx_11_0_universal2.whl (553.5 kB view details)

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

tensordict_nightly-2026.7.8-cp311-cp311-win_amd64.whl (623.4 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.8-cp311-cp311-macosx_11_0_universal2.whl (552.7 kB view details)

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

tensordict_nightly-2026.7.8-cp310-cp310-win_amd64.whl (620.4 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.8-cp310-cp310-macosx_11_0_universal2.whl (548.6 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 91d477228db3bce51c9950c226ad750c465a8038b6957c23385bf04f01ac907a
MD5 49918040019b37ade3dac41688d79d67
BLAKE2b-256 3760a437a26a22054fa69baf7fd92ff37356fc0a170c9a35711078bfed70b37c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 59632f64f8877d4ec3c227461a8d81672124dd6aefeba105690935424cbfa8f3
MD5 73da43f4b9d9fdf037999ddb273c819b
BLAKE2b-256 b0dbd0557fd98a7c53e175bce2c540a1b10f717b2f82f879ee6c0353b87da1ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c5ded93a4dac49a65b104a0713ed2e6b84b85b3aa46f247516b489a2a129292b
MD5 4b81ec11e7c43f2a18cde967870a4357
BLAKE2b-256 d807b9c5d030d9c72100e98f0812bbd52293bd722b6f785fbe62d43dcdcdc3a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 74424636ce80f7ddc09fff6f7db34c28a473dd8746d66882d36e98ace97bbd8f
MD5 9a1fa0bbbd8368a7d9a3893367cd6a40
BLAKE2b-256 08c5029c955a7dfeb60a8e460928238566599befc6d22a0f61255f4f1e2d3d3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ee68a0bc8d1716dec1150de45c64a0682fd67e7ab0c5700728093ecec5574cf6
MD5 f44f48186ba969872e8d36e2a29c7654
BLAKE2b-256 adca7efd87e72a620b7f5af60e48b4ffc6eb84d76397bc0245f4e00155fe75af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 323f867be4c9b3fab12083b0f64cbd376d21c6eff7a1c0a747a545ad3e64f54f
MD5 0ca6049183cb93fa12d8f125d89314a1
BLAKE2b-256 acc4d288eaff976d9e676cb9908609a2a503cdcc3bc6990478f0304b86836d9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9cc6bd73e56e5acfd798a378e8df50cb3cdc720038c9590d84fb4269ae46e419
MD5 40021af4e5c675b924e0a0b089648cba
BLAKE2b-256 c1bae5be09c334934e454bd2d0224c23298f10df22d927b229be58eae5272214

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 420d8784e3211d8ee0de60fa78c3521ae289136590ba31503281a3a983afde15
MD5 f6d604bf1f3b61998a82eea38fa299f3
BLAKE2b-256 7d505729eb393e6c52bfdd0824101763f4846d2c06efb978fa9e2b086b014afc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 53a9462ea6c7af46338da60726bf47ad8b5cc6a66e1383e992bf61ff998b0c13
MD5 e23d8e90c2fc194682290a0ef1be6ca7
BLAKE2b-256 a8d011d0a2ca40aff08208b86b256f5286dc6291fb5f9ad92d52b0198e87730a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4529d812f9e7e7aca86096ed32b3d29bcee0a3011d0a1712710a2f934b24201e
MD5 f028bafdf20d98830e32256942692b06
BLAKE2b-256 e9911d3cd99fd4af0adcdf08e4fd1bf81bea5fdba8039af414c8073e18850904

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c319195c189edfd066d5cbda4bba8435f39ff54bdcb3d4047ef0028b0ec7e786
MD5 0304181e0b53129a3ea832f8813b8436
BLAKE2b-256 dcdb18972d825bebfecef3b4b6a63ce0573d3f2b3c8b0014def5b89e37a5d507

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4241a2ae65fb13dfadc60f4e2c6cc84b5aa11f41d2dc0164baadb367d540eff7
MD5 b2f9f21979c7d02f12bec86da901508b
BLAKE2b-256 d1d109b2c4d7443350584b71289f45d33509a1d159c31741e70b42440342dac7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4631f0fce0beb413b6d7e46c22ee700fe3b381c6ad1207d0a542d6aae0b29049
MD5 b8bfe3bb9ee673fd7a18ddb2ec3f3d58
BLAKE2b-256 3a8fb9a5c15f5d5b5cb61d8b95b84bfb60dc2ff80fa2de1235f7f91df72a20f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5d634a68abdaf7b7b6584f17bcaf111aa3c515f306fad4712d83a9df874c400b
MD5 7e120efbf20b2a9cd00563149f6e0440
BLAKE2b-256 576a7aee57a0d9a2e15f774676143c58f99d1ee8e17833c072586c397de33b1d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.8-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 660c7e9d983d066b9632a972fc876b130aa0df56b29257dd178a3f8750d90d2f
MD5 78338a2967abec4a6f198bc7d7c324bd
BLAKE2b-256 9792576482cc1fd56b46e2b5ef120f2eeb490c12e7767d782d31c412ec9be900

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