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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.7.5-cp314-cp314-macosx_11_0_universal2.whl (551.8 kB view details)

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

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

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.7.5-cp313-cp313-macosx_11_0_universal2.whl (549.1 kB view details)

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

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

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.7.5-cp312-cp312-macosx_11_0_universal2.whl (549.0 kB view details)

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

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

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.7.5-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.5-cp310-cp310-win_amd64.whl (618.5 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.7.5-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.5-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a7e1931aadf4779a15aeaad8bdeb5b7d8438a47c5d87e2e759c88c928f393bdf
MD5 0ecee7b0b78f2cc14192644010a75701
BLAKE2b-256 6637eba486fe641902079a55afdaeb92a294f0ffdb7c20f155076e7bf508c03d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b4cf906fec986d978d3fca5d88d77d397e30c6ddd1c94ff350c5435e164c1748
MD5 695ae18c13270821706be60ffa4fe51c
BLAKE2b-256 050a5eb83d4058a11499fec4c48bf53e4341ece8e96bcd9a4c17420efb80624e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 9c0b79aa8d9eabab3fe7e28372ca63f96df1aaf327c7a6c78b1a1094646457cb
MD5 185bdf76c39bc56139cc75007d1c5e28
BLAKE2b-256 b5f8f53385500e2554bbdc4dd7b2505191085e13cab07b3803bbb88022465232

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c4455ced2792b61dfeb03ce8ea4628a48c9a8c684a1795f3903d2de9b8113cd7
MD5 2063b448a397210522ec0b80b732f30f
BLAKE2b-256 21df06053d8272289c4281ad1d4aee9a9e66aac557b4df6ff25615489edf0279

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 6e1e961b73898cb16c45b008eb3b6c39420c0dbdd4b77b8844e3a5cc9353a3b0
MD5 7b60f5baf9a4e4f60a31e842e10ee4b1
BLAKE2b-256 d7c76590849891bfb6b19b3a8b4c3fbe9d7c730cf7affa9a00b0c8e641336374

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a7a8dd4af3d2047ef55337c1f2d3ca41169025eb1dc73a23a2b42dc0e5c7569b
MD5 62f78157be5a85bd3df1e3ee6fd99bb5
BLAKE2b-256 786002b76915618aa39e8b5484105685df7a48777f1f2619c5fde64c917df59c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9a64e64644685219dcd2b02e47b318d6528c864ddfd782801838432c328b1bd5
MD5 f46fde5d99fb57cc7b02324d311cd9c4
BLAKE2b-256 48a28456f6bc13f830719545857649b390b01cf3635a6af64ab4e6a1cc563503

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4594b9b86405addd02db3e830682b32a46dbd38a8753f1810ec27c5e90956e45
MD5 96c878eea2cdd9be72beb088794b1906
BLAKE2b-256 a012297ce5320bd496e9d2915c8a26d40465aabf6c07bd35028eb3aa1f1136a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 fe68772d1a74a69d61e76ba8918df16fcbea01a32ce63db68da91fe5144d48c0
MD5 a113c72e83b345eaf2d0724ed2e6e4ac
BLAKE2b-256 90444cfa9c872aa2bee88fb322d2dac6ab7f61441f3d9cabed6bf9b7b9d155f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 122584d498ef517fb15c0b2d5f9b6d0cd5fa9138e2f7f1ae58cd9a9c153a29d3
MD5 6daa53af338c6cf7ba0759077184d4ba
BLAKE2b-256 3ced0d2f416a4e2736ab3a223d89fd14c3abf71726f78f8c288782946e4401e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b5f9584c01c3c419b81bd4a0448921b1e685f001ffc90abef425aba243e369fe
MD5 4ffd2897df31523c7ffd998b396c9dfa
BLAKE2b-256 42f20c9268cd7800529a295fe034e3a93d8a471c460dc8d4ddcd3a5b76ef2f81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 82dc1cecf99bde8ea5f16c1837342b148ad221bc8d44721cb0169cf8c5fa6c0b
MD5 ab0ddba9fae04f29ac86e8e3a7f7771b
BLAKE2b-256 3f53d2a772b9c04cbcba2ed7d70e4a7f5e84b290ae16570c9727621e055bb3d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5cf9d836b42a8d252613cfbb74315b4035dc8388ef5157dae17f57516db29142
MD5 9678e2f566c436b790ff57ff1dd28abd
BLAKE2b-256 753dd954ad05599167c02f7b9a6792be23acd92727c3104a4b385dbc1238eb64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 318c296ae6dbc01a4a8f9ecbdbc37ace78b58b309b1c85722de5191fd72c67da
MD5 cca3be514b6cc0469fb2bd89b1706551
BLAKE2b-256 76c0998cbc55aed94b1acef8c46b9eb08227b5d41a9a462812f004a5d1d0ab00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.7.5-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 790f0f137cc56383619bfed6b3e6b4e73f36a0d5f716b24690e58b20d1b31773
MD5 4717955efd0da5cdfdc73c4542dbfc79
BLAKE2b-256 d7708b831232e2c7e11918b01f1b7af69372adc069d88d2b014c8c33ac463812

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