news 2026/7/16 17:22:59

Tensor

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tensor

在计算机科学、深度学习(如 PyTorch、TensorFlow)以及 AI 编译器(如 MLIR、XLA)的语境下,Tensor(张量)是承载一切 AI 计算的核心数据结构。

如果用最通俗的话来定义:Tensor 就是一个“穿了铠甲”的多维数据容器

无论是在显卡(GPU)里狂飙的矩阵乘法,还是在 AI 编译器里流转的中间表示(IR),理解 Tensor 都可以从它的外在数学形态底层物理存储两个维度展开。


1. 外在形态:高维数据的“多面手”

从数学和编程的角度来看,Tensor 是对标量、向量和矩阵的高维泛化。你可以通过它的维度(Rank / Dimension)来直观认识它:

  • 0 维张量 (Rank 0) —— 标量 (Scalar):就是一个孤零零的数字。例如:1.0
  • 1 维张量 (Rank 1) —— 向量 (Vector):一排数字组成的数组。例如:一行特征值[1.0, 2.0, 3.0]
  • 2 维张量 (Rank 2) —— 矩阵 (Matrix):有行有列的表格。
  • 3 维张量 (Rank 3):像一本“书”,有长、宽、页数。在计算机视觉中,一张彩色图片(长×\times××\times×RGB 3通道)就是一个 3 维 Tensor。
  • 4 维张量 (Rank 4):像一排“书架”。在深度学习训练时,我们往往把多张图片打包成一个批次(Batch Size×\times×通道数×\times××\times×宽),这就是一个标准的 4 维 Tensor。

Tensor 的三大核心DNA:

  1. Shape(形状):每一维度的元素个数。比如形状为[3, 224, 224]的 Tensor。
  2. DataType(数据类型):里面存的是什么数字,比如f32(单精度浮点数)、i8(量化整数)。
  3. Layout(内存布局):决定了高维数据是怎么平铺在物理内存里的。

2. 物理本质:在内存里,它只是一条“直线”

这是非编译器开发者最容易忽视的一点:虽然 Tensor 在数学上是高维的,但计算机的物理内存(显存/内存)永远是一维线性的。

当你在 PyTorch 里定义一个[2, 3]的矩阵时,在显存里它其实只是连续躺着的 6 个数字。

为了让你能在上层用tensor[i][j]方便地访问数据,Tensor 的底层结构体(如 MLIR 中的MemRefDescriptor或 PyTorch 的底层实现)通常包含了以下几个核心指针和参数:

  • Base Pointer(基地址指针):指向这块连续物理内存的起点。
  • Offset(偏移量):从起点开始往后数多少个元素才是真正的数据。
  • Strides(步长)这是高维映射到一维的魔法所在。步长决定了当你把某个维度的坐标+1+1+1时,底层指针需要在物理内存上向前跳跃多少个格子。

💡 举个例子(步长魔术)

假设有一个形状为[2, 3]的二维 Tensor,在物理内存里存的顺序是[A, B, C, D, E, F]
它的步长(Strides)是[3, 1]

  • 当你想找tensor[0][1]时,物理位置等于0×3+1×1=10 \times 3 + 1 \times 1 = 10×3+1×1=1,对应B
  • 当你想找tensor[1][0](第二行第一列)时,物理位置等于1×3+0×1=31 \times 3 + 0 \times 1 = 31×3+0×1=3,指针直接跳过 3 个格子,对应D

这也是为什么在 AI 框架里做Tensor 转置(Transpose/Permute)往往快得不可思议——因为编译器根本没有去挪动显存里的数字,它只是悄悄把步长(Strides)的数值从[3, 1]改成了[1, 3],就把矩阵给旋过来了!


3. 在 AI 编译器(如 MLIR)中,Tensor 是如何被操纵的?

在你之前关心的编译系统(Compiler)世界里,Tensor 的生命周期会经历从抽象语义硬件贴身肉搏的降级(Lowering)过程:

① 高层图阶段:纯粹的数学符号

在线性代数层(如 MLIR 的linalg方言),Tensor 仅仅是一个值(Value)。它是不可变的,只表示数据流:

// 语义:两个张量相加,生成一个新的张量 %result = linalg.add ins(%t1, %t2 : tensor<2x3xf32>) -> tensor<2x3xf32>

