<!--- BADGES: START --->
<!---
[![Documentation](https://img.shields.io/badge/Documentation-blue.svg?style=flat)](https://pytorch.github.io/tensordict/)
--->
[![Docs - GitHub.io](https://img.shields.io/static/v1?logo=github&style=flat&color=pink&label=docs&message=tensordict)][#docs-package]
[![Discord Shield](https://dcbadge.vercel.app/api/server/tz3TgTAe3D)](https://discord.gg/tz3TgTAe3D)
[![Benchmarks](https://img.shields.io/badge/Benchmarks-blue.svg)][#docs-package-benchmark]
[![Python version](https://img.shields.io/pypi/pyversions/tensordict.svg)](https://www.python.org/downloads/)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)][#github-license]
<a href="https://pypi.org/project/tensordict"><img src="https://img.shields.io/pypi/v/tensordict" alt="pypi version"></a>
<a href="https://pypi.org/project/tensordict-nightly"><img src="https://img.shields.io/pypi/v/tensordict-nightly?label=nightly" alt="pypi nightly version"></a>
[![Downloads](https://static.pepy.tech/personalized-badge/tensordict?period=total&units=international_system&left_color=blue&right_color=orange&left_text=Downloads)][#pepy-package]
[![Downloads](https://static.pepy.tech/personalized-badge/tensordict-nightly?period=total&units=international_system&left_color=blue&right_color=orange&left_text=Downloads%20(nightly))][#pepy-package-nightly]
[![codecov](https://codecov.io/gh/pytorch/tensordict/branch/main/graph/badge.svg?token=9QTUG6NAGQ)][#codecov-package]
[![circleci](https://circleci.com/gh/pytorch/tensordict.svg?style=shield)][#circleci-package]
[![Conda - Platform](https://img.shields.io/conda/pn/conda-forge/tensordict?logo=anaconda&style=flat)][#conda-forge-package]
[![Conda (channel only)](https://img.shields.io/conda/vn/conda-forge/tensordict?logo=anaconda&style=flat&color=orange)][#conda-forge-package]
[#docs-package]: https://pytorch.github.io/tensordict/
[#docs-package-benchmark]: https://pytorch.github.io/tensordict/dev/bench/
[#github-license]: https://github.com/pytorch/tensordict/blob/main/LICENSE
[#pepy-package]: https://pepy.tech/project/tensordict
[#pepy-package-nightly]: https://pepy.tech/project/tensordict-nightly
[#codecov-package]: https://codecov.io/gh/pytorch/tensordict
[#circleci-package]: https://circleci.com/gh/pytorch/tensordict
[#conda-forge-package]: https://anaconda.org/conda-forge/tensordict
<!--- BADGES: END --->
# 📖 TensorDict
TensorDict is a dictionary-like class that inherits properties from tensors, making it easy to work with collections of
tensors in PyTorch. It provides a simple and intuitive way to manipulate and process tensors, allowing you to focus on
building and training your models.
[**Key Features**](#key-features) |
[**Examples**](#examples) |
[**Installation**](#installation) |
[**Citation**](#citation) |
[**License**](#license)
## Key Features
TensorDict makes your code-bases more _readable_, _compact_, _modular_ and _fast_.
It abstracts away tailored operations, making your code less error-prone as it takes care of
dispatching the operation on the leaves for you.
The key features are:
- 🧮 **Composability**: `TensorDict` generalizes `torch.Tensor` operations to collection of tensors.
- ⚡️ **Speed**: asynchronous transfer to device, fast node-to-node communication through `consolidate`, compatible with `torch.compile`.
- ✂️ **Shape operations**: Perform tensor-like operations on TensorDict instances, such as indexing, slicing or
concatenation.
- 🌐 **Distributed / multiprocessed capabilities**: Easily distribute TensorDict instances across multiple workers,
devices and machines.
- 💾 **Serialization** and memory-mapping
- λ **Functional programming** and compatibility with `torch.vmap`
- 📦 **Nesting**: Nest TensorDict instances to create hierarchical structures.
- ⏰ **Lazy preallocation**: Preallocate memory for TensorDict instances without initializing the tensors.
- 📝 **Specialized dataclass** for torch.Tensor ([`@tensorclass`](#tensorclass))
![tensordict.png](docs%2Ftensordict.png)
## Examples
This section presents a couple of stand-out applications of the library.
Check our [**Getting Started**](GETTING_STARTED.md) guide for an overview of TensorDict's features!
### Fast copy on device
`TensorDict` optimizes transfers from/to device to make them safe and fast.
By default, data transfers will be made asynchronously and synchronizations will be called whenever needed.
```python
# Fast and safe asynchronous copy to 'cuda'
td_cuda = TensorDict(**dict_of_tensor, device="cuda")
# Fast and safe asynchronous copy to 'cpu'
td_cpu = td_cuda.to("cpu")
# Force synchronous copy
td_cpu = td_cuda.to("cpu", non_blocking=False)
```
### Coding an optimizer
For instance, using `TensorDict` you can code the Adam optimizer as you would for a single `torch.Tensor` and apply
that to a `TensorDict` input as well. On `cuda`, these operations will rely on fused kernels, making it very fast to
execute:
```python
class Adam:
def __init__(self, weights: TensorDict, alpha: float=1e-3,
beta1: float=0.9, beta2: float=0.999,
eps: float = 1e-6):
# Lock for efficiency
weights = weights.lock_()
self.weights = weights
self.t = 0
self._mu = weights.data.clone()
self._sigma = weights.data.mul(0.0)
self.beta1 = beta1
self.beta2 = beta2
self.alpha = alpha
self.eps = eps
def step(self):
self._mu.mul_(self.beta1).add_(self.weights.grad, 1 - self.beta1)
self._sigma.mul_(self.beta2).add_(self.weights.grad.pow(2), 1 - self.beta2)
self.t += 1
mu = self._mu.div_(1-self.beta1**self.t)
sigma = self._sigma.div_(1 - self.beta2 ** self.t)
self.weights.data.add_(mu.div_(sigma.sqrt_().add_(self.eps)).mul_(-self.alpha))
```
### Training a model
Using tensordict primitives, most supervised training loops can be rewritten in a generic way:
```python
for i, data in enumerate(dataset):
# the model reads and writes tensordicts
data = model(data)
loss = loss_module(data)
loss.backward()
optimizer.step()
optimizer.zero_grad()
```
With this level of abstraction, one can recycle a training loop for highly heterogeneous task.
Each individual step of the training loop (data collection and transform, model prediction, loss computation etc.)
can be tailored to the use case at hand without impacting the others.
For instance, the above example can be easily used across classification and segmentation tasks, among many others.
## Installation
**With Pip**:
To install the latest stable version of tensordict, simply run
```bash
pip install tensordict
```
This will work with Python 3.7 and upward as well as PyTorch 1.12 and upward.
To enjoy the latest features, one can use
```bash
pip install tensordict-nightly
```
**With Conda**:
Install `tensordict` from `conda-forge` channel.
```sh
conda install -c conda-forge tensordict
```
## Citation
If you're using TensorDict, please refer to this BibTeX entry to cite this work:
```
@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}
}
```
## Disclaimer
TensorDict is at the *beta*-stage, meaning that there may be bc-breaking changes introduced, but
they should come with a warranty.
Hopefully these should not happen too often, as the current roadmap mostly
involves adding new features and building compatibility with the broader
PyTorch ecosystem.
## License
TensorDict is licensed under the MIT License. See [LICENSE](LICENSE) for details.
Raw data
{
"_id": null,
"home_page": "https://github.com/pytorch/tensordict",
"name": "tensordict-nightly",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": null,
"author": "tensordict contributors",
"author_email": "vmoens@fb.com",
"download_url": null,
"platform": null,
"description": "<!--- BADGES: START --->\r\n<!---\r\n[![Documentation](https://img.shields.io/badge/Documentation-blue.svg?style=flat)](https://pytorch.github.io/tensordict/)\r\n--->\r\n[![Docs - GitHub.io](https://img.shields.io/static/v1?logo=github&style=flat&color=pink&label=docs&message=tensordict)][#docs-package]\r\n[![Discord Shield](https://dcbadge.vercel.app/api/server/tz3TgTAe3D)](https://discord.gg/tz3TgTAe3D)\r\n[![Benchmarks](https://img.shields.io/badge/Benchmarks-blue.svg)][#docs-package-benchmark]\r\n[![Python version](https://img.shields.io/pypi/pyversions/tensordict.svg)](https://www.python.org/downloads/)\r\n[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)][#github-license]\r\n<a href=\"https://pypi.org/project/tensordict\"><img src=\"https://img.shields.io/pypi/v/tensordict\" alt=\"pypi version\"></a>\r\n<a href=\"https://pypi.org/project/tensordict-nightly\"><img src=\"https://img.shields.io/pypi/v/tensordict-nightly?label=nightly\" alt=\"pypi nightly version\"></a>\r\n[![Downloads](https://static.pepy.tech/personalized-badge/tensordict?period=total&units=international_system&left_color=blue&right_color=orange&left_text=Downloads)][#pepy-package]\r\n[![Downloads](https://static.pepy.tech/personalized-badge/tensordict-nightly?period=total&units=international_system&left_color=blue&right_color=orange&left_text=Downloads%20(nightly))][#pepy-package-nightly]\r\n[![codecov](https://codecov.io/gh/pytorch/tensordict/branch/main/graph/badge.svg?token=9QTUG6NAGQ)][#codecov-package]\r\n[![circleci](https://circleci.com/gh/pytorch/tensordict.svg?style=shield)][#circleci-package]\r\n[![Conda - Platform](https://img.shields.io/conda/pn/conda-forge/tensordict?logo=anaconda&style=flat)][#conda-forge-package]\r\n[![Conda (channel only)](https://img.shields.io/conda/vn/conda-forge/tensordict?logo=anaconda&style=flat&color=orange)][#conda-forge-package]\r\n\r\n[#docs-package]: https://pytorch.github.io/tensordict/\r\n[#docs-package-benchmark]: https://pytorch.github.io/tensordict/dev/bench/\r\n[#github-license]: https://github.com/pytorch/tensordict/blob/main/LICENSE\r\n[#pepy-package]: https://pepy.tech/project/tensordict\r\n[#pepy-package-nightly]: https://pepy.tech/project/tensordict-nightly\r\n[#codecov-package]: https://codecov.io/gh/pytorch/tensordict\r\n[#circleci-package]: https://circleci.com/gh/pytorch/tensordict\r\n[#conda-forge-package]: https://anaconda.org/conda-forge/tensordict\r\n\r\n<!--- BADGES: END --->\r\n\r\n# \ud83d\udcd6 TensorDict\r\n\r\nTensorDict is a dictionary-like class that inherits properties from tensors, making it easy to work with collections of\r\ntensors in PyTorch. It provides a simple and intuitive way to manipulate and process tensors, allowing you to focus on\r\nbuilding and training your models.\r\n\r\n[**Key Features**](#key-features) |\r\n[**Examples**](#examples) |\r\n[**Installation**](#installation) |\r\n[**Citation**](#citation) |\r\n[**License**](#license)\r\n\r\n## Key Features\r\nTensorDict makes your code-bases more _readable_, _compact_, _modular_ and _fast_.\r\nIt abstracts away tailored operations, making your code less error-prone as it takes care of\r\ndispatching the operation on the leaves for you.\r\n\r\nThe key features are:\r\n\r\n- \ud83e\uddee **Composability**: `TensorDict` generalizes `torch.Tensor` operations to collection of tensors.\r\n- \u26a1\ufe0f **Speed**: asynchronous transfer to device, fast node-to-node communication through `consolidate`, compatible with `torch.compile`.\r\n- \u2702\ufe0f **Shape operations**: Perform tensor-like operations on TensorDict instances, such as indexing, slicing or\r\n concatenation.\r\n- \ud83c\udf10 **Distributed / multiprocessed capabilities**: Easily distribute TensorDict instances across multiple workers,\r\n devices and machines.\r\n- \ud83d\udcbe **Serialization** and memory-mapping\r\n- \u03bb **Functional programming** and compatibility with `torch.vmap`\r\n- \ud83d\udce6 **Nesting**: Nest TensorDict instances to create hierarchical structures.\r\n- \u23f0 **Lazy preallocation**: Preallocate memory for TensorDict instances without initializing the tensors.\r\n- \ud83d\udcdd **Specialized dataclass** for torch.Tensor ([`@tensorclass`](#tensorclass))\r\n\r\n![tensordict.png](docs%2Ftensordict.png)\r\n\r\n## Examples\r\n\r\nThis section presents a couple of stand-out applications of the library.\r\nCheck our [**Getting Started**](GETTING_STARTED.md) guide for an overview of TensorDict's features!\r\n\r\n### Fast copy on device\r\n`TensorDict` optimizes transfers from/to device to make them safe and fast.\r\nBy default, data transfers will be made asynchronously and synchronizations will be called whenever needed.\r\n```python\r\n# Fast and safe asynchronous copy to 'cuda'\r\ntd_cuda = TensorDict(**dict_of_tensor, device=\"cuda\")\r\n# Fast and safe asynchronous copy to 'cpu'\r\ntd_cpu = td_cuda.to(\"cpu\")\r\n# Force synchronous copy\r\ntd_cpu = td_cuda.to(\"cpu\", non_blocking=False)\r\n```\r\n\r\n### Coding an optimizer\r\nFor instance, using `TensorDict` you can code the Adam optimizer as you would for a single `torch.Tensor` and apply\r\nthat to a `TensorDict` input as well. On `cuda`, these operations will rely on fused kernels, making it very fast to\r\nexecute:\r\n```python\r\nclass Adam:\r\n def __init__(self, weights: TensorDict, alpha: float=1e-3,\r\n beta1: float=0.9, beta2: float=0.999,\r\n eps: float = 1e-6):\r\n # Lock for efficiency\r\n weights = weights.lock_()\r\n self.weights = weights\r\n self.t = 0\r\n\r\n self._mu = weights.data.clone()\r\n self._sigma = weights.data.mul(0.0)\r\n self.beta1 = beta1\r\n self.beta2 = beta2\r\n self.alpha = alpha\r\n self.eps = eps\r\n\r\n def step(self):\r\n self._mu.mul_(self.beta1).add_(self.weights.grad, 1 - self.beta1)\r\n self._sigma.mul_(self.beta2).add_(self.weights.grad.pow(2), 1 - self.beta2)\r\n self.t += 1\r\n mu = self._mu.div_(1-self.beta1**self.t)\r\n sigma = self._sigma.div_(1 - self.beta2 ** self.t)\r\n self.weights.data.add_(mu.div_(sigma.sqrt_().add_(self.eps)).mul_(-self.alpha))\r\n```\r\n\r\n### Training a model\r\n\r\nUsing tensordict primitives, most supervised training loops can be rewritten in a generic way:\r\n```python\r\nfor i, data in enumerate(dataset):\r\n # the model reads and writes tensordicts\r\n data = model(data)\r\n loss = loss_module(data)\r\n loss.backward()\r\n optimizer.step()\r\n optimizer.zero_grad()\r\n```\r\n\r\nWith this level of abstraction, one can recycle a training loop for highly heterogeneous task.\r\nEach individual step of the training loop (data collection and transform, model prediction, loss computation etc.)\r\ncan be tailored to the use case at hand without impacting the others.\r\nFor instance, the above example can be easily used across classification and segmentation tasks, among many others.\r\n\r\n## Installation\r\n\r\n**With Pip**:\r\n\r\nTo install the latest stable version of tensordict, simply run\r\n\r\n```bash\r\npip install tensordict\r\n```\r\n\r\nThis will work with Python 3.7 and upward as well as PyTorch 1.12 and upward.\r\n\r\nTo enjoy the latest features, one can use\r\n\r\n```bash\r\npip install tensordict-nightly\r\n```\r\n\r\n**With Conda**:\r\n\r\nInstall `tensordict` from `conda-forge` channel.\r\n\r\n```sh\r\nconda install -c conda-forge tensordict\r\n```\r\n\r\n## Citation\r\n\r\nIf you're using TensorDict, please refer to this BibTeX entry to cite this work:\r\n```\r\n@misc{bou2023torchrl,\r\n title={TorchRL: A data-driven decision-making library for PyTorch},\r\n 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},\r\n year={2023},\r\n eprint={2306.00577},\r\n archivePrefix={arXiv},\r\n primaryClass={cs.LG}\r\n}\r\n```\r\n\r\n## Disclaimer\r\n\r\nTensorDict is at the *beta*-stage, meaning that there may be bc-breaking changes introduced, but\r\nthey should come with a warranty.\r\nHopefully these should not happen too often, as the current roadmap mostly\r\ninvolves adding new features and building compatibility with the broader\r\nPyTorch ecosystem.\r\n\r\n## License\r\n\r\nTensorDict is licensed under the MIT License. See [LICENSE](LICENSE) for details.\r\n",
"bugtrack_url": null,
"license": "BSD",
"summary": null,
"version": "2024.12.7",
"project_urls": {
"Homepage": "https://github.com/pytorch/tensordict"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "ae5f57456d068e4e3fa3e588b5fa5d1274db084c73c1b45d9031d2ca9521dfd3",
"md5": "b0c0f32d933277a366d6d256982bf6d0",
"sha256": "16a5ceac95e9062af3db7d2a4067e17888fdd56dc674f287a36fa651a617d272"
},
"downloads": -1,
"filename": "tensordict_nightly-2024.12.7-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "b0c0f32d933277a366d6d256982bf6d0",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 370281,
"upload_time": "2024-12-07T13:56:04",
"upload_time_iso_8601": "2024-12-07T13:56:04.622512Z",
"url": "https://files.pythonhosted.org/packages/ae/5f/57456d068e4e3fa3e588b5fa5d1274db084c73c1b45d9031d2ca9521dfd3/tensordict_nightly-2024.12.7-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "59dfc2e5281276173fd54f5b2abc812dfa3b21c0c6958204d9f800af5fbce246",
"md5": "bf4277c24fa6ca08a552cb360e79f7a9",
"sha256": "12567a5a39f607df0d33df1121e4452f95378a0e00eeccc5edd15a76d671adbe"
},
"downloads": -1,
"filename": "tensordict_nightly-2024.12.7-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "bf4277c24fa6ca08a552cb360e79f7a9",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 371260,
"upload_time": "2024-12-07T13:56:04",
"upload_time_iso_8601": "2024-12-07T13:56:04.555330Z",
"url": "https://files.pythonhosted.org/packages/59/df/c2e5281276173fd54f5b2abc812dfa3b21c0c6958204d9f800af5fbce246/tensordict_nightly-2024.12.7-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d1b2b2ba4b8a44ed9b2ceb6cec2d3a298da0571b3d688d918126c7aa12cb0a18",
"md5": "0873ff930f01699a9d2084d2074a2483",
"sha256": "1e643a12946a7b3a70306ec1baf7faf59e691ddee503726d03868b05e1353b64"
},
"downloads": -1,
"filename": "tensordict_nightly-2024.12.7-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "0873ff930f01699a9d2084d2074a2483",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 377211,
"upload_time": "2024-12-07T13:56:03",
"upload_time_iso_8601": "2024-12-07T13:56:03.709186Z",
"url": "https://files.pythonhosted.org/packages/d1/b2/b2ba4b8a44ed9b2ceb6cec2d3a298da0571b3d688d918126c7aa12cb0a18/tensordict_nightly-2024.12.7-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c9efd705901b47259d53d4401b53b5b9fe804cb888aa642586487ad7db9a4be6",
"md5": "df59b3cbaeb421805aeb00a1dc61fb68",
"sha256": "5ab0e83426dc64c3e5a7d21edcae6e9732da04da3fac77a27c3f3c7403d9b945"
},
"downloads": -1,
"filename": "tensordict_nightly-2024.12.7-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "df59b3cbaeb421805aeb00a1dc61fb68",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 370185,
"upload_time": "2024-12-07T13:56:07",
"upload_time_iso_8601": "2024-12-07T13:56:07.940011Z",
"url": "https://files.pythonhosted.org/packages/c9/ef/d705901b47259d53d4401b53b5b9fe804cb888aa642586487ad7db9a4be6/tensordict_nightly-2024.12.7-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-07 13:56:04",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "pytorch",
"github_project": "tensordict",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "tensordict-nightly"
}