CPU/GPU 与大模型训练

AI 教程: CPU/GPU 与大模型训练

这是一份高浓缩资料:结构清晰、要点到位,涵盖 CPU/GPU 基础、张量与数值精度、CUDA 与 PyTorch 实操、硬件选型、常见问答与排错清单。


  • CPU vs GPU:CPU 擅长通用/顺序处理;GPU 擅长大规模并行(矩阵/向量)。
  • 大模型必备 GPU:训练/推理核心是矩阵乘和并行化,GPU 的高并发 + 高带宽显存恰好匹配。
  • 张量与精度:一切数据 → 张量;精度(FP16/FP8)与量化(INT8/INT4)是速度/显存与效果之间的权衡。
  • PyTorch 上卡口诀device = "cuda" if ...; model.to(device); data.to(device)
  • 选卡看显存:先显存,再带宽/算力;生产尽量用满血高质量模型或云端托管 API。

维度CPUGPU
架构少核、复杂控制流海量小核、SIMT 并行
擅长分支/系统任务/小规模计算矩阵乘、卷积、注意力、图形渲染
任务模型时间片轮转、低延迟切换批处理&吞吐导向
典型用法业务逻辑、调度、I/O训练/推理主算子(GEMM、Conv 等)
  • CPU = 老专家:思考缜密、一次做一件事快切换。
  • GPU = 千军万马:海量士兵同时干活,适合“同构小任务”的并行。
