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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.2-cp314-cp314-macosx_11_0_universal2.whl (549.2 kB view details)

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

tensordict_nightly-2026.7.2-cp313-cp313-win_amd64.whl (623.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.2-cp313-cp313-macosx_11_0_universal2.whl (551.7 kB view details)

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

tensordict_nightly-2026.7.2-cp312-cp312-win_amd64.whl (623.2 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.2-cp312-cp312-macosx_11_0_universal2.whl (551.7 kB view details)

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

tensordict_nightly-2026.7.2-cp311-cp311-win_amd64.whl (621.5 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.2-cp311-cp311-macosx_11_0_universal2.whl (550.8 kB view details)

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

tensordict_nightly-2026.7.2-cp310-cp310-win_amd64.whl (618.5 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.2-cp310-cp310-macosx_11_0_universal2.whl (548.9 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 61f9ca1dad5f4360ab9b01188148a97e0fbc8c15ee8f294d059b1af77b2204aa
MD5 1036815c4388ff71eaf1d9ccf10d12d5
BLAKE2b-256 0663a350ee06511205fd9452c86f6dee6f52d090c36dc920a4aca85a2d96a320

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 412d2417f61ef424e876e38d5743dbed58bfa7e41ba9d3e28287079f38641cb6
MD5 d9fd8acd843380569205fb27a7aca758
BLAKE2b-256 418fdeed455723d7344285c4cea4bc6c825f4470562c75370f3830e77cc2246b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 422fd98573f19e92c395ec8716bbdc2af8817aee9d3ee164294371ab41490b2b
MD5 7f911d44e158db4858f1095196842deb
BLAKE2b-256 985c39246366c9e69656211a0405c115eec065883ca24c13623561787bc5a5b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bebe877f20cf9a0336eb69bf8ada8cf474207443e3f741681a02a6c3e4af4344
MD5 85d6c6170f468890920896ccafe46752
BLAKE2b-256 76e8ac4694c24bb6abb303ab5c387ade8f2f44b796c7ad585c89440cd3286824

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 dad41e23efddc03f733568d043868be69cc4692006eb48215d2343138a5b7b13
MD5 57a42d394c8dceacd6136a09b6beb25d
BLAKE2b-256 c5030408bc95d3d429d58f3e11d9131d67b43fae6ab78ba9a02ca04162b20b34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 4f2b1eca234864d2ee9b470ffe8f23ba3066608096dd14165bf146ceebbc1641
MD5 84c9d12bb603c54b38d2109232357f4e
BLAKE2b-256 c2983dbe90db83725e9098662136fc4fa1b86373a7360eca62754a9aa6e58c9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 df28596dc1f6e1836a8f60ad757fea44b93336d7e3e12913238d499e8911da98
MD5 42cca4a0765b1b7d5f625ae046366f23
BLAKE2b-256 7878f69844e196d1ad7ed761c3913c438a7612ebd31ad271d2d95c02e8c373d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c1637c63d387a274bec99f8e14fcf4e7c03e9d74723fc1a78bfa237a6e2fa5ba
MD5 ac66fb62bd0fff051c34f5d5e6bca8fa
BLAKE2b-256 1da6f8abbcb5e7cca17096fc73a7bd8a65047e4b6b21e8725f341ea7ed6af3ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9045b24840f9dad26c64e1cc89ed09c2c8a9c423e52820c105b17d0b78eb62e8
MD5 ff6934476231a31bfa51f4aa965a1130
BLAKE2b-256 38a2b433581cd43897ee0d6828260fe820d984737922a69c2c791ed4df2147f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f953a68e82bf9724aefef124dde60acc7f26a9d6f209ec410558268f135b2299
MD5 023da96dea95f69c68b9dab47f3eec02
BLAKE2b-256 2048c23bf12ec31e2c6afb87ce5050ae95bff694b3fe117d53be7c1e57d673ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 18bcf049abfa228eaf0a719a7e4bf8de8f1a9867ec3de035b7545ea0851facf8
MD5 50eaa5644b42a88aaf407dcc92b93df2
BLAKE2b-256 95551da2d569d2bdcb07e8ae25c66ea48bec4dd1e1cd60c9f7567f90c794fc4f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 81d1e4906226969412089757c3b881a07244aeb1f542ac6f8d8de95e4f35421e
MD5 60013cf21b788cae5fa841c9d01df3da
BLAKE2b-256 093d263f18cf4fe8722c8fce66525107f49908558a58da0352461f1ffbfdbea0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2c69c8dc71bb72a6bae0cedc639cc7a1e4903e307202ba5713f6f57b1f1e8c12
MD5 5a07b07d1d8354fc4d0b4e17ce31d831
BLAKE2b-256 ba37978b902ac78516e65c45abbca5cbd02cb378ddde28780aab0ebdc2ed4243

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ea69162b59f6aefbc991f18a9ed2dfc29888dd1257a4e23f097d5611801f0c10
MD5 bc63685f46992b7de02843f0d2f5838a
BLAKE2b-256 24b32d6aadf8dcfc30d3bfb136f172a1798ba5879c18121185284334e4015d7d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.2-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 385b9f0678e57a0faa4791e1cc47fd4df4449f07f9e8e997a9d539228588302e
MD5 dc1cb68790a02e4a65a88db944cadfbf
BLAKE2b-256 eead31361de076c32fb76d9c3fa062cfd6056df057859fc17bbfe0a8b4fa3918

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