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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.13-cp314-cp314-macosx_11_0_universal2.whl (543.0 kB view details)

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

tensordict_nightly-2026.6.13-cp313-cp313-win_amd64.whl (617.0 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.13-cp313-cp313-macosx_11_0_universal2.whl (542.9 kB view details)

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

tensordict_nightly-2026.6.13-cp312-cp312-win_amd64.whl (616.9 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.13-cp312-cp312-macosx_11_0_universal2.whl (542.8 kB view details)

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

tensordict_nightly-2026.6.13-cp311-cp311-win_amd64.whl (615.3 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.13-cp311-cp311-macosx_11_0_universal2.whl (542.0 kB view details)

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

tensordict_nightly-2026.6.13-cp310-cp310-win_amd64.whl (612.3 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.13-cp310-cp310-macosx_11_0_universal2.whl (540.6 kB view details)

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

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 085a6f22c735ba0523f8461c6461a180c1583b23d2973c0c8f350db02b9f79ae
MD5 b1f9377242e38bd9312b7f6714a0e7fa
BLAKE2b-256 4579a4fdbf1b99428596a7205880c5b79714ede9273f7560bae7343cd6cac59d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4c02d7cba58964c9321513cc2b917e05f108c81cf906623bd03e27f1209fc055
MD5 0cfb1bc29bdc3618b55b652e0b9d1087
BLAKE2b-256 bc2108c5ca5506ce57d2f47b34d64dc5f54a2d121eb73067b80f3f5e3d84a16f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 7d46a063e1ae84f7990442172b3db778baa7b9729faeacbc57d7a6cb70ff87fd
MD5 4a2ffcc7175a9311dea7eccfe9f1e953
BLAKE2b-256 4df8fb29b6748ffde70639906d194001a28e726f55d6cd6eb7c5bbaa63a0c4f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 73806366e417008ed1a09698608540b6a2fbfe010a73c84695614116a51dc391
MD5 2a027ddceb6571d9051637b91fd37392
BLAKE2b-256 8ca873a2cd82dc421b08890222c6ab2c4c1a6901815f47c6942a6201bc94a4af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cd073fb825b8e4e452f8fc49afc6a07bd5d6ded7954683e9dd49c493ae978639
MD5 606ae68f2a3367c6e3d7c3d3310736e1
BLAKE2b-256 e61eca436587834fdd709ccc2e716ac8abbe01c780bbeef85f27ad4e6cbdd92c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 0304cb95e9fd3b40b7d3245c12e724872d59791b812a34472d1f2df3b65c8fd1
MD5 5763c27343b948184df69fc16090b9cc
BLAKE2b-256 484a796caa91eab07ccc0807f0101859422f235f82b123ecf3413cb1395f5f1c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 acac84c2ef7642538e77d7f23c1873e7b1e9c1db83e92dc46219c3efb271097b
MD5 8bc0ace812fb3e7dac8f0765bb673f77
BLAKE2b-256 c72499ed77e0ef9f935a2b63ff33670429b93d5f0209aeb3033d20c0d12f2923

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 59c9ad364ea8cd21e99001cb5d44089eaf56fd6f9c9b31d750be6ee86fac6a77
MD5 057ffb7da3d17848a5927429a2548691
BLAKE2b-256 b6c884c89d8562eab4f52e1de7cd45425b9256c9343070afce264cb8621239f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3c0c6de5bbbc1f97eeea004b86401b4caca632ccc96849d5cf9a012c95011898
MD5 5d4b73f44526279c559453f9b19a740f
BLAKE2b-256 7c3879ea37e6f82bc2c5b767d128237c6f6d672af92c5ec79672f571d7e7100a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7db292cff53f27b6df9917c317b6f167c461098c93457ec6bdf095c1ee5223e3
MD5 594f57f9cf20520e44ddee670e3db031
BLAKE2b-256 438856009b202c3f3e1c38f4778ebb63b8590592bcbe19acb322567bd8181f35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a3436505fd607bd4681ecf2b12d0b4c7d18c00d6ea680fef0b0846f4399dc4eb
MD5 a5e9181a01a851eeaad0a213107ce30c
BLAKE2b-256 19aecf381f52ad22feac6645480afa76b51905fa18fddac41c6f4fbf1de2d738

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 bdd34e9b66b1c4705042b4995616fa7254d8f53abf962101d2ada3239ae21ad2
MD5 8a7eef9b19993adbd8df89ce40dc4db1
BLAKE2b-256 2456e0b106ad1a17d13bd617b03d806c89837607196ed06dcd0bf0c1b1629165

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 05a58beb3f5ce7e44925c66008c9730ecac2306506c518c8794621e5357b13b3
MD5 f30a2d84dba6567bcd26665cfba25626
BLAKE2b-256 75b12e16aa3c212f96b6f2398f0ca0e45bdcbb75952ccd7531ee5ea77afd914e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2d180576c4c336d47492bdc5076b602ae704e2e49b4432d442935bdb406ed8b5
MD5 5e2fab0d8f6cb1a14fcc43e4cdf04ff4
BLAKE2b-256 9dad701facb7d05f6da4866077ec4ba8251b6418b52218382993bb32dc0d8110

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.13-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 eb04c4fe4ebeb2192fb9609e59ed6112822cf746ec1f795803fd6326d53f1b92
MD5 218044998d9ef020d4e66a2e7d7b002a
BLAKE2b-256 736182fe5c3222fd13c20340c45f11e4dba5f4bc1e60c59c5bf3bafc659f0bd2

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