在这个阶段,编译器只关心算子的数学融合(比如把 Add 和 ReLU 融合成一个算子),不需要关心内存怎么分配。

② 中间解构阶段:Bufferization(内存化)

硬件不懂什么叫抽象的“值”,硬件需要具体的“地址”。于是编译器会运行一个关键的 Pass 叫Bufferization,把抽象的tensor转换成手握物理内存指针的memref(内存引用)

// 语义:在堆区分配一块 2x3 的 f32 物理内存,把相加结果写进去 %mem = memref.alloc() : memref<2x3xf32>

③ 低层降级阶段:硬件指令

最终,这个memref会被进一步 Lower 成 LLVM IR,变成裸指针,并在最终生成汇编代码时,映射为 GPU 的LD/ST(加载/存储)指令或 CPU 的 SIMD(单指令多数据)向量寄存器操作。


总结

Tensor是整个现代人工智能帝国的砖瓦。在应用层,它是科学家玩弄高维数据的数学画板;在底层,它是编译器优化专家和硬件工程师通过指针、步长(Strides)和连续内存块压榨计算性能的终极战场。正是因为 Tensor 能够把复杂的现实世界(图像、语言、音频)高度抽象成规整的数字阵列,显卡和 AI 芯片才能毫无顾忌地全速轰鸣。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 17:22:07

Qwen3-Embedding-0.6B-8bit模型详解:8位量化如何提升性能与效率

Qwen3-Embedding-0.6B-8bit模型详解&#xff1a;8位量化如何提升性能与效率 【免费下载链接】Qwen3-Embedding-0.6B-8bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Qwen3-Embedding-0.6B-8bit Qwen3-Embedding-0.6B-8bit是一款基于MLX框架优化的轻量…

作者头像 李华
网站建设 2026/7/16 17:21:47

用户刷题行为序列建模:从时间序列中发现学习模式的AI方法

用户刷题行为序列建模&#xff1a;从时间序列中发现学习模式的AI方法 一、刷题日志里的"故事" 每个用户刷题都会留下一条行为序列&#xff1a;(时间, 题目ID, 结果, 耗时) 的元组串。单看一条记录无趣&#xff0c;但把 300 条记录串在一起&#xff0c;就能发现极具价…

作者头像 李华
网站建设 2026/7/16 17:21:42

DDE-GoCode性能优化技巧:让Deepin桌面运行更流畅的10个方法

DDE-GoCode性能优化技巧&#xff1a;让Deepin桌面运行更流畅的10个方法 【免费下载链接】DDE-GoCode dde desktop need some golang depend package 项目地址: https://gitcode.com/openeuler/DDE-GoCode 前往项目官网免费下载&#xff1a;https://ar.openeuler.org/ar/…

作者头像 李华
网站建设 2026/7/16 17:21:39

MM配置-主数据-物料管理公司代码初始化:OMSY配置详解与上线关键期设定

1. OMSY配置的核心意义与业务场景 第一次接触OMSY配置时&#xff0c;我误以为这只是个简单的日期设置。直到某次上线前夜系统突然报错"物料账期间未激活"&#xff0c;才真正理解这个看似简单的配置背后牵动着整个MM模块的命脉。OMSY配置的本质是 为物料管理划定时间…

作者头像 李华
网站建设 2026/7/16 17:19:55

Typst + VSCode 高效排版环境搭建指南

1. 为什么 Typst 值得你为它重装一次 VSCode&#xff1f; Typst 不是另一个 LaTeX 的平替&#xff0c;也不是 Markdown 的加强版——它是用现代编程思维重构“排版”这件事的底层逻辑。我第一次在学术会议海报上用 Typst 渲染出带自动编号的多级公式与跨页浮动图表时&#xff0…

作者头像 李华
网站建设 2026/7/16 17:18:59

实测有效!OpenClaw 2.7.9 本地 AI 智能体部署,彻底解决网关离线报错

✨内容亮点&#xff1a;全图形可视化操作、自动补齐全套运行依赖、本地独立存储数据、兼容多类主流大模型、45.7MB 轻量化整合压缩包 适配版本&#xff1a;OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 两大系统 &#x1f4a1;OpenClaw 工具核心使用优势 这款面向办公从业者与…

作者头像 李华