第一章:AI芯片与算子库概述
大家好,我是这门课的主讲人。在芯片行业摸爬滚打了十几年,从早期的GPGPU通用计算到现在的专用AI芯片,我算是亲眼见证了这场算力革命。今天咱们聊第一章,也是整个课程的地基——AI芯片与算子库。
说实话,很多刚入行的同学容易犯一个毛病:一上来就扎进CUDA代码里,结果调了三天性能还是上不去。为什么?因为你连芯片长什么样都没搞清楚。我当年也吃过这个亏,所以这一章,咱们先把底层的逻辑理清楚。
1.1 AI芯片发展简史:从CPU到专用加速器
AI芯片的发展,说白了就是一场「算力饥渴」倒逼出来的技术革命。
最早的时候,大家用CPU跑神经网络。你想想看,CPU那点可怜的并行度,跑一个卷积层要等半天。我记得2012年那会儿,AlexNet用两块GTX 580训练了五六天,当时觉得已经很快了。现在回头看,那简直是老牛拉破车。
转折点出现在2015年左右。Google推出了TPU v1,专门为推理任务设计。这玩意儿没有缓存一致性,没有复杂的控制逻辑,就是一堆乘加器堆在一起。嗯,这里要注意:TPU的成功让整个行业意识到,专用架构才是AI芯片的未来。
之后的故事大家就熟悉了:NVIDIA从Pascal到Volta再到Hopper,每一代都在强化Tensor Core;华为的昇腾系列走的是达芬奇架构;各家NPU也是百花齐放。我个人习惯把这段历史分成三个阶段:
- 萌芽期(2012-2015):GPU通用计算为主,CUDA生态初步建立
- 爆发期(2016-2020):专用芯片涌现,架构百花齐放
- 成熟期(2021至今):架构趋同,生态竞争白热化
核心观点:AI芯片的演进,本质上是「通用性」和「效率」之间的博弈。越专用的芯片效率越高,但灵活性越差。算子库就是在这两者之间找平衡。
1.2 主流AI芯片架构对比:GPU vs NPU vs TPU
很多同学问我:「老师,这三种芯片到底有什么区别?我该学哪个?」我的回答是:都学,但要有侧重。
咱们先看一张对比表:
| 维度 | GPU(NVIDIA) | NPU(华为昇腾) | TPU(Google) |
|---|---|---|---|
| 核心设计理念 | 通用并行计算 | 专用AI加速 | 极致推理效率 |
| 计算单元 | CUDA Core + Tensor Core | AI Core(达芬奇架构) | MXU(矩阵乘法单元) |
| 存储层次 | L1/L2 + 共享内存 + 全局显存 | L0/L1 + 缓冲区 + DDR | 统一缓冲区 + HBM |
| 编程模型 | CUDA / Triton | CANN / MindSpore | XLA / TensorFlow |
| 典型应用 | 训练 + 推理 | 训练 + 推理(侧重推理) | 推理为主 |
我来拆解一下这张表背后的东西。
GPU:NVIDIA的看家本领是「通用性」。你可以在GPU上跑任何并行计算任务,不限于AI。但代价是什么?控制逻辑复杂,功耗高。我在项目中遇到过一个问题:同样的矩阵乘法,在V100上跑和A100上跑,性能差了3倍。后来发现是Tensor Core的利用率没上去。说白了,GPU的潜力需要靠算子库去挖掘。
NPU:华为昇腾走的是「软硬协同」路线。达芬奇架构的AI Core里,有专门的三维立方体计算单元。我刚开始接触时觉得这玩意儿太死板了,后来发现对于卷积这种规则运算,效率确实高。但避坑指南来了:我曾经因为没处理好数据排布,导致NPU的带宽利用率只有30%。嗯,这里要记住:NPU对数据格式的要求比GPU苛刻得多。
TPU:Google的TPU是「极致专用」的代表。v1只能跑推理,连训练都做不了。但它的MXU(矩阵乘法单元)在推理场景下,能效比是同期GPU的10倍以上。为什么?因为它砍掉了所有不必要的功能。你想想看,推理任务不需要分支预测,不需要乱序执行,那这些硬件资源就是浪费。
我的建议:如果你是初学者,先从GPU入手。CUDA生态最成熟,学习资料最多。等你把并行计算的思想搞明白了,再去看NPU和TPU,会发现很多概念是相通的。
1.3 算子库在AI框架中的角色
好,现在咱们聊聊算子库。很多同学觉得算子库就是一堆函数的集合,没什么技术含量。大错特错。
算子库是什么?它是AI框架和芯片之间的「翻译官」。你想想看,PyTorch里写一个torch.matmul(A, B),框架怎么知道该调用哪个底层函数?怎么知道用Tensor Core还是CUDA Core?怎么知道数据该放在哪个存储层级?这些决策,都是算子库来做的。
我画过一张图,把算子库的层次结构理清楚了:
应用层:PyTorch / TensorFlow / MindSpore
↓
框架层:自动微分、图优化、内存管理
↓
算子库层:cuBLAS / cuDNN / CUTLASS / Triton
↓
驱动层:CUDA Driver / ROCm / CANN
↓
硬件层:GPU / NPU / TPU
你看,算子库处在中间位置,承上启下。它的核心职责有三点:
- 性能优化:把上层框架的算子调用,映射到硬件上最高效的执行方式
- 抽象封装:屏蔽底层硬件的差异,让框架开发者不用关心芯片细节
- 生态兼容:支持多种框架、多种芯片,降低迁移成本
举个例子。同样是矩阵乘法,在GPU上你可能用cuBLAS,在NPU上可能用CANN的矩阵计算接口。但上层框架看到的都是同一个matmul接口。这就是算子库的价值。
避坑指南:我曾经在项目里直接调用了cuBLAS的底层API,结果发现性能还不如PyTorch默认的。为什么?因为PyTorch内部做了很多优化,比如算子融合、内存复用。你直接调底层API,反而跳过了这些优化。所以,除非你非常清楚自己在做什么,否则不要轻易绕过框架的算子库。
说到算子库,就不得不提Triton。这是我个人非常喜欢的一个项目。它让你用Python写GPU kernel,然后自动生成高效的CUDA代码。我在做算子优化时,经常先用Triton写个原型,验证思路没问题了,再用手写CUDA去压榨极致性能。这样效率高很多。
最后总结一下这一章的核心:
- AI芯片的发展史,就是算力饥渴和架构创新的博弈史
- GPU、NPU、TPU各有优劣,没有银弹
- 算子库是连接框架和硬件的桥梁,是性能优化的主战场
下一章,咱们会深入算子库的内部实现,从最简单的向量加法开始,一步步构建你自己的算子库。到时候我会带着大家手写代码,踩一些坑,再填一些坑。嗯,那才是真正有意思的部分。
公众号:蓝海资料掘金营,微信deep3321