去年我们团队从 0 开始做开源大模型的训练微调,真正动手后才发现,第一道坎不是算法调参,而是云平台选型。GPU 资源、分布式训练、海量存储,这三样东西在创业阶段的容错空间极小,选错了后面全是坑——要么多机多卡根本拉不起来,要么数据集大了之后 IO 直接卡死,要么月底看账单时血压飙升。
这篇文章不打算做那种“XX 云测评排名第几”的清单式罗列,而是站在创业企业实际干活的角度,把大模型训练微调对云平台的核心诉求掰开揉碎讲清楚。你会看到我们从需求估算、平台对比、基准测试到成本核算的一整套选型流程,以及实际踩过的一些坑。如果你正打算带着团队入坑大模型训练,或者已经在为 GPU 资源发愁,这篇内容应该能帮你少走不少弯路。
1. 先搞清楚训练微调到底“吃”云平台的什么
很多团队选云平台时第一反应是“谁的 GPU 便宜就选谁”,这个思路不能说错,但很片面。大模型训练微调和传统的深度学习训练不太一样,它对云平台的压力是全方位的,而且任何一个短板都可能成为整个训练任务的瓶颈。我习惯把需求拆成三层来看:算力层、通信层、存储层。
1.1 GPU 资源不是“有卡就行”,显存和互联才是关键
GPU 这块大家都熟悉,但实际选型时容易忽略两个细节:显存容量和卡间互联带宽。
显存决定了你能不能在一个卡上放下某个规模的模型。以现在主流的 7B 参数开源模型为例,光模型权重用 FP16 存储就需要大约 14GB,但训练过程中还要额外保存梯度、优化器状态(Adam 优化器通常需要额外的 2 倍参数大小的显存)、激活值等,所以一张 80GB 显存的卡(比如 A100/H100 的 80G 版本)实际能勉强塞进 7B 模型的完整训练任务,如果参数再大一些或者序列长度拉长,显存立刻就不够了。你可能会说“塞不下可以做 ZeRO 并行或者 LoRA 微调”,没错,但这些方案某种程度上就是为了弥补单卡显存不足而出现的,会在通信和调度上引入额外开销。所以 GPU 型号选择本质上是在“模型规模—显存—训练速度—工程复杂度”之间做权衡。
卡间互联带宽则决定了多卡并行训练的效率。NVIDIA 卡之间的 NVLink / NVSwitch 互联带宽远高于普通网络的带宽,在做张量并行(Tensor Parallelism)时,每个 Transformer 层的矩阵切分与聚合操作会产生海量通信,如果卡间互联走的是普通万兆网,训练效率会惨不忍睹。在云平台上,同一台物理机内的多卡互联通常没问题,但跨机器就需要 RoCE 或 InfiniBand 之类的 RDMA 网络了。所以不要只看单价,更要看“同一台机器最多能给你几张卡”,以及“多机之间网络到底走什么协议”。
提示:如果预算有限,优先保证“单机多卡”的数量,这比“多机单卡”更容易实现高效训练。单机多卡之间的 NVLink 带宽和通信延迟都比跨机网络好太多,调试起来也会省很多事。
1.2 分布式训练:单机多卡与多机多卡的本质差异
分布式训练表面上看是个“把模型放到多张卡上”的事,实际上涉及数据并行、模型并行、流水线并行、混合并行等多种模式,云平台能否为这些模式提供可靠的基础设施,直接决定了你的训练任务能不能正常跑起来。
数据并行(Data Parallelism)是最常见的模式,每张卡都持有一份完整的模型副本,输入数据被切分到不同卡上独立计算,然后通过 AllReduce 同步梯度。这种方式对通信带宽比较友好,因为同步的只是梯度不是激活值,但在 batch size 较大或模型较大时,梯度同步的数据量也非常可观。DeepSpeed 的 ZeRO 系列优化更是把模型状态(权重、梯度、优化器状态)做切分,每张卡只存一部分,训练期间需要通过通信来组装和更新参数,通信频率和流量随之上升。可以说,分布式训练效率的高低,很大程度上取决于云平台网络延迟和带宽。
多机多卡场景下,需要考虑的问题就更多了:节点间网络是否支持 RDMA(InfiniBand 或 RoCE)、GPU 驱动和 CUDA 版本是否兼容、容器调度是否能保证 GPU 显存不被其他租户争抢、任务排队策略是否合理,以及平台能否自动处理节点故障重启。很多云平台的 GPU 实例默认只保证单机内卡的可用性,跨机器的网络性能完全是另一个档次,而且可能出现“你花了 8 卡的价钱,实际扩展效率只有 5 卡水平”的窘境。我建议在做选型时,不要只看理论算力,要重点问清楚多机通信方案,最好能有实际的多机 benchmark 数据。
1.3 海量存储:数据集、Checkpoint、日志的三重考验
这个维度在很多选型文档里不被重视,但实际项目里它最容易成为“隐形杀手”。大模型训练微调涉及三类存储需求,它们对性能的要求完全不同。
第一类是数据集存储。一个中等规模的数据集动辄几十到几百 GB,如果是预训练语料,TB 级甚至 PB 级都不稀奇。训练时多个 worker 会并发读取数据,如果存储系统吞吐不够,GPU 就会因为等数据而空转,也就是常说的“数据加载瓶颈”。这时候需要对象存储(如 S3、OSS)或并行文件系统(如 Lustre/GPFS 的云托管版本)提供足够的读带宽,同时最好能搭配数据缓存把热数据放到本地或高性能存储上。
第二类是 Checkpoint 存储。训练任务每训练一段时间就要保存一次模型状态,大型模型的 checkpoint 可能从几 GB 到几十 GB 不等。如果保存太频繁,存储带宽不足会拖慢训练节奏;如果保存太少,一旦训练中断,损失的时间代价又太高。通常的做法是配置一键断点续训功能,平台能自动把 checkpoint 同步到持久化存储,失败后从最近一个有效状态拉起。
第三类是日志和训练产物存储。TensorBoard 日志、调试输出、验证集预测结果等,虽然单个文件不大,但数量多、写入频繁,对存储的 IOPS 和元数据操作性能有要求。
存储这块很容易踩的坑是:平台把“存储空间”和“存储性能”分开计费,你买了几 TB 容量,但根本跑不出高吞吐;或者数据和计算在同一个可用区还好,一旦跨区读写,带宽立刻变成千兆级。所以评估云平台时不要只问“存得下吗”,要问“GPU 读数据时能跑满吗”“Checkpoint 写盘要多久”,最好能实测。
2. 主流云平台方案横向对比
讲完需求维度,我们来看看现在市面上的主流云平台分别是什么路子。注意,以下内容不是“谁好谁坏”的排名,而是基于不同云平台的特点,告诉你它们各自适合什么样的创业团队和训练场景。不同团队的人员配置、技术栈、预算模型差异很大,适合的答案完全不同。
2.1 国内云厂商的 AI 训练平台
国内云厂商这几年在 AI 基础设施上投入很大,基本都推出了完整的 AI 训练平台。
阿里云这边的主力是 PAI(人工智能平台),底层计算资源是 GPU 云服务器 ECS + 高性能计算集群。它对大模型训练场景比较友好的是提供了 DLC 容器训练服务,支持提交 PyTorch/TensorFlow 训练任务、自动配置分布式训练所需的网络环境,还内置了数据集管理和模型管理能力。存储方面搭配 CPFS(并行文件系统)做高性能数据读写,和对象存储 OSS 配合使用。如果你团队的技术栈以 PyTorch 为主,而且已经比较熟悉 Docker/K8s 生态,PAI 的上手成本相对可控。
腾讯云的核心产品是 TI 平台(TI-ONE / TIONE),支持从数据处理、模型训练到模型部署的全链路。腾讯云的 GPU 实例在游戏和社交业务中打磨多年,稳定性口碑还可以,TIONE 对分布式训练和自动化的支持也比较完善。比较适合已经有腾讯云使用习惯、或者业务本身跑在腾讯生态内的团队。
华为云这边依托昇腾生态,ModelArts 平台提供了从训练到推理的全流程服务,最特别的地方在于昇腾 910B 等国产加速卡在供应链和市场策略上的优势。如果你的项目对国产化有明确要求,或者希望未来在推理端控制硬件成本,华为云值得认真评估。不过昇腾的软件生态和 CUDA 生态相比仍然有一些差异,迁移工作量和踩坑成本要事先算进去。
2.2 海外云厂商方案
海外三巨头 AWS、Azure、Google Cloud 各自都有成熟的 AI 平台。
AWS 的 SageMaker 是一个相当全面的托管机器学习平台,从数据准备、训练、调优到部署都做了集成。底层计算资源是 EC2 的 GPU 实例和 SageMaker 的训练集群,存储方面有 S3 做对象存储、EFS 做共享文件系统、FSx for Lustre 做高性能并行文件系统。AWS 生态的市场占有率高,各类框架和工具的兼容性很好,社区资料最多。缺点是 SageMaker 的抽象层次较高,遇到问题时排查链路会比较长,而且和国际网络相关的一些数据传输问题在国内环境需要额外考虑,不过这一点属于部署架构层面的问题,不在本文展开。
Azure 的机器学习和计算集群在国际企业里有很大市场,因为它和微软生态(尤其是 OpenAI 相关服务)的整合非常紧密。如果你做的项目将来要对接 OpenAI 产品或微软云服务,Azure 可能更顺。Azure ML 的作业队列、数据集管理、GPU 资源池等能力都做得比较完整,只是价格通常偏高,对预算敏感的创业团队压力大。
Google Cloud 的 Vertex AI 和自家 TPU 是最大差异化亮点。TPU 在 Transformer 类模型上有极高的性价比和训练效率,尤其适合预训练场景。但 TPU 的工程栈和 CUDA 很不一样,社区生态成熟度不如 NVIDIA 的 GPU 方案,如果你要微调的是社区主流的开源模型,大多数现成代码默认是 CUDA 环境,迁移到 TPU 的成本不能忽视。如果你主要用 GPU,GCP 的 A3/A4 系列也能提供不错的性能和网络。
2.3 创业企业选型的几个隐性成本
对比平台时不能只看 GPU 单价,有几个隐性成本经常被忽略。
第一个是迁移成本。你的训练代码、数据流水线、CI/CD 流程都是绑定在某家云平台上的,换平台的成本远高于表面上的“换一批机器”。所以在选型阶段就要考虑清楚是打算长期扎根一个平台,还是做多云部署。如果明确是多云,一开始就要把代码层、数据层做成云中立,比如用容器化 + 对象存储标准接口(S3 兼容 API)来降低绑定。
第二个是运维成本。GPU 实例不是开箱即用的,你需要装驱动、配置 CUDA、搭建容器镜像、处理网络配置。有些云平台会提供镜像市场和预装好的训练环境,能帮你省下不少时间;但也有平台只是给你一台“裸 GPU 机器”,一切都得自己来。创业团队的研发人力本来就不多,能买 PaaS 层服务就不要自己在 IaaS 上从零搭建。
第三个是数据流动成本。大模型训练的数据量巨大,对象存储的读取可能有流量费,跨可用区或跨地域的流量费更高。很多团队在估算预算时漏掉了这部分,结果训练结束时被数据传输费用吓了一跳。要在选型前就把数据存放、数据集更新、Checkpoint 保存和下载这几个环节的流量成本都算进模型里。
第四个是生态与人才。团队里有没有人熟悉某家云的 API 和 console?出问题的时候能不能快速定位?这些都会影响项目进度。我见过一个团队因为不熟悉某平台的任务提交方式,光是调试环境就花了一周,这个成本比那点 GPU 差价贵得多。
3. 从 0 到 1:一个可复制的选型评估流程
聊了那么多理论,这部分给你一个可以照着做的流程。我们当时就是靠这套方法确定最终平台的,虽然不能保证对每个团队都适用,但至少能帮你快速把候选平台缩小到一两个。
3.1 先把资源需求算明白
选型第一步不是打开云厂商官网查价格,而是先回答一个问题:你到底需要什么样的 GPU、多少 GPU、多少存储?
以微调一个 13B 参数的模型为例,我们可以做一个粗略估算:
- 模型权重:13B × 2 字节(FP16)= 26GB
- 梯度:与权重同量级,约 26GB(如果开启混合精度,梯度也在半精度,这里按优化器状态差异简化)
- Adam 优化器状态:权重 × 2(一阶动量 + 二阶动量)× 4 字节(FP32),约 104GB
- 激活值:取决于 batch size、序列长度、模型结构,通常几 GB 到几十 GB 不等
把这几项加起来,单卡 80GB 显存基本无法完整加载 13B 全参数训练。所以实际的常规做法有三种:
- 用 LoRA / QLoRA 这类参数高效微调技术,把可训练参数量降到 1% 左右,显存需求大幅下降;
- 用 DeepSpeed ZeRO Stage 2 或 Stage 3,把优化器状态和梯度做分片,用多卡分担显存压力;
- 模型并行 + 数据并行混合,直接拆到多台机器。
也就是说,资源需求不完全由模型本身决定,还取决于你选用的微调方案。我建议在选型前至少做一个快速实验:找一台 1×80G 的机器,用 QLoRA 方式跑几百步,记录显存占用、训练速度和是否出现 CPU offload 导致的瓶颈。这个实验能帮你确定“单卡能做到什么程度”“要多卡配合才能满足训练时长目标”。
注意:最容易犯的错误是直接拿“模型参数大小”去估算显存,忽略了优化器状态和激活值,结果买回来的卡根本跑不起来。做资源估算时务必把训练阶段的梯度、优化器状态、激活值全部算进去,如果是推理阶段则另当别论。
做完显存需求估算后,再计算总算力和目标时长。假设一张 A100 80G 的 FP16 算力约 312 TFLOPS,我们估一下训练一个 13B 模型跑 1 个 epoch 需要多少 FLOPs:约 2 × 参数量 × 训练 token 数。如果数据集是 1 亿 token,总计算量约 2 × 13B × 1e8 = 2.6e18 FLOPs。单张卡理论上要跑 2.6e18 / (312e12 × 利用率约0.4) ≈ 20800 秒,也就是约 5.8 小时;如果目标 10 小时完成,那么大概需要 1-2 张卡(考虑通信开销和扩展效率)。这套计算模型不需要很精确,但能帮你快速判断“需要用 1 卡试跑还是直接上 8 卡”,避免一上来就租一堆卡结果大部分时间在空等。
3.2 跑一轮最小化基准测试
锁定了两到三个候选平台后,不要只靠官网的规格表做决定,花半天时间跑一轮基准测试是性价比极高的投资。这里说的基准测试不是那种复杂的微基准测试套件,而是直接拿你自己的模型、自己的数据集,在候选平台的最小配置上跑一个缩短版训练。
具体操作可以这样:
- 准备一个小型数据集子集,比如原本 100 万条数据就抽 1 万条出来;
- 把模型参数量保持在真实场景的规模(比如就是 7B),用 QLoRA 方式跑 50-100 步;
- 记录每组实验的时间、显存占用、吞吐(samples/s 或 tokens/s)、是否有 OOM、数据加载是否成为瓶颈;
- 如果条件允许,再测试一次多机多卡(至少 2 节点 × 2 卡),看扩展效率是不是接近线性。
基准测试本身也会产生费用,但和选错平台的代价比起来微乎其微。你只需要几百块预算就能获得第一手真实数据和配置经验,这些数据对后续和销售谈折扣、对内部项目排期都非常有价值。
测试时记得把如下几个平台差异项记录下来:
- 镜像和驱动版本是不是现成的,还是需要自己装?
- 容器启动一次要多久?任务排队要多久?
- 网络配置是否自动完成,多机 task 之间的通信延迟和实际带宽是多少?
- 存储读写速度在训练中是否稳定,还是会有抖动?
这些都是官方文档不会告诉你的细节,只有实测才靠谱。
3.3 搭建成本估算模型
选型最后一步是算钱。这里说的不是简单对比每卡每小时单价,而是构建一个覆盖训练全周期的成本模型。我们当时把成本拆成四块:
- 训练计算成本:GPU 实例的按需价格或包月价格 × 训练时长。注意要乘以扩展效率损失,比如 8 卡扩展效率 0.8,意味着实际耗时比理论时间长 25%。
- 存储成本:数据集存储、Checkpoint 存储、日志存储,三者加起来按容量和读写次数计费。
- 数据传输成本:数据集上传、Checkpoint 下载、跨区同步产生的流量费用。
- 开发和调试成本:环境搭建、代码调试期间的空转 GPU 费用,这个经常被忽略,但占创业团队总费用的比例其实很高。
以我们当时的一个实际项目为例:13B 模型微调,计划用 4×A100 80G 跑 20 小时,按某平台约 30 元/卡/小时计算,训练成本约为 4×30×20=2400 元。但如果扩展效率只有 0.7,实际耗时约 28.6 小时,费用变成 3432 元,多了 1000 多块。所以不要只看单价,扩展效率直接和钱挂钩。
存储方面,假设训练数据集 500GB,对象存储费用按容量和读取量计费,加上每次 checkpoint 写盘,一个月下来可能也要几百到上千元。这部分虽然不是大头,但容易在产品上线后持续产生费用。
我建议你做一个简单的 Excel 表格,把上述所有费用项列出来,分别用候选平台的报价填充,再根据 1-3 个月的训练计划计算总预算。这个模型做好后,还可以用来做平台之间的横向对比,也能在后续业务发展时快速估算扩容成本。
4. 实操中遇到的高频问题与排查技巧
选了平台、搭好环境、跑起任务,不代表万事大吉。下面这些问题我们实际遇到过,也见不少同行在中招,列出来给你提个醒。
4.1 GPU 利用率不高,数据加载成为瓶颈
现象是 GPU 利用率忽高忽低,训练吞吐远低于预期,nvidia-smi 里看 GPU 的利用率只有 30%-50%,但 CPU 和内存负载很高。这个时候最先怀疑的应该是数据加载管线。
排查路径:
- 在大规模训练脚本里给 DataLoader 设置
num_workers并发数,观察 GPU 利用率是否有提升; - 检查数据集是否放在高性能存储上,如果数据在对象存储,每次 collection 都要走网络,延迟会很高;
- 把数据预先打成内存映射格式或者 TFRecord/WebDataset 这类高效格式,减少随机小文件 IO;
- 看是否存在 Python GIL 导致的瓶颈,必要时用
prefetch_factor和pin_memory优化。
我们当时的解决方案是把数据集从对象存储同步到高性能并行文件系统的缓存目录,再改配置让 DataLoader 读取缓存,GPU 利用率直接提升到 90% 以上。虽然存储费用高了一些,但总的训练时长缩短,成本反而下降了。
4.2 多机训练网络性能拉胯,扩展效率不升反降
多机多卡训练时,如果发现从 1 机 4 卡增加到 2 机 8 卡,吞吐不仅没翻倍,甚至比原来还慢,大概率是网络通信成了瓶颈。
要排查的内容:
- 检查多机之间的网络是否走 RDMA(RoCE/IB)。很多云平台默认只提供普通 TCP 网络,做 AllReduce 时性能极差;
- 尝试减少通信频率:增大 batch size、使用梯度累积、开启 DeepSpeed 的通信压缩;
- 检查是否有 NCCL 环境变量没设置正确,比如
NCCL_IB_DISABLE=0、NCCL_SOCKET_IFNAME指向错误的网卡; - 如果平台提供了分布式训练集群服务,优先使用平台的托管方案,通常他们会把网络配置好,比自己手动搭省心太多。
真实场景中,很多人会在没检查网络协议的情况下直接租多台 8 卡机器做训练,结果扩展效率只有 0.4 甚至更低,算下来比单机训练还亏。结论是:多机方案要么用平台托管的训练集群,要么在选择实例时明确要求支持 RDMA 网络。
4.3 Checkpoint 保存太慢,训练经常中断
大模型训练周期长,训练中断是常态。如果保存 checkpoint 的时间过长,比如每次要 5-10 分钟,而且训练因为各种原因频繁重启,浪费的时间会非常可观。
建议的做法:
- 开启异步 checkpoint 保存,让保存过程不阻塞训练;
- 把 checkpoint 写入高性能本地盘,然后后台同步到持久化存储;
- 根据训练进度动态调整保存频率:训练初期保存稀疏些,后期密集些;
- 务必测试断点续训功能,确保恢复时能从最近 checkpoint 正确加载,很多平台的恢复流程有隐藏 bug,比如 optimizer 状态没恢复、随机种子不一致导致实验不可复现。
4.4 账单失控,月底才发现爆了
创业团队对成本都很敏感,但是 GPU 账单经常在月底打出暴击。我们遇到过的情况包括:训练任务忘记关、深夜调试留下的常驻实例、数据集跨区同步产生的高额流量费,以及竞价实例被抢占后自动按按需价格重投导致成本飙升。
控制成本的经验:
- 给账号设置预算告警,按日或按小时提醒;
- 所有实例都打上标签,按项目分账,月底能看清楚钱花在哪;
- 非工作时间自动释放非关键实例,用脚本定时关闭开发环境;
- 能抢占式实例(竞价实例)允许断点续训的任务优先使用,配合 Checkpoint 机制可以把训练成本降低一半以上。
提示:很多云平台的竞价实例价格只有按需的 1/3 甚至更低,但会被随时回收。只有你的训练任务支持断点续训时才能安全地用它。我们后来的做法是把训练主任务跑在竞价实例上,自动检测到抢占事件就停掉当前节点、保存 Checkpoint、再从之前的 checkpoint 恢复,成本降了不少。
4.5 框架版本不一致导致分布式任务异常
这属于很基础但很常见的问题:两台机器上 PyTorch 版本、CUDA 版本、NCCL 版本不一致,训练任务在本地单机没问题,一上多机就各种奇怪报错。
解决方案是做到环境完全容器化。把训练环境固定成 Docker 镜像,镜像里锁定 PyTorch、CUDA、cuDNN、NCCL 的版本,并在所有节点上使用同一个镜像。同时做好版本基线文档,任何升级都要在单机验证通过后再同步到集群环境。如果你用的云平台提供现成的预置镜像,也要验证镜像内的框架版本和你的代码是否兼容,有些预置镜像版本相对老旧,反而会引发兼容性问题。
写在最后的几句实在话
选云平台这件事,没有所谓的最优解,只有最适合你当前阶段和团队状态的方案。我在实际项目的体会是,创业团队最容易犯的错误是过早追求“最优架构”和“最强算力”,结果把大量研发时间消耗在平台选型和环境搭建上,真正的业务进展反而停滞。更好的策略是先用一套成熟的平台把模型微调流程跑通,验证业务效果之后,再根据实际瓶颈考虑是否迁移或扩容。
如果你现在还没确定平台,我建议把上面提到的基准测试流程完整走一遍,这是性价比最高的方式。如果你已经选定平台并开始训练,也别急着彻底定型,留出迁移的余地,至少在数据层和代码层保持云中立。最后再分享一个小技巧:选择平台时多看它的"故障处理文档"和"服务等级协议",而不是只看宣传材料——一个平台的可靠性往往体现在它发生故障时你能拿到的响应和补偿上,这一点在长期训练任务中比任何参数都重要。