云GPU实例选型:根据模型大小、延迟、吞吐量选择合适实例

选云GPU,说白了就是一场「算力与预算的拉锯战」。我见过不少团队,上来就抢A100,结果模型才7B,跑起来显卡都快打瞌睡了。也见过为了省钱选了T4,结果用户等回复等得直接关页面。这一章,咱们就把这事儿拆开揉碎了讲。

模型大小:算力需求的敲门砖

模型大小直接决定了显存门槛。你想想看,一个7B模型就是70亿参数,FP16下光是权重就要占多少显存?

基本公式:总显存 ≈ 模型权重 × 2 + KV Cache + 激活层开销

以FP16推理为例:

  • 权重部分:7B × 2字节 = 14GB
  • KV Cache:根据输入长度和批处理大小动态变化
  • 额外开销:约20-30%用于中间激活和框架缓冲

我个人习惯先跑一个显存预留测试:

import torch
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "model-path",
    torch_dtype=torch.float16,
    device_map="auto"
)

# 模拟推理压力
input_ids = torch.randint(0, 32000, (4, 1024)).cuda()
with torch.no_grad():
    outputs = model.generate(
        input_ids,
        max_new_tokens=512,
        do_sample=True
    )

print(f"峰值显存: {torch.cuda.max_memory_allocated() / 1e9:.2f} GB")
注意:显存碎片化是个大坑。我曾经有个项目,算出来12GB够用,结果跑着跑着就OOM了。后来才发现是频繁创建小张量导致碎片。建议预留20%缓冲区。

不同规模模型的显存需求参考:

模型规模 FP16权重 (GB) 推理总显存 (GB) 推荐实例类型
1-3B 2-6 4-12 T4 / L4 / A10
7-13B 14-26 20-40 A10G / A100 40G
30-70B 60-140 80-180 A100 80G × 2 / H100
> 70B > 140 > 200 多卡H100集群

这里要注意一个细节:很多模型实际跑起来会用到flash attention或vLLM这种显存优化技术,实际占用会比估算值低。但保守点总没错。

延迟:用户体验的生命线

延迟这东西,说白了就是「用户按下回车,到看到第一个token的时间」。一般分两种场景:

  • 流式场景:聊天机器人、实时翻译。需要TIPS(每秒token数)高,首token延迟低。
  • 非流式场景:批量数据分析、离线任务。更在意P99延迟稳定性。

为什么会这样?因为用户对等待的容忍度是线性的。你想想看,3秒出首token和5秒出首token,体验差距不是一点点。我建议用P99而不是平均延迟来评估:

# 模拟延迟测试
import time
import numpy as np

latencies = []
for _ in range(100):
    start = time.time()
    # 这里执行推理
    gen_output = model.generate(input_ids, max_new_tokens=128)
    end = time.time()
    latencies.append(end - start)

latencies = np.array(latencies)
print(f"P50 延迟: {np.percentile(latencies, 50):.2f}s")
print(f"P99 延迟: {np.percentile(latencies, 99):.2f}s")

不同实例的延迟表现差异巨大。我做过一个对比测试:

实例类型 首token延迟 (7B模型) 每token生成速度 适用场景
T4 800-1200ms 15-25 TPS 非实时、低预算
A10G 300-500ms 30-50 TPS 中等延迟要求
A100 80G 150-300ms 60-100 TPS 实时交互场景
H100 80-150ms 100-180 TPS 高吞吐低延迟
避坑指南:我之前有个项目,只看首token延迟选了A10G,结果并发一上去P99直接飙到2秒。后来发现是显存带宽不够,导致多请求排队。建议并行跑3-5个虚拟用户测试一下。

吞吐量:成本效益的试金石

吞吐量讲究的是「单位时间内能处理多少请求」。计算公式很简单:

吞吐量 = 并发数 × 模型输出长度 / (单次推理时间)

但实际操作没那么简单。我个人习惯先确定目标:

  • 低成本优先:比如T4配大批次,用时间换吞吐。
  • 高吞吐优先:比如A100配VLLM的连续批处理,最大化利用率。
  • 平衡方案:比如L4或A10G,在成本和性能之间取中值。

这里有个关键点:批次大小和吞吐量不是线性关系。我测过一组数据:

批次大小  | A100吞吐(TPS) | T4吞吐(TPS) | 显存使用率
1         | 120          | 25          | 30%
2         | 210          | 45          | 45%
4         | 360          | 75          | 75%
8         | 420          | 100         | 95%
16        | 440          | 105         | 99%

看到没?批次从8到16,A100只涨了5%,但显存快用爆了。这就是边际收益递减。

高吞吐的陷阱:并发虽然能提吞吐,但也可能让单次延迟爆炸。尤其是T4这种小显存卡,批次一大多请求就要等显存释放。我建议做个「延迟-吞吐」散点图,找到拐点。

选型决策流程

好了,综合上面三点,我把自己的选型逻辑画成一张图,方便你照着走:

云GPU实例选型决策流程 选型决策树 开始选型 分析模型大小 参数/精度/输出长度 定义SLA目标 延迟/吞吐量要求 计算显存需求 确定批次策略 初选候选实例 基准测试验证 最终选型 提示 先用小规模 压测验证 再扩规模

照着这张图走下来,基本上就能锁定2-3款候选实例。我建议再到云厂商的现有实例列表里找最接近的配置。

实战对比:A100 vs H100 vs L4

我拿一个实际项目举例。当时我们要部署一个13B的聊天模型,要求首token延迟在500ms以内,峰值吞吐要撑住300个并发用户。下面是我当时做的对比:

指标 A100 80G H100 80G L4 24G
单卡推理延迟 320ms 180ms 650ms
最大并发数 8 12 4
总吞吐量 480 TPS 720 TPS 120 TPS
成本(美元/时) $3.2 $4.8 $1.1
成本效益 150 TPS/$ 150 TPS/$ 109 TPS/$

你猜我最后选了哪个?答案是A100。原因很简单:H100虽然性能猛,但成本效益和A100持平,而且当时H100资源不稳定。L4嘛,延迟都650ms了,直接超标。

个人建议:选型时别光看「最好」的,要看「刚好够用」的。我一般会留20%的性能冗余,但绝不抠到临界点。实例选型是门平衡艺术,多跑几次基准测试比什么都强。