一、CUDA与多卡概述:从单核到万卡集群的演进之路

大家好,我是你们这门课的主讲。在GPU计算这个领域摸爬滚打了十几年,我见过从单卡跑个矩阵乘法都要小心翼翼的时代,也经历过如今动辄上千张卡做分布式训练的壮观场面。今天这第一讲,咱们不急着写代码,先聊聊来龙去脉。

说白了,这一章就是整个课程的「地基」。地基打不牢,后面盖多高的楼都悬。我会带大家看看GPU计算是怎么一步步走到今天的,CUDA到底是个什么玩意儿,以及为什么我们需要多卡并行——嗯,这些搞清楚了,你才知道后面30章我们到底在折腾什么。

1.1 GPU计算发展史:从图形卡到通用计算加速器

早年间,GPU这玩意儿就是给游戏玩家准备的。我2008年刚入行时,大家管GPU叫「显卡」,主要工作是让《魔兽世界》跑得更流畅。那时候谁要是说拿显卡做科学计算,别人会觉得你疯了。

转折点出现在2007年。NVIDIA推出了CUDA,第一次让开发者能用C语言直接操作GPU。我记得当时有个同事兴奋地跟我说:「老张,这玩意儿能算矩阵!」我还不信,结果试了一下,好家伙,比CPU快了十几倍。

从那以后,GPU计算的发展就像开了挂:

  • 2007-2010年:CUDA 1.0到3.0,基本功能成型,但坑特别多。我那时候写个核函数,动不动就报错,调试全靠printf。
  • 2011-2015年:Kepler架构、Maxwell架构,性能翻倍。我开始在金融领域做期权定价,一张K20卡能顶一个CPU集群。
  • 2016-2020年:Pascal、Volta、Turing架构,Tensor Core出现。深度学习爆发,GPU成了AI训练的标配。
  • 2021年至今:Ampere、Hopper架构,NVLink、NVSwitch让多卡互联成为常态。我去年帮一个客户搭了512张H100的集群,单机8卡,全互联——那场面,啧啧。

核心观点:GPU计算的发展,本质上是「从专用走向通用,从单卡走向多卡」的过程。你想想看,如果今天还只能用单卡训练大模型,那GPT-4这种千亿参数级别的模型根本不可能出现。

1.2 CUDA架构简介:你写的代码到底怎么在GPU上跑?

CUDA的全称是Compute Unified Device Architecture,统一计算设备架构。说白了,它就是一个让GPU干通用计算活的平台。

我个人习惯把CUDA架构分成三层来看:

  • 硬件层:GPU芯片、SM(流多处理器)、CUDA Core、显存、缓存。这是物理基础。
  • 软件层:CUDA驱动、CUDA运行时库、cuBLAS/cuDNN等库。这是开发工具。
  • 编程模型层:线程层次结构(Grid-Block-Thread)、内存层次结构(Global-Shared-Local)。这是你写代码时直接面对的。

这里我画了一张图,帮你把CUDA的核心逻辑串起来:

CUDA架构核心逻辑图 CPU Host(主机端) 负责控制流、数据准备、启动内核 CUDA Runtime API / Driver API GPU Device(设备端) Grid(网格) Block (0,0) Thread(0,0) ... Thread(0,7) Thread(7,0) ... Thread(7,7) Block (1,0) Thread(0,0) ... Thread(0,7) Thread(7,0) ... Thread(7,7) Block (2,0) Thread(0,0) ... Thread(0,7) Thread(7,0) ... Thread(7,7) Block (3,0) Thread(0,0) ... Thread(0,7) Thread(7,0) ... Thread(7,7) 内存层次:Global Memory(全局)→ Shared Memory(共享)→ Local Memory / Registers(私有)

这张图你看懂了吗?从上到下,CPU发号施令,CUDA Runtime负责翻译,GPU干活。干活的基本单位是线程,一堆线程组成Block,一堆Block组成Grid。每个Block里的线程可以共享数据,但Block之间是隔离的——这个设计我当年理解了好久,后来在项目里吃过亏才真正记住。

