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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.19-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.19-cp313-cp313-win_amd64.whl (618.9 kB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.19-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.19-cp311-cp311-win_amd64.whl (617.1 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.19-cp311-cp311-macosx_11_0_universal2.whl (543.8 kB view details)

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

tensordict_nightly-2026.6.19-cp310-cp310-win_amd64.whl (614.2 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.19-cp310-cp310-macosx_11_0_universal2.whl (542.5 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 8df08b53753d694b66ba995df57894e0f13fb3e6bb4d86f895287f113aa95408
MD5 2538424f4fa9b3cc24087794809d2320
BLAKE2b-256 bc9778546b767961678db150e3a9b4c9df557d289ffce1519edd2b4064241059

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 133b3aead9b2feadb370d25b62b66865ba203add9e289c0631ac4fb5585550fa
MD5 37ac676920891714e622a86c4e1f2526
BLAKE2b-256 7731625c73cec97822d6434c0343e05a5e943d72a9764464433f3d1d22b833a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b99c7d206c1e246fe21b2ea60f4dfd666251dee910995841aaaf4d277e17c419
MD5 f01bd643a25e0d0983e66cb164d7957e
BLAKE2b-256 0f11a810f8ecd9df33cd0b3b9098a70029e2070278471a8ca2ff83a4f5f00e9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b0f2900f64317c0baa5e53815afd9b5e46aed4457f39fdf5357d3af5f70cc93b
MD5 2c33010f366284e2674e3521a797c782
BLAKE2b-256 d09c37c954e7bfb209f5635f8cc42557d474ba703ee797427e4a2a049a1873c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3d71b6377ece3f872e7e56854a35ada1e6db02dbb7833d957ed01593e1db31f3
MD5 249ef215dbf9f4d604db9de1586c494b
BLAKE2b-256 99feb2731ad74cd7f6a3658eeff58337b960e400c2dab8bbe772b7c34ab381d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 15a10024312b3fdcc1fc3a60ccb601011a2998cab7818726bdeb4c4411db25bf
MD5 2f4f21684ae21a08794930ca69ee40f0
BLAKE2b-256 bd5c72bd3dce6c7590121e4f98af1d563ff6a82ecf39e2b6701d972fee638971

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 73bc15550a2fb6d3081af0666af3c0a56949922bcfef85dfc679e499aa066111
MD5 04852450dc233da0965641cbd30e318d
BLAKE2b-256 5d7a158bbdb102d0363a7ef1b72b9a4769af39efa04f0e15112f214b44ec8a69

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 53394eca81e63762519f4e57c3ddf8c30bc9d2ce28e89c78dbf6ebe7234dfc49
MD5 cfa75adb5e7e5e853adfb2335cbc8618
BLAKE2b-256 fc5700473199e47032ed6d91bf8afee6db919f85c0b95c3d1274ca93cd1344ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ca08d3119fc54c02210c4a81d6004cedbf9c424d15e02675250c311924999212
MD5 a167d1e894396d4ccde0ef10cdc1912c
BLAKE2b-256 eade58ceee491fb9e6a1af0224bb7169d5b068a44c580467cc4567ff5af550d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c41be518692cd16ce1dbc0773fdfea1aa516e8c365f97a8b9e692bd960566ad8
MD5 752f3607d939c9541cd6c510e789d56f
BLAKE2b-256 633403b10bd09aa6b69e3992268087629d75b5e667cd2b6a35de3e2ed3d75809

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3c7e6705f9b39af09d63ef0b09ae19e42ac13df309870448c699fe50219ebb2c
MD5 49a526b6094e2691b6b22ffadfb32941
BLAKE2b-256 a01471165c45c7f60bcb5f15a2547a119b074fc44b9f20782ccbb63634d4e400

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 56f2ac6b7a0dddd522f19870c64ef7251f32f73a86618d9fba6d0bc8815d6d6c
MD5 c18c7826eee1ce2d1e8c32756d3c3126
BLAKE2b-256 f6025fb22fa5ea02e16b9a4830862884c3cb62e5a5db1c8098332c50c11f8f70

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9f7c2c267b7a2cd9a63f898b296adfc0d0aa8cd7c35898180eab5361c8a59946
MD5 32052813d6320400b372df4351ed0fc4
BLAKE2b-256 bd15ea4072fc8c78ae5cb3afeec42a86f9a5f80c7ebfb2a131496d069ae94fac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2e19a1f82c386abd6bdfb3fe1673fa1c6a4274ce80aa236945728b893c887b99
MD5 038a4ce3e577a513d7b9fee039ecac79
BLAKE2b-256 3ea586db15b3e8606022ecab0509c443d3634c58d65415582daf48db1c5a40fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.19-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 78d15e41177d0b43f02f5de1511f5d2a408f8773debcbd32dfdc50961fa03eb9
MD5 8a05fc8195ea6ca0cca1ea812c60a39c
BLAKE2b-256 0dee83655dac7007f6637e2d8c7b2b90ae092a39d3cfbfd6c9f71617319e1492

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