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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.13-cp314-cp314-macosx_11_0_universal2.whl (568.7 kB view details)

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

tensordict_nightly-2026.7.13-cp313-cp313-win_amd64.whl (640.2 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.13-cp313-cp313-macosx_11_0_universal2.whl (568.5 kB view details)

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

tensordict_nightly-2026.7.13-cp312-cp312-win_amd64.whl (640.1 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.13-cp312-cp312-macosx_11_0_universal2.whl (568.5 kB view details)

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

tensordict_nightly-2026.7.13-cp311-cp311-win_amd64.whl (638.5 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.13-cp311-cp311-macosx_11_0_universal2.whl (567.7 kB view details)

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

tensordict_nightly-2026.7.13-cp310-cp310-win_amd64.whl (635.5 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.13-cp310-cp310-macosx_11_0_universal2.whl (565.8 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c07eea9d86382d962c5a7d741adb0a40b6e88da92bf8da6456a99903224ebc6b
MD5 1c041f76d5ceb50573025b4b2ebc6dcc
BLAKE2b-256 aae904ee3cea8d82f096384f66236f7e8f73416b108c434b56900b66830a33ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0985095c8f4e7809232a6e7132ec25ce2c453dfeb377c2bb8f3b16513aa8a965
MD5 cd2828a30ad47c913983d3acf76e1bfa
BLAKE2b-256 e269044cff89daa6a78124da0c6ca22d4a26ca0612a2825f10700999cedb9ac5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 1c9584204f9c10fb89884975515cced4b1a5766354c0277ec8b38bb15516cce9
MD5 22bdb09144b3e6bf3d6d91d603cf319c
BLAKE2b-256 57d75e697a8fdef1e37cbc2944c08d6b273d3d24dd50102602802a3f42037612

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c33783301b813a124829c7fe0b787a4ca1eb581f33fd0e54f660f918ccc3a6ef
MD5 9477070c57b97fd04156badfc0ea7d62
BLAKE2b-256 31b8e930f796b55e347da3d97f91e4a2df865a80eccc7b1a7a303624e7ff57ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4316d8bd7ae8f155ebaa1031b47920453796c5b6fa703ecc4e86ce64a7eb11ab
MD5 8adc4dc45a6302c21dbcc803abaad406
BLAKE2b-256 483072a7fdd9f2a864076de695b62f92f0487b16d4c69f18c8ecbfc62ce57c0b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 7fc8db24654923f27dce1d52470d74b2bf61c100567600986ab96acab65e1ec2
MD5 5d46a37c232c0dbc74d3e7aa7344d877
BLAKE2b-256 0a6c17b87d419e343ceafed3d7dc7a301e952cb4e7ab5ca3c678d0ec6a6cdd9f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1c79e94dfafff390a445613bd127934feea59ae85efda072f753fbc8baa45d86
MD5 ee799bf20f7127b908fba8f3e29bf3e8
BLAKE2b-256 c280c1e7a7c43e5f13cb96704e610943aae3bd082c796de630fda71545b07bb5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e4c8fb9e2ed8b5f219826df4e538dadbf8d58925a99c4d0458b5b4836e91e746
MD5 b26966024b155a25d1ee57c2166eb860
BLAKE2b-256 8492c20fd661bd6ce3d5c725d4f370f7e826eccaf3e201095da23dd6aaad7c1a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 e18eb4514cbba94fd41352833b2d1a1a99f07e00681d8f054fae985e54c8e9b7
MD5 2416d6217a3cf8fbe02c4f674e68560b
BLAKE2b-256 45670366871b210cb95ca8277476758a449e7fefecf15b788ac81166ad07fa45

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7d597d3618b4fde3ace67d6be05e0fb3dcc9baf8100ba15389b50324990326e9
MD5 9c0a190e4dfa568f4675a0d4e1845bbd
BLAKE2b-256 8c98d4509540266a1d9eed15aea64d78a5881be5db4dc8f65af449f6993d60c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9df0d7c7b893f5baa93b5ec4be96772195d2c73419fa84183107fa0d08db1e3c
MD5 54f4c6c078cf3e867eea0f2ed5447cfe
BLAKE2b-256 5fa9cb3a2d99d8aaa110be023344d03778e19970ab8d6fbe6c2646acbf42bc65

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3de1eabc9a4fe0ab07ad03a423b5d25427b2453e7b725df800831afb3d5db6ad
MD5 5408d4490bcfb536f859140a5e65e8bb
BLAKE2b-256 620bb8c644b195a8d9eb84caf9fbe78b217f0445db23f766a21cbb39d9d52f2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 25ccbfedc36c867bff7d8c685a1b0a932edd1700efaf9b55c0b0ac1707d6059a
MD5 10d46582d7e99e30197ce59dea356afe
BLAKE2b-256 6ef4fdcf0f44655c07faf9470000bfcc0fc6302108b48561ca2732bcc50d8d60

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a7e20ad75308a2eb47aadac37985d32ede36dfd7d378bb662d091497ca611ee4
MD5 64b6514de0ca2d73868d5464546be80d
BLAKE2b-256 9ae1fa677afb4301667d49560bb5148b8233faf9cfea6457c96a726cde606fc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.13-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 cac7c7f9cc6c4f466e2fafdcd7d83c34391a7d06bc9756b74bc0631a6d406201
MD5 ca6e29ccf2f5086206af2a40788f4c42
BLAKE2b-256 131bc10e4887c6a31aedf547290bea7de76546bd079e85be9a3980a959611df3

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