flowchart LR
    subgraph CPU["CPU(顺序/少核)"]
      A1[任务1-片段A] --> A2[任务2-片段B] --> A3[任务3-片段C]
    end
    subgraph GPU["GPU(并行/多核)"]
      B1[元素1计算]:::p
      B2[元素2计算]:::p
      B3[元素3计算]:::p
      B4[元素4计算]:::p
    end
    classDef p fill:#e9f5ff,stroke:#3b82f6,stroke-width:1px;

  • 0D:标量 3.14
  • 1D:向量 [1,2,3]
  • 2D:矩阵(如 3×3 表)
  • 3D+:仍称张量(如 batch×channel×height×width

图像例子:一批 32 张 224×224 RGB 图 → 32×3×224×224(或 N×H×W×C,视框架而定)。

  • FP32/FP16/FP8…:位宽越小 → 显存更省、吞吐更高,但数值稳定性/精度下降。
  • 累计误差类比:按“1 元/秒” vs “1.1 元/秒”计薪,一个月累计差可能上万(长链路累积误差效应)。
  • 把浮点权重/激活用更短整数(INT8/INT4)近似,显存/带宽显著降低
  • 代价:生成质量/可对齐性下降(INT4 节省最多,质量下滑也更明显)。
  • 面试提示:回答量化时要分开谈权重量化、激活量化、PTQ(训练后量化)与 QAT(量化感知训练)。

  • CUDA(读“库达”):NVIDIA 的并行计算平台/编程模型,深度学习框架通过 CUDA 使用 GPU。
  • 框架:PyTorch、TensorFlow、JAX、ONNX Runtime、TensorRT(推理优化)等。
  • 设备抽象:高层 API 屏蔽很多复杂度,核心就是把数据与模型迁移到“cuda”设备

flowchart TD
  A[准备数据 X,y] --> B[建模 nn.Module]
  B --> C[选择设备 device]
  C --> D[迁移 model/data 到 device]
  D --> E[前向计算 y_hat = model(X)]
  E --> F[计算损失 Loss(y_hat, y)]
  F --> G[反传 loss.backward()]
  G --> H[优化器更新 optimizer.step()]
  H --> I{终止条件?}
  I -- 否 --> D
  I -- 是 --> J[评估与保存]
import torch
import torch.nn as nn

# 1) 设备
device = "cuda" if torch.cuda.is_available() else "cpu"

# 2) 假数据:y = 2.0*x - 3.0 + noise
N = 100_000
X = torch.randn(N, 1)
y = 2.0 * X - 3.0 + 0.1 * torch.randn(N, 1)

X, y = X.to(device), y.to(device)

# 3) 模型
model = nn.Sequential(nn.Linear(1, 1)).to(device)

# 4) 优化与损失
opt = torch.optim.SGD(model.parameters(), lr=1e-2)
loss_fn = nn.MSELoss()

# 5) 训练
for epoch in range(200):
    opt.zero_grad()
    y_hat = model(X)
    loss = loss_fn(y_hat, y)
    loss.backward()
    opt.step()
    if (epoch+1) % 50 == 0:
        print(f"epoch {epoch+1}: loss={loss.item():.6f}")

# 6) 保存
torch.save(model.state_dict(), "linear.pth")

口令:模型与数据都要 .to(device);多卡并行看 DistributedDataParallel(生产优先)或 DataParallel(入门/演示)。


面试时“会估”很加分:先问模型大小/精度/序列长度/并发,再给建议。

模型规模FP16 估计INT8 估计INT4 估计备注
7B~14–16 GB~8–10 GB~5–6 GB仅权重,不含 KV Cache/激活峰值
13B~26–28 GB~14–16 GB~8–10 GB实占依实现差异很大
70B需要多卡/数据中心卡量化+牺牲并发量化+更强约束常见为 A100/H100 或多卡集群

KV Cache/序列长度/批量并发 会显著抬高占用:面试时要主动声明这一点。

场景建议
学习/小实验RTX 3090/4090(24GB),Colab/云上临时卡
7B–13B 推理/轻微调24GB 卡 + 量化/LoRA;或小型云实例
30B+ / 70B+A100/H100 等数据中心卡或多卡;生产优先云托管 API

原则:生产尽量用满血高质量模型(云 API/托管服务),避免把强量化小模型硬塞到本地承担严肃质量目标。


  1. 为什么 GPU 比 CPU 适合训练? 因为训练/推理核心是矩阵/向量批运算(GEMM/Attention),GPU 的海量并行核与高带宽显存能显著提升吞吐与能效。

  2. 张量是什么? 多维数组的统称:标量 → 向量 → 矩阵 → 更高维(图像/语音/文本 embedding 最终都映射为张量)。

  3. FP16 与 INT8 的差别? FP16 属于浮点降精;INT8 是整数量化。INT8 更省资源但更容易带来可感知质量下降;FP16 在速度/效果间更平衡。

  4. PTQ vs QAT? PTQ:训练后量化,成本低;QAT:在训练中模拟量化,效果更好、成本更高。

  5. 如何让代码“用上 GPU”? 检测设备、model.to(device)tensor.to(device);多卡优先 DistributedDataParallel;警惕显存转移/类型不一致导致的隐性回退。

  6. 为什么评估要用测试集? 防止过拟合/数据泄漏;训练集表现不代表泛化能力。

  7. 量化后效果下降如何缓解? QAT、混合精度(关键层高精度)、校准高代表性数据、感知度高任务(长文案/代码)谨慎使用低位量化。

  8. 本地部署 vs 云端 API? 本地可控性与成本可见,但硬件/维护重;云端弹性/稳定/上线快且能用到更强模型,生产优先。

  9. Mac(Apple Silicon)如何加速?mps 后端(Metal);生态/性能与 CUDA 有差异,复杂训练建议仍用 NVIDIA GPU 或云端。

  10. 显存不够还能做什么? 量化、LoRA/QLoRA、梯度检查点、张量并行/流水线并行、减少序列长度/批量/并发、KV Cache 复用与卸载策略。


  • 设备不一致:确认 modelinputslabels 都在同一 device
  • 精度/类型错配float16 vs float32long vs float;启用 AMP(自动混合精度)时关注溢出/NaN。
  • 显存 OOM:减 batch/seq len、开梯度检查点、量化、分布式并行切片。
  • 数据瓶颈:DataLoader num_workers/pin_memory、预处理并行、I/O 排队。
  • 多卡“只用一张”:是否真的走了 DDP,环境变量、初始化方法、NCCL 配置是否正确。
  • 评估偏差:确保严格的训练/验证/测试划分,避免数据泄漏。

  • Tensor:多维数组;0D 标量、1D 向量、2D 矩阵、3D+ 张量。
  • FP16/FP8:浮点降精,速度快/显存省;稳定性需关注。
  • INT8/INT4:整数量化,更省但质量更敏感。
  • PTQ/QAT:训练后量化 / 量化感知训练。
  • AMP:自动混合精度(如 PyTorch autocast + GradScaler)。
  • KV Cache:注意力缓存,加速生成但占显存。
  • DDP:分布式数据并行(生产首选)。
  • TensorRT:NVIDIA 推理优化工具链。
  • LoRA/QLoRA:低秩适配(/结合量化),小显存微调利器。

x = torch.randn(32, 3, 224, 224)     # NCHW
device = "cuda" if torch.cuda.is_available() else "cpu"
x = x.to(device)
scaler = torch.cuda.amp.GradScaler()
for step, (x, y) in enumerate(loader):
    x, y = x.to(device), y.to(device)
    optimizer.zero_grad()
    with torch.cuda.amp.autocast():
        y_hat = model(x)
        loss = loss_fn(y_hat, y)
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()
  • 演示可用 nn.DataParallel(model)
  • 生产优先 torch.distributed + DistributedDataParallel,启动脚本与环境变量(MASTER_ADDR/PORTWORLD_SIZE 等)务必正确。

  • CPU 顺序通用,GPU 并行矩阵
  • 把模型与数据都 .to("cuda")
  • 精度越低越快越省,但更"糙"(FP16/FP8/INT8/INT4)。
  • 量化与蒸馏不是一回事:位宽压缩 vs 老带新。
  • 估显存先抓权重,再想 KV/并发/长度
  • 生产优先满血强模型(云端);本地量化适合学习/原型。
  • 评估看测试集,不看训练集
  • 多卡优先 DDP,留心通信与初始化。

  1. AI 大模型完全指南 - 从零基础到 Token 与向量的深度解析
  2. Transformer 架构深度解析 - 注意力机制与 AI 大模型的核心技术
  3. Prompt Engineering 完全指南 - 从提示工程到上下文工程的实战教程
  4. [本文] GPU 加速训练实战指南 - 从 CPU 架构到 CUDA 编程的完整教程
  5. AI 专业名词解释表 - 270+术语完全指南与 AI 技术体系词典
  • 理论先行:如果对 Token、向量、Transformer 等概念不熟悉,建议先阅读前三篇基础教程
  • 实践结合:本文为实战指南,建议结合实际项目进行 GPU 训练实践
  • 术语查阅:开发过程中遇到专业术语时,可随时查阅 AI 专业名词解释表
  • 硬件选型:根据项目需求和预算,参考本文硬件选型建议进行配置

相关内容