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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.26-cp311-cp311-macosx_11_0_universal2.whl (546.5 kB view details)

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

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

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.26-cp310-cp310-macosx_11_0_universal2.whl (544.6 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 3e135ffd7c1b039caa431b1ffa53a97dcf59a16051793f5ec726596afd49095e
MD5 673f6b3a26c389dcd92bb126b81af0cf
BLAKE2b-256 40c2638c301db64a9fbd9cc2fa835e0144233c0322e5adfa895a2bc22efc825f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5413148fe6a542dab9f54391d76a95f8da4e61084ae9331493cbc718a3a57a19
MD5 5b48dd982a97b703be71a5ce247f3521
BLAKE2b-256 a9c7b76fefd338ac8f5e909f162dfafbd17f0901169508a3a677721719ce8b21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 ea8550438769d121e60011649fa7b10f33262a96e02e8c7dc8cf5e300af91c3f
MD5 8da8664b7f7addf48e995ba219d3f20d
BLAKE2b-256 44ec043783cbe06bfcb03ea16dfccbbf8fa73725c3d979c88668d9a3f8f24b3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 01e8729f7b49712298f6986311218d47ea080f6d1749c1c1a4d7164f40e0702a
MD5 bb62d1e663fb895962594d43a5efed13
BLAKE2b-256 1d54536355bf0485fd053dc6a22a43d552c88e80090a0f4046dc994cf265a969

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0acd037f3bc3a5e678082473d76d2eb21ac9127b1028e057fecacca30604131b
MD5 11b392c3cb52f3bbaa1214a5d4a48cfc
BLAKE2b-256 3cea13f48df40b4ae87f9f1d02e5d7a7d4559287999abdd982a5fbf6bd7af125

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 fcdc21f4bfbe5c61c1e8cf371d3e3a89935ef6b70925bb73312ef84c4a08f35b
MD5 1e920bf52087ec8e08d1666009b7bde4
BLAKE2b-256 5d8afc944e5c8e2ce4a1840e5a22d124788404a266960bf013a2bc395dca464e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 dbd879d08c572d8231a066f2bd8193aebca6ca3b548af6c85ee50c3c78f8be19
MD5 e97149aa9ccf3c5b9ad82b7f4c6e601b
BLAKE2b-256 ca9df2a073e39496cf85e9e9ae78d1b575b6fc5150169039ca0f0b7eaa31409c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c198a0148bfa04024575ca26083fb818aec9fd5aa03cd0e0a1a12b074d9c57a5
MD5 69e8ac3e4a4543ee069779a927a60d32
BLAKE2b-256 a563e621d337bf56643a7cc96f6ddc81c5673f958caada2cfe9f242ce51c7c1a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 69e6a2427afbfc54f3a4e51a74dd53623a5376dc60c26f0970696f5fc6b323a6
MD5 213748930666cd14b4e5f0196eb89e2c
BLAKE2b-256 f83467c790ed57ae95581fae4216917248d6245f7c1c013039a37cc413f228aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9a065d49ed3e0ec3c3644d3c9741e41bf9134066a2b2857b600c632b6ccb8eba
MD5 db9dce16bde693e62cbc66260ee1285b
BLAKE2b-256 f6de4e9251a856efd634d0f550dd384ab34315afcdcbc20e055ba125c56c647d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1e5ade456df224091c34bd58b34490054df93526e48971474c4bb55f4c25e060
MD5 a52129a9e1dc151c977ffe47c45d1bef
BLAKE2b-256 e1e073130c8899317e8475684bb975d29e0654c24ff367bc6a19475be8e51ea7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 26d5b7a14c2aaf3db1c59166f7fecb31399233f73d3d3a8052f8fa6d6ff0ead4
MD5 6ca96f5f356c3587d88a1ebb67a5b0d0
BLAKE2b-256 970df5e1f9daed2e417983df824c198db9b4f1b375d831340f11f873c1fc5448

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e4ad7769bdb2d477823e3e464cd0507c2a24202238634536b5285f919c2e4092
MD5 cc2c2b0b31ae8749af706759e128331f
BLAKE2b-256 6c9c83dc6bb6b1c9250b7d4783c9e047302925fbf3f7da3d01f1537d2e43dcb1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2c086747a776627a05dcf623ff43ed6447874e94cf5b997f15806fb53f9bcf3c
MD5 7dfe0e9967532f7c04fa654e50bf4eca
BLAKE2b-256 d3711c15d173c52f8513ddd305cc66f57fb482331384dcb6b13169c0002eb4d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.26-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 89068ed00b22a494c49c88dfb845e562a410ba71c67066c1deaf7a5bb81f250c
MD5 fe639dd55a2b17ed71aa5929684eaf22
BLAKE2b-256 ba89da1d182e1f37aa972dd59c5fcc2c69c67ad8116493519324206e79bb9b35

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