PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)

1. Tensor 内部存储结构

tensor 数据结构如下图所示,tensor 分为头信息区(Tensor)和存储区 (Storage),信息区主要保存着 Tensor 的形状(size)、步长(stride)、数据类型(type )等信息,而真正的数据则保存成连续的数组。

由于数据动辄成千数万,因此信息区占用内存较少,主要内存占用取决于 tensor 中元素数目,即存储区大小。

Tensor数据结构

2. 存储区

一般来说,一个 tensor 有着与之对应的 storagestorage 是在 data 之上封装的接口。不同 tensor 的头信息一般不同,但却可能使用相同的 storage

In [25]: a = t.arange(0, 6)

In [26]: a
Out[26]: tensor([0, 1, 2, 3, 4, 5])

In [27]: a.storage()
Out[27]: 
 0
 1
 2
 3
 4
 5
[torch.LongStorage of size 6]

In [28]: a.storage_offset()
Out[28]: 0

In [29]: a.storage_type()
Out[29]: torch.LongStorage

In [30]: b = a.view(2,3)

In [31]: b.storage()
Out[31]: 
 0
 1
 2
 3
 4
 5
[torch.LongStorage of size 6]

In [32]:

可以通过 Pythonid 值来判断它们在内存中的地址是否相等。

In [32]: id(a) == id(b)
Out[32]: False

In [33]: id(a.storage) == id(b.storage)
Out[33]: True

In [34]: 

可以看到 abstorage 是相等的。

a 改变,b 也跟着改变,因为它们是共享 storage 的。

In [34]: a[1] = 100

In [35]: b
Out[35]: 
tensor([[  0, 100,   2],
        [  3,   4,   5]])

数据和存储区的差异,c 的数据是切片之后的值,而存储区仍然是整体的值。

In [36]: c = a[2:]

In [37]: c
Out[37]: tensor([2, 3, 4, 5])

In [43]: c.data
Out[43]: tensor([2, 3, 4, 5])

In [38]: c.storage()
Out[38]: 
 0
 100
 2
 3
 4
 5
[torch.LongStorage of size 6]

In [39]: c.data_ptr(), a.data_ptr()
Out[39]: (132078864, 132078848)

In [40]: c.data_ptr() - a.data_ptr()
Out[40]: 16

data_ptr() 返回 tensor 首元素的内存地址,ca 的内存地址相差 16,也就是两个元素,即每个元素占用 8 个字节(LongStorage)。

c[0] 的内存地址对应 a[2] 内存地址。

In [44]: c[0] = -100

In [45]: a
Out[45]: tensor([   0,  100, -100,    3,    4,    5])

a.storageb.storagec.storage 三者的内存地址是相等的。

In [49]: id(a.storage) == id(b.storage) == id(c.storage)
Out[49]: True

In [51]: a.storage_offset(), b.storage_offset(), c.storage_offset()
Out[51]: (0, 0, 2)

In [52]: 

查看偏移位。

In [55]: d = b[::2, ::2]

In [56]: d
Out[56]: tensor([[   0, -100]])

In [57]: b
Out[57]: 
tensor([[   0,  100, -100],
        [   3,    4,    5]])

In [58]: id(d.storage) == id(b.storage)
Out[58]: True

In [59]: b.stride()
Out[59]: (3, 1)

In [60]: d.stride()
Out[60]: (6, 2)

In [61]: d.is_contiguous()
Out[61]: False

由此可见,绝大多数操作并不修改 tensor 的数据,只是修改了 tensor 的头信息,这种做法更节省内存,同时提升了处理速度。此外,有些操作会导致 tensor 不连续,这时需要调用 torch.contiguous 方法将其变成连续的数据,该方法会复制数据到新的内存,不在与原来的数据共享 storage

高级索引一般不共享 storage ,而普通索引共享 storage ,是因为普通索引可以通过修改 tensoroffsetstridesize 实现,不修改 storage 的数据,而高级索引则不行。

### 关于 Bridgedata 的概述 Bridgedata 是一种专注于多模态学习的数据集或工具,通常被应用于视觉语言任务、机器人控制以及其他跨领域的人工智能研究场景。尽管当前未直接提及 Bridgedata 的具体定义[^1],但从 OpenVLA 和 Gradio 等项目的描述来看,可以推测其可能涉及以下方面: - **数据格式支持**:类似于 RLDS(Reinforcement Learning Dataset Storage Format)或其他结构化存储方式,Bridgedata 可能提供了灵活的数据读取与处理能力。 - **技术栈依赖**:基于 PyTorch 生态系统的特性,Bridgedata 很可能会利用诸如 FSDP (Fully Sharded Data Parallel) 或 Flash Attention 等优化手段来提升性能[^2]。 以下是关于如何获取 Bridgedata 使用教程和技术文档的一些建议: --- ### 获取 Bridgedata 教程的方法 #### 官方资源 如果 Bridgedata 已经发布官方文档,则可以通过访问项目主页或者 GitHub 仓库找到详细的安装指南和示例代码。例如,在大多数开源项目中,开发者会提供如下文件: - `README.md` 文件:介绍基本功能、环境配置方法以及运行实例的方式。 - Jupyter Notebook 示例脚本:展示实际操作过程中的输入输出形式。 ```bash git clone https://github.com/example/Bridgedata.git cd Bridgedata/docs/ open getting_started.ipynb ``` 上述命令展示了克隆仓库并打开入门笔记的过程。 #### 社讨论平台 除了官方渠道外,还可以关注一些活跃的技术交流社寻找帮助,比如 Stack Overflow 上标记有 "#bridgedata" 标签的问题解答;又或者是 Reddit 中 r/MachineLearning 板块里分享的经验贴。 --- ### 技术细节解析 假设 Bridgedata 主要服务于训练大型预训练模型的任务需求,那么它的核心技术特点可能包括以下几个维度: 1. **高效的数据流水线设计** 数据流管理是任何深度学习框架不可或缺的一部分。为了满足实时性要求较高的在线服务端应用场合,Bridgedata 应该具备高度定制化的 batch generator 功能模块,允许用户自定义采样逻辑的同时保持较低延迟表现。 2. **轻量级 API 接口封装** 面向初学者友好型的设计理念使得整个 SDK 更加易于上手实践。即便是缺乏深厚背景知识的新手也能迅速掌握核心概念并通过少量修改完成个性化调整工作。 3. **广泛的硬件适配能力** 考虑到现在主流 AI 计算设备种类繁杂的情况,一套优秀的解决方案必然要考虑兼容 NVIDIA GPU/CPU 平台之外还应该尝试探索 AMD ROCm 支持状况等问题。 --- ### 示例代码片段 下面给出一段简单的 Python 实现演示如何加载本地存储路径下的 bridgedata 数据集合: ```python from bridgedata import DataLoader, transforms transform_pipeline = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) dataset_path = "/path/to/local/dataset" loader = DataLoader( root=dataset_path, transform=transform_pipeline, batch_size=8, shuffle=True ) for images, labels in loader: print(images.shape, labels) ``` 此段程序主要体现了两个重要组成部分——即数据增强变换链路设置(`transforms`)以及批量迭代器创建(`DataLoader`)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值