Skip to content

🔗 多卡并行配置

一张卡不够用?上两张——但先搞清楚代价

什么时候需要多卡

  • 一张卡显存装不下模型(如 70B 模型需要 40GB+)
  • 需要提高推理吞吐量(多人同时用)
  • 数据并行训练——同样的模型,不同数据分给不同卡

能单不双 是基本原则。两张 24GB 卡不等于一张 48GB 卡——通信有损耗。


硬件准备

PCIe 插槽

  • 现代消费级主板通常有 2-3 个 PCIe x16 插槽
  • 双卡至少隔一个槽位散热,两张卡靠太近上面那张会吸不到冷风
  • 确认第二个插槽的实际带宽(HEDT 平台有 x16+x16,消费级常见 x16+x4)

供电

双卡满载功耗翻倍,电源必须够:

显卡组合单卡满载推荐电源
双 3090350W×21200W+
双 4090450W×21500W+
双 4060Ti165W×2750W+

3090 支持 NVLink 桥接,两张卡通过专用桥接器直连,带宽远高于 PCIe。4090 砍掉了 NVLink(只有专业卡有),多卡只能走 PCIe 通信。


软件配置

确认系统识别所有卡

bash
nvidia-smi -L
# 输出应为:
# GPU 0: NVIDIA GeForce RTX 3090 (UUID: GPU-xxx)
# GPU 1: NVIDIA GeForce RTX 3090 (UUID: GPU-yyy)

PyTorch 多卡推理

python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "Qwen/Qwen2-7B-Instruct"

# device_map="auto" 自动分配到多张卡
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    device_map="auto",
    torch_dtype=torch.float16
)

device_map="auto" 会智能拆分模型层到不同 GPU,对大多数场景够用。

指定某张卡跑任务

python
# 用 CUDA_VISIBLE_DEVICES 限制可见的 GPU
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"  # 只用 GPU 0

# 或者在命令行指定
# CUDA_VISIBLE_DEVICES=1 python my_script.py

多进程推理(提升吞吐)

bash
# GPU 0 跑一个服务
CUDA_VISIBLE_DEVICES=0 python server.py --port 8000 &

# GPU 1 跑另一个服务(不同端口)
CUDA_VISIBLE_DEVICES=1 python server.py --port 8001 &

常见问题

第二张卡不识别

bash
# 检查 PCIe 设备
lspci | grep -i nvidia

# 重新扫描 PCIe(不需要重启)
echo 1 | sudo tee /sys/bus/pci/rescan

如果 lspci 都看不到第二张卡:PCIe 插槽可能坏了,或者显卡没插紧。

两张卡显存占用不均衡

这是 device_map="auto" 的常见现象——大层放 GPU0 多些,小层放 GPU1。不影响正常使用,强迫症可以手动调 device_map

一张卡满载另一张空闲

你的代码没写多卡逻辑。检查是否有 CUDA_VISIBLE_DEVICES 锁定了单卡,或者模型加载时传了 device_map


🎯 本章要点

  • 能单卡不双卡,两张 24GB ≠ 一张 48GB,有通信损耗
  • 双卡主板须确认 PCIe 带宽+电源功率,隔槽位装卡保证散热
  • PyTorch 用 device_map="auto" 自动分模型到多卡
  • CUDA_VISIBLE_DEVICES 控制每张卡跑什么任务
加载练习题中...

有问题或补充?欢迎留言