这本书发现的也算,比较曲折,是看到有一个人写的一篇知乎里推荐了一位博主吧,叫 ZOMI酱。虽然是在知乎发现的,但是他基本上是一个视频博主,所以B站看的话更方便,看了一个介绍视频之后发现了他这个AISys的开源书,发现直接看书也可以。目前感觉还是不错的。

AI 系统概述

这个 chapter 里面就全是介绍,感觉没啥说的,但反正读起来还算很顺,我觉得这种教科书性质的读起来很顺就很可以了。但如果你完全没有任何背景知识的话,估计读完就读完了,也不会有什么感受,如果你有一些背景知识的话,就算是帮你梳理一下体系。

AI 硬件体系结构

AI 计算体系概述

AI 计算模式

这里遇到了一些以前不知道的知识。

模型量化和网络剪枝,这两个技术都是为了解决模型太大,占用的内存太多的问题。

CleanShot 2025-04-07 at 11.58.11@2x

模型量化还有两种,非对称量化和对称量化。

CleanShot 2025-04-07 at 11.59.47@2x

量化

将浮点数(如 FP32)映射为整数(如 INT8、UINT8),以减小模型体积、加速推理。


对称量化(Symmetric Quantization)
概念
  • 假设数据以 0 为中心对称分布
  • 映射到整数范围 [-128, 127](INT8)
  • zero_point = 0
公式
scale = max_abs / 127
zero_point = 0
q = round(r / scale)

反量化:

