大模型文件里没有文字也没有图片,只有一堆带形状的多维数字阵列,它们的学名叫张量。在 ModelScope 下载权重、看模型卡片、报显存不足,处处都撞见这个词,本文从零讲清张量是什么、形状为什么重要。
从数字到张量:维度逐级上升
一个数是标量,一排数是向量,一张数表是矩阵,再往上叠就是三维、四维张量——统称张量。深度学习里数据从不单蹦:一批句子进模型,形状通常写成「批大小乘序列长度乘隐藏维度」的三维张量。维度不玄,就是数据的组织层级:哪一批、哪个字、第几个特征,用下标一查就到。类比仓库:散件是标量,一托盘是向量,一层货架是矩阵,整栋立库就是高维张量,编号体系让你能精确定位任何一件货。
| 出现位置 | 张量形态 | 作用 |
|---|---|---|
| 输入 | 三维:批大小乘序列长度乘隐藏维度 | 一批句子进模型 |
| 权重 | 带名字、形状与数值类型的参数块 | 权重文件里堆的都是它 |
| 层间传递 | 形状不变,数值被更新 | 一层一道工序 |
| 注意力多头 | 四维起步 | 多头并行的切分维度 |
形状就是规矩:对不齐就报错
张量运算讲究形状匹配,矩阵相乘要求前者的列数等于后者的行数,形状对不上直接报错。权重文件里的层那篇讲的每层加工,本质就是一连串形状匹配的张量乘法:进来的序列张量,出去还是同样形状,只是数值被更新。「权重世界的基本单元」这个定位由此坐实——整栋模型的计算就是张量进、张量出,中途没有别的形态。显存报错九成出在形状对不齐,先查批量与长度设置。
权重的容器:文件里堆的都是它
打开权重文件,每个参数块都是一个张量,附带名字、形状与数值类型。数值类型决定体积:16 位浮点是 32 位的一半,8 位整数再减半——量化感知训练是怎么回事那篇的压缩、各种部署话题,都围绕「把张量压瘦」做文章。投机解码是怎么验证草稿的那篇的加速、前缀缓存是怎么命中的那篇的复用,处理的也都是张量形态的中间结果。用扣子编排工作流调用模型时,参数里的批量与长度,改的就是张量的第一、第二维。
张量速查表
- 0 维标量、1 维向量、2 维矩阵,再高统称高维张量
- 常见形状:批大小乘序列长度乘隐藏维度
- 数值类型越短,文件越瘦、精度越低
- 形状不匹配 = 直接报错
- 看到显存报错先核形状,多数事故出在批量或长度设置
关于张量的三个常问问题
- 张量和矩阵是一回事吗?:矩阵是二维张量的特例,张量泛指任意维度的数组;模型里大量数据是三维以上,叫矩阵就不够用了。
- 为什么批量大小影响显存?:批量越大,同时处理的张量第一维越长,中间结果也按比例膨胀,显存自然吃紧。
- 形状信息存在哪?:随权重一起保存,加载时先读形状再分配内存,这也是换模型时配置要对齐的原因之一。
记住一句话:数据有形状,权重有形状,张量就是让形状对得上的通用容器。再补一个实用视角:形状就是张量的使用说明书,矩阵乘法要求两个维度严格对齐,少一个、多一个、顺序错了,都会在这一步报错,而不是等到算完才发现结果不对。这也是调试报错时最常看到维度不匹配提示的原因——错的大多不是计算,是形状。日常接触的嵌入向量是二维张量,加个批次就升到三维,注意力里的多头维度则是四维起步。看到张量并行这类词,指的就是按某个维度把张量切开分给不同设备算。记住一个顺序:先对形状,再对数值,报错时先看维度提示,九成的问题在这一步就露馅了。形状对不齐时与其猜,不如把两边的维度逐个打印出来对照,一眼就能看出是谁多了一维、谁少了一维。


