先把当时的情况摆出来。在 A100 40GB 上用 TensorRT-LLM 0.14 把 Qwen2.5-7B 转成 engine,batch 1 下首 token 比同机 vLLM 0.6.4 慢一倍,构建时只用了默认参数,日志提示 max_batch_size 32。

把日志和配置对完,能解释这个现象的基本就这几处。engine 按最大 batch 构建,小 batch 时 kernel 选择不是最优。也可能是没开 in-flight batching,请求实际是串行执行。

另外,精度用了 FP16 没开 FP8,A100 的算力没用满。少数情况下是输入长度按 4096 构建,实际请求只有 200 token,预留空间浪费。

动手时先按实际负载重新构建 engine

trtllm-build --checkpoint_dir ./ckpt --output_dir ./eng --max_batch_size 8 --max_input_len 1024

随后启动时打开 in-flight batching

tritonserver --model-repository ./models --backend-config=tensorrtllm,inflight_batching=true

接着对比两种配置的首 token 延迟

curl -w '%{time_starttransfer}\n' -o /dev/null http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d @req.json

末了记录 P50 与 P99 再决定是否切回 vLLM

python bench.py --url http://127.0.0.1:8000 --qps 8 --requests 200

改之前先确认了最近有没有人动过配置,避免白查一遍。

恢复的判定其实很直接。重新构建后 batch 1 的首 token 延迟接近 vLLM,并发 8 时吞吐高于 vLLM,engine 体积也随最大输入长度下降。

容易忽略的是,engine 是编译产物,换卡型、换精度或改最大长度都要重建,直接把别人的 engine 目录搬过来性能经常对不上。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189