r ≈ scale * q
示例(实际范围 [-500, 1000]
  1. 取最大绝对值:max_abs = 1000
  2. 映射区间设为 [-1000, 1000]
  3. 计算:
scale = 1000 / 127 ≈ 7.874
zero_point = 0
实际值 r 量化值 q
-1000 -127
0 0
1000 127

非对称量化(Asymmetric Quantization)
概念
  • 适配非对称分布(如 ReLU 输出)
  • 映射到 [0, 255](UINT8)
  • 需要 zero_point ≠ 0
公式
scale = (r_max - r_min) / 255
zero_point = round(-r_min / scale)
q = round(r / scale + zero_point)

反量化:

r ≈ scale * (q - zero_point)
示例(实际范围 [-500, 1000]
  1. 不需要扩展区间,直接使用 [-500, 1000]
  2. 计算:
scale = (1000 - (-500)) / 255 ≈ 5.882
zero_point = round(500 / 5.882) ≈ 85
实际值 r 量化值 q
-500 0
0 85
1000 255

对比总结表
特性 对称量化 非对称量化
是否以 0 为中心 ✅ 是 ❌ 否
是否有 zero_point ❌ 无(固定为 0) ✅ 有
整数范围 [-128, 127] (INT8) [0, 255] (UINT8)
精度表现 中等 更好(适合偏移数据)
计算效率 高(无需偏移) 稍慢(多一个偏移量)
常见应用 权重量化 激活量化

一句话总结
  • 对称量化:适合数据以 0 为中心的情况,速度快,常用于权重。
  • 非对称量化:适合分布偏移的数据(如激活值),精度更高但计算更复杂。

当然还有别的量化方法,书里没有具体介绍,只稍微提了一下。

剪枝

CleanShot 2025-04-07 at 13.30.57@2x

卷积层计算原理总结

卷积层参数量计算公式

对于一个输入大小为 W × H × Ci 的特征图:

  • 卷积核大小为 k × k
  • 输入通道数为 Ci
  • 输出通道数为 Co

该卷积层的参数总量为:

Params = (k × k × Ci + 1) × Co

说明:

  • k × k × Ci 是每个输出通道的权重数量(每个输入通道都有独立的一套权重)
  • +1 表示 bias(每个输出通道对应一个偏置项)
  • × Co 表示有 Co 个输出通道

每个卷积核是一个三维体积(k × k × Ci),负责融合多个输入通道的信息。


每个输出点的计算过程

对于输出特征图中每个位置 (i, j) 和输出通道 co,对应的计算为:

output[i][j][co] = sum_{ci=0}^{Ci-1} 
conv(input_patch[i][j][ci], weight[co][ci]) + bias[co]

步骤如下:

  1. 对每个输入通道 ci,取出其上的 k × k 区域 patch。
  2. 将该 patch 和该通道对应的卷积核权重做逐元素乘法并求和。
  3. 对所有通道的结果加总。
  4. 最后加上 bias,得到一个输出标量。

FLOPs 浮点运算次数计算

FLOPs 表示模型中执行的浮点操作数量。

对于上述卷积操作,其 FLOPs 为:

FLOPs = W × H × (k × k × Ci + 1) × Co

说明:

  • 每个输出位置需要 k × k × Ci 次乘加(MAC)
  • +1 表示加上 bias
  • W × H 表示输出特征图的空间位置数
  • Co 表示输出通道数量

注意:有些库或论文将乘法和加法各算 1 次 FLOP,此时 FLOPs 约为 2 × W × H × k² × Ci × Co


总结要点
  • 卷积核在每个输入通道上都有独立的权重。
  • 每个输出通道对应一整组输入通道上的卷积核。
  • 卷积计算是“多通道 patch 和权重的加权求和”。
  • 参数量和 FLOPs 都随输入通道数、卷积核大小、输出通道数线性增长。

卷积核分解:VGG 与 Inception 方法总结


一、背景

这其实是一种模型轻量化的方法,VGG 和 Inception 都是在模型设计着手,希望减少内存的使用。

在卷积神经网络中,大卷积核(如 5×55 \times 57×77 \times 7)具有较大的感受野,但带来更多参数和更高的计算成本。因此,现代网络架构(如 VGG 和 Inception)采用了卷积核分解策略,在保持相似感受野的前提下显著降低参数量和 FLOPs。


二、VGG 的分解方式
1. 思路

使用两个连续的 3×33 \times 3 卷积层来替代一个 5×55 \times 5 卷积层。

  • 每个 3×33 \times 3 卷积感受野是 33
  • 两个堆叠后感受野变为 55
2. 感受野推导

假设每层卷积核大小为 k=3k=3,堆叠 L=2L=2 层,stride=1,padding=1,则感受野为:

R=1+(k1)×L=1+(31)×2=5R = 1 + (k - 1) \times L = 1 + (3 - 1) \times 2 = 5

3. 参数量对比(假设输入输出通道数均为 CC
  • 原始 5×55 \times 5 卷积参数量为:25C225C^2
  • 两个 3×33 \times 3 卷积为:2×9C2=18C22 \times 9C^2 = 18C^2
  • 相对节省:1825=72%\frac{18}{25} = 72\%

三、Inception 的分解方式
1. 思路

将二维的 5×55 \times 5 卷积拆解为两个一维卷积:先做垂直方向的 5×15 \times 1,再做水平方向的 1×51 \times 5 卷积。

2. 操作过程
  • 第一步:5×15 \times 1 卷积在输入图像上纵向滑动,融合每列中上下 5 个像素的信息
  • 第二步:1×51 \times 5 卷积在中间特征图上横向滑动,融合每行左右 5 个像素的信息
  • 最终输出感受野覆盖原图中的 5×55 \times 5 区域
3. 参数量对比(输入输出通道为 CC
  • 原始 5×55 \times 5 卷积参数量为:25C225C^2
  • 分解卷积参数量为:5C2+5C2=10C25C^2 + 5C^2 = 10C^2
  • 相对节省:1025=40%\frac{10}{25} = 40\%

四、两种分解方式对比总结
方法 感受野 参数量 相对节省
原始 5×55 \times 5 卷积 5×55 \times 5 25C225C^2 -
两个 3×33 \times 3 卷积 5×55 \times 5 18C218C^2 28%
5×1+1×55 \times 1 + 1 \times 5 卷积 5×55 \times 5 10C210C^2 60%

五、结论与适用场景
  • VGG 的堆叠卷积方式简单直接,适用于一般结构的构建与替代
  • Inception 的分解卷积方式更高效、参数更少,适用于模块化组合(如 Inception 模块)

两者都遵循一个核心思想:

通过卷积核分解,在保持感受野不变的前提下,减少计算量与参数量,从而构建更高效的深度网络结构

其他模型轻量化方法

CleanShot 2025-04-07 at 15.55.21@2x

这个写的还是挺明白的。

后面还讲了讲并行,覆盖的还算比较全面。

关键设计指标

前面有一些指标感觉比较重要。

后面计算某个操作是计算受限型还是内存受限型还是比较有意思的。

最后 Roofline 的概念感觉也是经常可以在论文里看到,就计算某个系统的理论极值。

核心计算之矩阵乘

这里就是怎么把卷积换成矩阵乘法,感觉还比较有意义。

CleanShot 2025-04-08 at 09.40.27 CleanShot 2025-04-08 at 09.39.41

这个图就很直观

然后就是计算机实现矩阵乘法的一些优化,说实话没太看懂,也没仔细看。

计算之比特位宽

这个基本讲的就是各种浮点数的标准,比如最标准的单精度浮点数的 32 个 bits 是怎么分配的,这个一般 OS 课应该会详细讲。后面还大概介绍了一下别的新的标准。

AI 芯片基础

CPU 基础

感觉全是各种历史,梦回大一计算机导论。

冯诺依曼结构,电路,各种寄存器。感觉 ECE 的同学主要就是学这些。

CPU 指令集架构

这个讲了很多 CISC 和 RISC 的东西。一般 OS 有三节课,感觉基本上就是 OS 第一节课会讲的,看一看就行,还是历史相关的内容比较多。CISC 和 RISC 都是 ISA 的分类,后面还讲了 CPU 并行处理架构。比如什么 SISD 之类的。

里面有几个图还挺好的。

CleanShot 2025-04-11 at 10.27.32@2x

CPU 计算本质

讲了一些参数,讲了一下 CPU,服务器之类的东西这几年来的发展。

CPU 计算时延

用了一个例子分析了计算时延,基本上大头还是 load data 造成的。

GPU 基础

基本上就是 GPU 发展的过程,NVIDIA 占据一大块,比国有个神奇的公司 ATI 从来没听说过,在这里戏份挺足。后面 ATI 被 AMD 收购了,AMD显卡的技术就来自于 ATI。

NPU 基础

感觉真正做出来的 NPU 也就只有 Google 的 TPU。

主要就是 DSA(Domain-Specific Architecture)。

超异构计算

这个说的就是不拘泥于原来的提醒,把 CPU,GPU,TPU 什么的都整合到一个芯片上,用来应对比较复杂的问题。

而且其实就常规的 CPU + GPU 也算是异构计算,但他有两个独立的 memory。

不过我觉得最好的例子还是 Apple 的 M 系列芯片,尤其是 M4,统一内存,然后还有 GPU 核心,还有 CPU核心,还非常成功。

不过 Apple 的 M 系列芯是算异构还是超异构,其实我也不太清楚,毕竟这些都是比较新的概念,但感觉超异构的概念还是再说那种大型的计算中心。

图形处理器 GPU

GPU 工作原理

GPU 里用的内存主要是 HBM(High Bandwidth Memory,高带宽内存),是一种专门为高性能计算和图形处理器设计的先进内存技术。

CleanShot 2025-04-12 at 12.27.45

这个图很清楚。

为什么 GPU 适用于 AI

又讲了很长的卷积,甚至还有矩阵计算,稍有重叠。

一个新的概念,tensor core。我的理解基本就是为了更好做矩阵计算的。

GPU 架构与 CUDA 关系

我的理解,一个线程就是一个 cuda core。

GPU 架构回顾

介绍 NVIDIA 的 GPU 历史了,但不得不说,NVIDIA 那么多显卡种类,那么多架构,一般人还真是都不知道,就知道一个 RTX。

稀疏化矩阵怎么计算的,这里也有稍微讲一下。

CleanShot 2025-04-12 at 19.27.04

但大部分还都是各种架构 GPU 的参数,其实挺无聊的。不过确实是能感受到 NVIDIA 的技术重心,最开始基本上就是帮助计算图像的,还有单独的图像处理单元,到最近基本上 all in AI,全都是围绕 AI 去做的产品。

英伟达 GPU 详解

前面一章已经讲了 GPU,这一章专门讲 Nvidia 的 GPU。

在 Nvidia 的 GPU 架构里,有三种主要核心:CUDA Core、Tensor Core 和 RT Core。

Tensor Core 基本原理

这个小节讨论的就是 Tensor Core,又是用卷积来作为讨论,感觉卷积已经不太火了,但是本文很多具体的例子都是卷积相关的,可能当时写的时候 NLP 或者 LLM 还没很火吧。

最开始的处理核心是 Stream Processor(SPs)。

后来有了 Stream Multiprocessor(SMs)。

再后来才有的 CUDA Core,之后 AI 火了,为了加速矩阵运算才有的 Tensor Core。RT Core 则是光追单元,功能也是比较特殊。

之前其实就见到过,卷积操作可以变成矩阵乘法,这个操作叫做 Im2Col。

反正很神奇,我只能说我大概好像看懂具体是怎么操作的里,想法大致是了解的,但是具体的变换计算我也不知道书里写的对不对。

大致讲了一下混和精度训练,大致就是 FP32 的参数,转化为 FP16 进行 Forward,最后更新梯度的时候转回 FP32。

Tensor Core 的一大用处就是混合精度训练,因为混合精度训练一般需要硬件支持。

Tensor Core 架构演进

这一章又讲了一点历史,但是还讲了很多芯片架构相关的知识,有很多架构图,还是比较清晰的。

Tensor Core 深度剖析

这个深度讲了 Tensor Core 的设计,非常神奇,他电路直接设计的就是做矩阵乘法,而不是我们正常设计的乘法器和加法器。

总的来说就是在计算的时候把大矩阵切成小矩阵去算,切成小矩阵的时候把数据放到共享内存或者更进一步放到 register 里,给 Tensor Core 里的计算单元去用。

讲了并行,就是什么 DP,PP,TP 啥的。

讲完并行之后引出了分布式训练,其实并行和分布式训练时联系在一起的。你把模型做切割就是为了放到不同的机器上做并行,你放到不同的机器上就是分布式训练了。

然后还介绍了通讯,硬件上比如说什么 PCIe、NVLink 之类的,但是就只是简单说了下。最后还有 NVLink 和 NVSwitch 每一代的演进。

还有各种通信的抽象类型,底下这个图还是比较清晰的。

CleanShot 2025-04-23 at 10.35.24@2x

这章提到了两个概念,算存互联和算力互联。这两个方面感觉确实是很重要,很多时候训练的瓶颈都是卡在了通信上,而通信基本上就是在算存与算力之间通信。

最开始的时候只有 PCIe,但很明显 PCIe 速度比较比较慢,然后 Nvidia 就开卡了 NVLink,现在你基本如果想要组一个 Nvidia 的 GPU 集群的话,必要NVLink 或者 NVSwitch,价格也是很感人。

后面有一点技术细节,硬件上基本看不懂,信号传输,冗余什么的还能看懂一点。

最后又讲了一下这个发展历程,感觉发展历程讲了好几次。

国外 AI 芯片

谷歌 TPU 历史发展

就讲讲历史,感觉没啥的。

谷歌 TPU v1 脉动阵列

这个脉动阵列和 Nvidia 的 tensor core 很像,都是直接一下子算个矩阵乘法。

CleanShot 2025-04-30 at 13.26.50

上面这图比较清楚。

谷歌 TPU v2 训练芯片

V2 我记得是可以进行训练了,v1 是纯推理卡。

然后 V2 加了互联的模块,就更适合连载一起组一个大的集群。

谷歌 TPU v3 POD 形态

V3 就是 V2 的算力加强版本,没太多架构上的变化,就制程工艺的进步,同样的大小塞的计算单元更多了。

谷歌 TPUv4 与光路交换

TPU v4 用了很久才推出的,更新比较多。

感觉这个架构图比较重要。

CleanShot 2025-04-30 at 16.13.52

主要的变化是加了 Sparse Core 这个单元,然后就是在组计算单元的时候用了 3D-Torus。

Sparse Core 感觉就是主要为 NLP 做的,因为 NLP 我们 embedding 之后基本上就是一个很大的稀疏矩阵。

这个 notes 不得不说如果每章都写的话没啥意思,我自己看都没意思,还是写一些有意思的或者我自己的思考吧。