这个坑值得记一笔。自建 bge-m3 服务用 sentence-transformers 4.0 批量编码 512 字文档,batch 从 16 调到 64 后显存从 5GB 涨到 14GB,QPS 只从 120 提到 150。

刚开始盯着「模型没开 inference_mode,临时张量不释放」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。批内最长序列决定 padding 长度,算力大多花在填充上;分词阶段把整批文本一次性载入,内存同时上涨;客户端并发与批大小叠乘,实际并行数远超预期。

第一件事是按长度排序后再组批,减少 padding

python bench_embed.py --sort-by-length --batch 32

随后打开推理模式跑编码

python bench_embed.py --inference-mode --batch 32

固定 batch 压一轮看 QPS 与显存

python bench_embed.py --batch 32 --qps 100

扫一遍不同 batch 找拐点

python bench_embed.py --sweep 8,16,32,64

隔了一天再看,现象没变,说明不是偶发。

那几天正好在做别的变更,先把时间线对齐才敢动手。

改完先别撤,确认这几项。显存回落到 8GB 以内,QPS 不低于 140,单条 P99 延迟没有因为组批变差。

embedding 的吞吐瓶颈常在 padding 与分词,不在矩阵乘,按长度分桶比单纯加大 batch 有效。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189