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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.18-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.18-cp310-cp310-win_amd64.whl (614.1 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.18-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.18-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 df9df4ccd6f5076a5b46a63cd51b34f9840cbd4296f2f5c53e55b729882d010a
MD5 b78c89051973f3b361f06092b6c5df9b
BLAKE2b-256 6efc74d6b7a2bacd9b105c89cb2eb2a29abd99d8fddea7123cfbd5fc3c05fbbb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 75c08a86b9ec6084b8f0baf6ec9c30dea1bac2db4bc0881bc68a7ac57384adf0
MD5 c76d3cb1bacb6c8d7661a502e4eb5bbc
BLAKE2b-256 c35ca7834af272e96467ea9d4c101be7a2b2913abb614ad2e28c91d7a4e6a4e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 498fbcca9c052e9ae37feead72c23321fcfa1c5eb0e650cdcad6b4c51bc7cd09
MD5 35fb004b92e6193a023a9a5423afb203
BLAKE2b-256 6e9e3052788b5ad5b218cba97f859dd2acbc534f898ef88b7f7c706f854f6e13

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0b52e8945dccc1814d5a7f14f953ea6b186088b4e737c58f0c6a61a3d44bfef3
MD5 a86d9d848174e06993d52e0b071a2232
BLAKE2b-256 6a583e7200d6144eba5437ed52a5ba1c91b2e70d5c7a75b524db67f10f27470a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e2b4ee25d0358346316d11880097d442cd049e263082e038d5718860975ae081
MD5 588086a8422813d8f840880afe421571
BLAKE2b-256 02bfffd51ecd8df1e3a37c94e1ffaec4651a0764250e279432bd35c13dd38e3c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 358c393e11b75739c650f2457afce8592cd14aed4912dddff7ebf54ff3a4d488
MD5 0f8a29f021e3495adfe91f4f13dc9e04
BLAKE2b-256 0c073f5a01dce5f73df1f4b2b89936479fc7a13b4f24f840685838274e575381

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cec6a42467555298797b0951e13689b83f6777cea717419aa18f6d98ab2a6253
MD5 9f684728b07730889594d1a437320bed
BLAKE2b-256 3eba4b5eb3c4ea7a42774eb879557d80e156867e675874c33c664c508906f6cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 257581cda18cb1d9633e91eacdeae4d8795d260faad43019dcdadf9dc59fdec9
MD5 5f6de0b441bcc167ef0db3b4004f3656
BLAKE2b-256 ac9b213bf3fa6a4887d80cb17d35f3ab1e844967b149a4b84a744a60c76a6b2d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b2dcacde856720a22d4830655b9701950806817a16295d57c1229185c7bcf598
MD5 1bcadaa237bf172bb5aa03828139534b
BLAKE2b-256 5ca81204c0768525affe312a7502274cc48fcbb1239d4fd8c7faa763b0c62ec4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 752c81d9a44a988d80f3883268f2ef18e7d4688dbeac5876f23e6accd5e31c2d
MD5 1c9f1dab3024b7008dc78eff2528d730
BLAKE2b-256 8ae4d613b358cca145265325356fb7f2f5a9532377409ad0bf19d55eb9b84904

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9b81f8e7c9cd88f9690d230dac379d2c08081b20b8e37c65d4e33e091fc438fc
MD5 4649c854ab431c92640ece2cc79d5c6c
BLAKE2b-256 a0661f70168fdf2c82930d7476fd4fecbb3716db6cdc9a3fc7151f7dcd5088ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 0473f6c4360c7d376c65ec8860c2b28f63afb0a4633b4b147cc12a3bb238e830
MD5 ad59ec966dd104b492b2964544250b8c
BLAKE2b-256 44198dd8fc61877fa3d363778d21be74f6956a3549c322ee4dc45bc46ac3c8bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7ab260f22c10419eb1cb5306d699048d969d876aa29782783da37abd7708bda2
MD5 5ed0c203b0214886e44d2e2721b0099f
BLAKE2b-256 1d2cf92a27aa2b756a298bf12f789cc2c5bf3499e61d1c46f87a4e9f0be8eb56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 6260224815b1d7c1404ae2e8b18414aa772baf8bc964808534ecc226e60dd0f8
MD5 6d1a0ba5e163fa19cc9e6e8ea8e370e4
BLAKE2b-256 9fd5a55bb8b8cafefd9e6e990bd27667814a38851ddc21c84965af7ab9f24480

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.18-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 f5a990a1051b0df1e94a0d4a85e132bc58beb5b38957e6fea1207610247e90d8
MD5 31d7fced0d2135bc9c7285e8c86a6f5a
BLAKE2b-256 4027c438ba1704ae3eb1cbdabecb395235bbd3d24816836672bbe895395eb2a0

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