这个坑值得记一笔。自建 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 有效。这类问题最好一次改到位,反复小改反而容易把原因搅混。
