主题
🔗 多卡并行配置
一张卡不够用?上两张——但先搞清楚代价
什么时候需要多卡
- 一张卡显存装不下模型(如 70B 模型需要 40GB+)
- 需要提高推理吞吐量(多人同时用)
- 数据并行训练——同样的模型,不同数据分给不同卡
能单不双 是基本原则。两张 24GB 卡不等于一张 48GB 卡——通信有损耗。
硬件准备
PCIe 插槽
- 现代消费级主板通常有 2-3 个 PCIe x16 插槽
- 双卡至少隔一个槽位散热,两张卡靠太近上面那张会吸不到冷风
- 确认第二个插槽的实际带宽(HEDT 平台有 x16+x16,消费级常见 x16+x4)
供电
双卡满载功耗翻倍,电源必须够:
| 显卡组合 | 单卡满载 | 推荐电源 |
|---|---|---|
| 双 3090 | 350W×2 | 1200W+ |
| 双 4090 | 450W×2 | 1500W+ |
| 双 4060Ti | 165W×2 | 750W+ |
NVLink(可选)
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控制每张卡跑什么任务
加载练习题中...