小提示:刚开始接触CUDA时,别纠结于每个细节。你只需要记住:Grid是任务,Block是工作组,Thread是工人。后面我们会反复用到这个比喻。

1.3 多卡并行计算的应用场景:什么时候需要多张卡?

你可能会问:「我单卡跑得好好的,为什么要折腾多卡?」

嗯,这个问题我当年也问过。直到我遇到一个场景:训练一个BERT-Large模型,单张V100要跑两周。客户说:「两周?黄花菜都凉了!」

多卡并行,说白了就是三个字——不够用。具体来说,分以下几种情况:

场景 单卡瓶颈 多卡解决方案 典型应用
模型太大 显存放不下 模型并行(将模型切分到多卡) GPT-3、LLaMA等大语言模型
数据太多 训练时间太长 数据并行(每卡处理不同数据) 图像分类、目标检测
计算太密集 单卡算力不够 混合并行(模型+数据并行) AlphaFold、气象模拟
实时性要求高 单卡延迟超标 流水线并行(分阶段处理) 自动驾驶、实时渲染

我曾经帮一个自动驾驶公司调优,他们的模型需要同时处理8路摄像头输入。单张A100跑起来延迟200ms,但客户要求50ms以内。最后我们用了4张卡做流水线并行,每张卡处理2路,延迟降到了45ms——这就是多卡的价值。

注意:多卡不是万能的。我见过不少团队,一上来就上8卡,结果通信开销比计算还大,性能反而下降了。记住一个原则:先优化单卡,再考虑多卡。单卡没榨干,别急着上多卡。

1.4 课程目标与学习路径:这门课能帮你解决什么问题?

好了,前面铺垫了这么多,现在说说这门课到底要讲什么。

这门课的名字叫《CUDA多卡驱动适配实战课程》。注意关键词:驱动适配。市面上讲CUDA编程的课很多,但专门讲多卡环境下驱动适配的,几乎没有。我为什么要做这门课?

因为我在实际项目中踩过太多坑了:

  • 同一套代码,在A100上跑得好好的,换到H100就报错
  • 驱动版本不对,cudaMalloc直接返回错误
  • 多卡通信时,NVLink带宽死活跑不满
  • 不同厂商的GPU混插,驱动冲突导致系统崩溃

这些坑,网上搜不到现成答案。所以我决定把这些年积累的经验整理出来,做成这门课。

整个课程分为五个模块:

  1. 基础篇(第1-6章):CUDA编程模型、内存管理、多卡基础概念。这部分是热身,但很重要。
  2. 驱动篇(第7-12章):CUDA驱动API、设备管理、上下文管理。这是核心,也是市面上最缺的内容。
  3. 多卡通信篇(第13-20章):NVLink、NCCL、点对点通信、集合通信。多卡性能的关键就在这里。
  4. 适配实战篇(第21-26章):不同架构适配、驱动版本兼容、多厂商GPU混插。这部分全是实战经验。
  5. 调优与部署篇(第27-30章):性能分析、故障排查、生产环境部署。学完就能用。

学习建议:我个人建议你按顺序学,不要跳。尤其是驱动篇,很多人觉得枯燥就跳过了,结果后面遇到问题根本不知道从哪下手。每章后面的练习题一定要做,代码一定要自己敲一遍——光看是学不会的。

最后说一句:这门课不要求你有多深的CUDA基础,但最好写过简单的CUDA程序(比如向量加法)。如果你完全零基础,建议先花一周时间看看NVIDIA官方的CUDA编程指南,把基本概念过一遍。

好了,第一章就到这里。记住我们今天讲的核心:GPU计算的发展史、CUDA的三层架构、多卡并行的四种场景。下一章我们开始动手,写第一个多卡程序。

课后思考:你目前的工作中,有没有遇到「单卡不够用」的情况?如果有,是模型太大、数据太多、还是计算太密集?想清楚这个问题,后面学习会更有针对性。


想要更多资料,联系可可