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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.12-cp314-cp314-macosx_11_0_universal2.whl (556.2 kB view details)

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

tensordict_nightly-2026.7.12-cp313-cp313-win_amd64.whl (627.7 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.12-cp313-cp313-macosx_11_0_universal2.whl (556.1 kB view details)

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

tensordict_nightly-2026.7.12-cp312-cp312-win_amd64.whl (627.6 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.12-cp312-cp312-macosx_11_0_universal2.whl (556.1 kB view details)

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

tensordict_nightly-2026.7.12-cp311-cp311-win_amd64.whl (625.9 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.12-cp311-cp311-macosx_11_0_universal2.whl (555.2 kB view details)

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

tensordict_nightly-2026.7.12-cp310-cp310-win_amd64.whl (623.0 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.12-cp310-cp310-macosx_11_0_universal2.whl (553.3 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 90c076e828d4733a90833835faaca66edbb63036074bafbc7da18cd002a04473
MD5 3dd5225d98b1ccbb85ebbe959b536ec4
BLAKE2b-256 cdad6841316dabed862ed09e26b01bd6a3ac416bbfc91f783a22ec7d480c96b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a47fd86c13d39494773b2f4fc44cc34c92dff96441f3a2cc8343ed245415480e
MD5 beb9dc2526b7de39137ec1233c793fd5
BLAKE2b-256 e1f017a68bfaf21a6d808fc921d08f4cc890172fb45008037b044b962401dfef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 651a988de93ef81677fed450f2b9ce1c12731898ba0bff73f74facb5e37553a5
MD5 7fb7db028bfbddd247dd9a85422d3ff3
BLAKE2b-256 1b509e46def59e5a5810450e1d640ce0c10ef4af50ce0ae56f77d62f539e3352

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8fd3ef72940ca690b18daeb2ca9aa7356cfc0b13660a64887219e1359af79d46
MD5 968855fea20e8fa6ccc36c2c7ea9d123
BLAKE2b-256 170a649b45f4ec4c61bbecea4f04b5e80fc48cc832a653628daa3312be09b1ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 96280e040da7a68acb306485cda170c502fcc7f86cf7f22d9f3bd6fd955a64b8
MD5 d0246560e793d045a150a7759ddb1fbf
BLAKE2b-256 90feb5bb03e2b7eb99d8d6cc564119f58b8f45f1a791293eca7f10b9e5361970

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 be6ffc9e92ef3111904b34a3dfd84ac628c969ea215c59770cbdf1635818f44e
MD5 67af6d5255f491e6c583dc4cf4f58c73
BLAKE2b-256 0a70c332c653244f93161e74b3d67acb1d37f01c2281ec3bcebe3e0296b78c28

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 28dcd5cfa9beb72a0e688df536480625676cb0cbbbc775f8f6a337522a5d30e1
MD5 4941b82b0b8750b0c62173ecb5d9c50b
BLAKE2b-256 aeaa502157e277a532277116643cf2723e9071fb571159d4529330a659e2987d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 841d0254729aa19bdd5797c85d071776e6dc2a15d7eadbe45c15cf5904337c78
MD5 6953d306c42cf2f1aaa7d53093d5cd4c
BLAKE2b-256 b23a930d0b0312226e4c04540741d7d0dcf846fb6b3f342e4cdae61eff04bdf4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6724ccc5a6eec1ab56c0e01aa187b86cca35bc3f73994babccecfed2a0a7af1d
MD5 44c7237115383dbda7f367c69ce5603a
BLAKE2b-256 c234cb56a522fc7d2e0c043dc3b65d3f9245b85ab1e1dcb86799fbb91172e24c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4c9f0721ef042bbefd4987d80786040dcc108b6ecb10bdb73bbd86590cd45434
MD5 6255af4753365de03377ad96019481d2
BLAKE2b-256 c380f4141d75a79bf546b58f8b3e3ed6044f08df75e5e61e2d12ae8da4954ea1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 95fe87aaa87125368afcc331755f4fd0dea15fad7a8019936f8abad814deef8c
MD5 6715ca4fd1a85099e568a6474e159c55
BLAKE2b-256 86840a443fb59af96729c977769de79de0a99be4a159b9965a6bd9d2e63a9a95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b4fb95a1343eea4941528535915c64525a9c5da6ef821741c5e789256326daaf
MD5 4bacadd3d781093af0a284a0f6ae8020
BLAKE2b-256 33e678d3538815d4a5f89229ed0632e4e3edcc9ec5e00570a46d0edfb437d8dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2e79ddefab29f9df7b0aefc8805abb04078b13da3f4430bf23dae294d38aaaad
MD5 5bd6a207e82c97bfaf56fb75c798a4cb
BLAKE2b-256 83d816243a08d6e579dd3276c492d131abdef97b295bdc2b939ec7b20d17d879

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 28d536c4445f9bac2a48cc1f731fb0e46471339956948f3386390caa515ed966
MD5 69a7c950f866ae4bd366fdbe1b05df6b
BLAKE2b-256 1d402de999b9fe95b6096407dd12ef119455e60f248916906d9dabbec8af530c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.12-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b8de4535b6a277eed92f33b5cba33f95f8e571acb9796813557cc6f2958cf551
MD5 24bb992c4a3d15a86d7701032d83cded
BLAKE2b-256 b0366a9ddc2edee39c92408c316130a8e35975de464d6311af23532f0df740b6

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