相关 PR:

问题发现:

使用 9 机 72 卡 H100 跑 deepseek 时,在测试 decode 吞吐上限,发现在服务端日志看单卡吞吐达到了 2000 tps,然而测试客户端的结果无论是 ttft,tpot,还是吞吐。都差的很多。

一定是 python 的问题:

  • http server 是 fastapi,如果输入很多,数据很大,这个 python 的 httpserver 会成为瓶颈,就算是换成 sanic 也不行。
  • 测试脚本也是 python 的,既要发请求,又要持续收 stream,还要计时还要统计结果。

通过研究代码,发现可能是输出的 tps 太高了 2000×72=1440002000 \times 72 = 144000 ,只有一个 Detokenizer 根本处理不过来。经过计时,Detokenizer 处理一个需要 50~100us。如果 1s 内有 144000 个 token,需要 Detokenizer 达到 7us 内才行

现在问题很明确了:

  1. 把 detokenizer 改成多进程
  2. 测试脚本也改用多进程

sglang 这个 PR 怎么做的

全都多进程,不然任何一个“多对一”的地方都可能成为瓶颈

单机多进程使用 shm 通信,MultiTokenizerRegisterReq 维护每个 rid 从哪个 tokenizer 进来的再从哪里出去