SuperAPI AI 工具集

benchmark-vllm-model

部署与运维

查看项目

更新于 10-15 17:01

技能介绍

用途

该技能用于在 Chalk 的容器基础设施中,对通过 vLLM 服务的模型进行吞吐量与每 token 成本($/token)基准测试,产出一个可辩护的每 token 成本数字:在 GPU 上服务模型、将其驱动至饱和、确认 GPU 确实是瓶颈,然后用权威云定价除以实测吞吐量。顺序很重要:没有饱和检查的吞吐量数字不可证伪,而从博客文章里拿到的 $/hr 数字通常是错的。

主要能力

  • 在 Chalk 容器中启动 vLLM 服务模型,并获取公开可达的 webUrl 与 podName。
  • 使用随技能附带的 scripts/bench.py 扫描提示长度与并发度,从 vLLM 自身的 Prometheus 计数器(vllm:prompt_tokens_total、vllm:generation_tokens_total、vllm:request_success_total)在稳态窗口内读取吞吐量。
  • 通过 DCGM 指标确认 GPU 是否为限制因素。
  • 查询 GCP Cloud Billing Catalog 获取真实 $/hr,并计算 $/1M 输入 token 与 $/1M 请求。

使用方式

  1. 服务模型:使用 chalk container run 启动 vllm/vllm-openai:latest 镜像,指定 GPU、端口、生命周期与环境变量,并传入 vLLM 服务参数(如 --dtype bfloat16、--max-model-len 16384、--gpu-memory-utilization 0.90)。通过 chalk container get 获取 webUrl 与 podName,轮询 GET $webUrl/health,加载权重前返回 503,之后返回 200。

  2. 影响结果的 serving 标志:包括 --max-num-seqs、--max-num-batched-tokens、--enable-prefix-caching、--limit-mm-per-prompt、--dtype、--enforce-eager、--api-key 等,需说明所设置的标志。

  3. 驱动负载:运行 ./scripts/bench.py --base-url "$URL" --model "$MODEL" --input-lens 128,512 --concurrency 8,32,64 --duration 30。方法学规则包括:使用持续窗口而非固定请求数、使用服务端计数器而非客户端计时、扫描并发直到吞吐量不再上升、使用唯一提示前缀、注意客户端瓶颈。驱动脚本可从笔记本运行,也可在集群内以容器运行以排除网络路径影响。

  4. 确认 GPU 是限制因素:在运行期间采样 DCGM 指标(GPU_UTIL、POWER_USAGE、FB_USED)。GPU_UTIL 为 100 且 POWER_USAGE 达到显卡 TDP(L4 为 72W,A100 40GB 为 300W)表示 GPU 受限。

  5. 获取真实 $/hr:不要信任第三方定价页面或网络搜索摘要。直接查询 GCP Cloud Billing Catalog(Compute Engine 服务 6F81-5844-456A),汇总构成节点的 SKU。文中给出 g2-standard-8 在 us-central1 的示例:核心 $0.199904、内存 $0.093664、Nvidia L4 GPU $0.560040,合计 $0.853608/hr;省略 GPU SKU 会得到 $0.2936/hr 的错误数字。还需拉取 Spot 与 1yr/3yr CUD 费率。

  6. 计算成本:$/sec = node_hourly / 3600;$/1M in-tok = $/sec / prompt_tok_per_s * 1e6;$/1M req = $/sec / rps * 1e6。报告 $/1M 输入 token 与 $/1M 请求,以及 on-demand / spot / CUD 变体。根据模型类型选择合适单位:分类器或护栏模型输出单 token,应领先报告 $/classification;聊天或编码模型解码占主导,$/output token 更有意义,应设置 --output-tokens 为真实补全长度而非 1。

适用场景

  • 需要为 vLLM 上服务的模型给出可复现的每 token 成本数字。
  • 需要评估不同 serving 配置对吞吐量与成本的影响。
  • 需要区分 on-demand、spot 与 CUD 定价下的成本。

限制与注意事项

  • 只有标记为 chalk.ai/workload-type=compute 的 GPU 池才能运行容器/沙箱工作负载;缺少该标签的池会使 pod 处于 Unschedulable,控制器在 300s 后放弃。
  • Turing(T4)没有原生 bf16,需使用 --dtype float16。
  • 前缀缓存会抬高 $/input-token,需说明引用的是哪一种。
  • 饱和数字是下限而非预测;实际利用率 20% 时需乘以 5。
  • 工具调用模型需要正确的解析器与检查点。
  • 完成的容器 pod 会被垃圾回收,日志随之丢失;一次性驱动脚本应以 sleep 结尾以便 kubectl logs。
  • chalk container exec 对 k8s 容器未实现(仅对 host 容器实现)。
  • 将脚本管道到 bash 时,若脚本调用读取 stdin 的内容会静默中断;应写入文件并添加 exec </dev/null。
  • 沙箱没有网络出口且无授予标志;需要访问外部时使用 chalk container run --route <CIDR>。

报告要求

需说明模型、GPU、每个非默认 serving 标志、实测吞吐量、DCGM 饱和证据以及 $/hr 背后的 SKU 明细。缺少这些内容的每 token 成本数字不可复现,不应引用。