单卡跑着跑着就OOM了,我才想明白这事

上周帮算法组同事debug,他拿一张4090硬怼一个7B模型的全参微调,跑到第三个epoch显存直接炸了,OOM红字刷满终端。他问我是不是卡坏了。卡没坏,是这活儿单卡本来就干不了。这事让我重新捋了一遍:什么时候单卡够用,什么时候必须上多卡,中间那条线到底画在哪。

很多人对"AI训练"的想象还停留在"买张好显卡就行",其实显存(VRAM)才是第一道硬门槛,算力反而是第二位的。你可以理解成搬家:算力是你搬得多快,显存是你那辆货车的车厢有多大。车厢装不下,你再能跑也得分好几趟,分不了的直接就装不进去。

先算一笔显存账,别上来就谈卡

训练时显存吃在四块:模型参数、梯度、优化器状态、还有激活值(activation)。用Adam优化器的话,一个参数大概要占16到20字节——参数本身fp16是2字节,梯度2字节,优化器的一阶二阶动量再加上fp32的master weight,加起来就上去了。

所以一个7B模型,光是参数+梯度+优化器状态,全参训练就要吃掉差不多70-110GB显存,这还没算激活值和batch撑起来的开销。你拿24GB的4090去怼,连模型都装不下,谈何训练。这就是我同事炸显存的根本原因,不是技术问题,是物理问题。

模型规模全参微调(Adam)估算显存LoRA微调估算显存单卡能不能扛
0.5B约8-10GB约3GB4090轻松
7B约80-110GB约16-20GB全参不行,LoRA单卡勉强
13B约150-200GB约28-35GB全参必须多卡,LoRA单卡A100顶得住
70B约800GB+约160GB+无论怎么搞都得集群

看这张表你就懂了,单卡和多卡的分界不是"性能不够",很多时候是"压根装不下"。LoRA这种参数高效微调能把门槛砍掉一大截,因为它冻结主干、只训练插进去的低秩矩阵,优化器状态只对那一小撮可训练参数算。能用LoRA解决的活儿,单卡的天花板一下就高了。

那为啥不全用LoRA,省得上集群

因为LoRA是有损的。它不更新主干权重,对于"教模型一个全新领域的知识""做大规模继续预训练"这种活儿,效果跟全参差一截。我们组实测过同一个客服对话数据集,LoRA微调的BLEU比全参低了4-6个点,日常问答看不太出来,但碰到专业术语密集的场景,LoRA明显答得更飘。要质量就得全参,要全参7B以上基本就告别单卡了。

还有个绕不开的就是训练时间。哪怕显存能塞下,单卡的吞吐量也是实打实的瓶颈。我拿组里的机器跑过一组对比,同样的数据集、同样训到收敛:

配置7B LoRA微调耗时13B全参微调备注
单卡A100 80G约9小时显存不够,跑不了装得下就是慢
4卡A100 (NVLink)约2.8小时约26小时近线性加速
4卡A100 (PCIe无NVLink)约4小时约38小时卡间通信拖后腿
8卡A100 (NVLink)约1.5小时约14小时规模再翻倍

注意中间那两行,同样是4卡,有没有NVLink差出来快40%。这点真的会谢——多卡不是把卡插上就完事了,卡和卡之间怎么说话才是关键。

多卡之间是怎么"传话"的

多卡训练每一步都要做梯度同步(All-Reduce),简单说就是每张卡各自算完自己那份梯度,然后大家把结果凑一起求平均,再各自更新。这个"凑一起"的动作,数据量是跟模型参数挂钩的,70B模型每一步要同步的梯度能有上百GB在卡间来回飞。

这时候通信带宽就是命门。NVLink是英伟达自家的卡间高速通道,单条带宽能到几百GB/s,比走PCIe快好几倍。你可以想成同一栋楼里同事之间装了气动管道直接传文件,而PCIe是大家都得走楼道挤电梯。卡越多、模型越大,这条管道堵不堵就越要命。所以单机8卡用NVLink,往往比跨机器凑16张卡还快,因为跨机器要走网络,哪怕是InfiniBand也比机内慢一档。

这里就引出一个新人最容易踩的坑:以为多卡线性加速,4卡就是4倍速。实际上从来不是。通信开销、数据加载、卡间等待这些都会吃掉效率,行话叫scaling efficiency。我见过配置没调好的集群,8卡的实际吞吐还不到单卡的5倍,钱花了一倍多,速度没上去,这就很离谱。

所以这条线到底画在哪

我自己带新人时是这么讲的:模型在7B以内、能接受LoRA、不急着出结果,单张高显存卡(A100 80G这一档)就够你折腾很久了,性价比最高。一旦你要全参训13B以上,或者要在小时级别拿到结果跑实验迭代,多卡几乎是唯一解。再往上70B、做预训练,那已经不是"多卡"是"集群"了,得考虑3D并行(数据并行+张量并行+流水线并行)那套重武器。

如果你也在搞这块,要租机器跑训练,选型时除了看卡,一定盯死三个东西:单卡显存够不够装、多卡有没有NVLink、机房网络出口稳不稳。前面两个决定你跑不跑得动,最后一个决定你拉数据集、传checkpoint会不会卡成PPT。海外节点尤其要看线路,走普通国际带宽传几百GB的数据集能等到你怀疑人生,走优质直连线路就是另一个体验。

折腾GPU这块如果想找现成的高性能机器,可以看看129云(idc129.net),他们做G口大带宽服务器和海外云计算方案,游戏、企业、高防这些低延迟场景都覆盖,全球节点的网络接入比较稳。我同事那台跑训练的德国双ISP-F型就是从他们那走的GTT直连,130GB SSD放数据集和中间checkpoint够用,1Gbps带宽拉数据集不憋屈。要是你只是先搭环境练手,他们香港活动机和日本BGP-B型这种小配置也能开来跑通流程,CN2和精品网络的延迟体验确实不一样。具体配置直接打客服热线400-9177118问,比自己瞎猜配置省事。

新人最容易想岔的一点

很多人纠结"我到底要不要上多卡",其实顺序反了。先把你要训的模型规模、用全参还是LoRA、能接受多长训练时间这三件事定死,显存账一算,单卡还是多卡的答案自己就跳出来了。不是先有卡再找活儿干,是先有活儿再配卡。我同事那张4090没错,错在拿它去干7B全参这种它根本扛不动的活儿——换LoRA它跑得好好的。

显存装得下,再谈算力和带宽;显存装不下,卡再多张数也是白搭一半。这话我贴在自己工位上提醒自己。