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

Uploaded CPython 3.14Windows x86-64

tensordict_nightly-2026.6.14-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.14-cp313-cp313-win_amd64.whl (617.0 kB view details)

Uploaded CPython 3.13Windows x86-64

tensordict_nightly-2026.6.14-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.14-cp312-cp312-win_amd64.whl (616.9 kB view details)

Uploaded CPython 3.12Windows x86-64

tensordict_nightly-2026.6.14-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.14-cp311-cp311-win_amd64.whl (615.3 kB view details)

Uploaded CPython 3.11Windows x86-64

tensordict_nightly-2026.6.14-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.14-cp310-cp310-win_amd64.whl (612.3 kB view details)

Uploaded CPython 3.10Windows x86-64

tensordict_nightly-2026.6.14-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.14-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 252ebb6e880a23168cd0befe4648ab0ae0ee5b4b193ace22de874092edb250fa
MD5 2a19732b34f017afcc429d8d745a5be5
BLAKE2b-256 ddb71eae391ba31fdc5c087d9e1b5454a550a3e8bb60414d07ab9147cd2c8e7c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp314-cp314-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ed7bb00f25293bb72494f24927980a2ed6837efc06a82937a01dc8b778292a32
MD5 23087466f4219a8f9df67338320e79b3
BLAKE2b-256 2f77bb5420fe3be8ca4590bfa20dabef86134650c7844adcb9f80e0f75f31bb0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp314-cp314-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 42deb821482e41cf6df36f633c364be7e46692d90fb4c83f1372e019e0f54446
MD5 7b12e634573565a5a624c6b517f8dbcb
BLAKE2b-256 4f19b18503240cded099d770cde2ddc32df30b49866e2e4a181737463a97088a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 203aeb65005ef6f6c6ac17fca9ab0df70d2957d3a11f3e45ad34982ba125f413
MD5 1fe3e6a85d5bf0ad93a9ae0ee7b1e722
BLAKE2b-256 84b65f71bfc77484195e547d1bcba8546a6e0f8ec685c36602e859f111abaab6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp313-cp313-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1d1c0d28b08369c083e8ea72e733c1c98bba0a6b76ed081774429d2795c9c842
MD5 80475af2d0683c20f83298200f68df79
BLAKE2b-256 47f9974f556d079a74f28b8f001276f543c013caa66704cef2381a08c31017fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 84982fe221edec36fcfdb67d7a193084b855217fed64eb997434c58155fbe461
MD5 5ad2994d2a31434edd81c9c0b5bdb716
BLAKE2b-256 5047ded525574f96e19fe5b31e975de294803f3f5d524ddfed6728801a739b22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 18dcdf06e45001f09117a1e4b93744612c8474801526fbf25838eaa0b737ef8a
MD5 bab001ab26a0820e3b8b90f59b7d3949
BLAKE2b-256 b4bc747d9f8df742aea5a09fbba9864e89c8ed6cf27387802f69b869ce7198c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp312-cp312-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 517af6cd5681af0d60ee58707f435e6610de144fc2b07e5274d00f18e7fb474d
MD5 1f7e9768c9b0203c3b69f1ed5c57453e
BLAKE2b-256 04a29a527d294f1e6be0f5fdcab0851175f26e01ed5cadd7db4d00ccdd7b1bec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 8eea8469d7bc038c01ec323a25674c0b4198c5cab8bd82537d2a25fc6a31dc45
MD5 28f56388a97e463fb53bc16d2d250e0d
BLAKE2b-256 4c8fe7fc1eabc65d5a408dd2caaca167d7db012958cee84466dd035fcd34fca6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7af5f542c1e88703269c537477a606e71860e2ccc43f881b0d97f5e95e1e2855
MD5 b8a90830096040ad35e55ccf95161300
BLAKE2b-256 7ab362caf9725d45ddf1d55ac975335fbb90d3b66b72c756426b219121aebea4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp311-cp311-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 06ee1e7bd8024639d991da937157743b71f90e21dbd9647513dd09d3431c748d
MD5 1aa4b1d51f4fb579e279b7fc80f7f9d4
BLAKE2b-256 90db611acfbbd0680fffce38b4b9fb78c4fc8e2af579292b5f8a26f51b4a93be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 2265554ede0b164dba471cd970d01e6b63abca2a2b75974b3b4d713802635e6b
MD5 5fac0678f6999172f863b07c33cd3bbe
BLAKE2b-256 b46222ac5ee1284e99dd9fe0270d1b2fd5b33d01427b095e9c45c3c3f71385b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e43d74cce5c5823a901ab7f627c06b1b3c85f0ef949bc0cd7deec347826ea005
MD5 dd855321ff353c7f4c0f82405acea091
BLAKE2b-256 d45cb188ab289a5fdb331ec4cd29a303049d0cef826059e62907fb16adfb44bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp310-cp310-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e20131b398df84a23b7ecaa9a099bbaa485765cb20921d96f7dc97c101548198
MD5 47ae5086499e660737637bc1eaa2a475
BLAKE2b-256 89925d8e3dc59932a2868a2042449c6451a9a67f582e6dd106b4f77909a54f7e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensordict_nightly-2026.6.14-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 e60fd4fb9a81800857382a1bbe7154253da7b75cfd4bf2b908d53202c9267a93
MD5 d3ccf8007e355c6eb567e9f5505f7854
BLAKE2b-256 6e765a3b4669a88f246e5c9bf3955606bd7857f003ba25df605eddaf4876854b

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