1-从进程和端口开始看架构

进程结构

tp=1的情况 总共三个进程

启动命令:python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 1

查看进程树:ps -aux —-forest

1
2
3
luban    3049112 21.6  0.0 7700748 758940 pts/6  Sl+  11:48   0:09  |   \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 1
luban    3052085 32.5  0.0 56482984 769368 pts/6 Sl+  11:48   0:06  |       \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 1
luban    3052087  0.5  0.0 7445368 458940 pts/6  Sl+  11:48   0:00  |       \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 1

进程数:

1
2
3
  主进程 (PID: 304911) - FastAPI服务器 + Tokenizer Manager
  ├── Router进程 (PID: 3052085) - 请求调度和路由和推理进程(只有一个TP)
  └── Detokenizer进程 (PID: 3052087) - 结果解码

启动命令:python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 2

tp=2的情况 总共五个进程

查看进程数:ps -aux —-forest

1
2
3
4
5
luban    2201211  1.5  0.0 9052664 716400 pts/6  Sl+   19:49   0:09  |       \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 2
luban    2204099 41.6  0.0 7938212 444556 pts/6  Sl+   19:49   4:11  |           \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 2
luban    2204103 33.9  0.1 256067172 1629868 pts/6 Sl+ 19:49   3:24  |           |   \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 2
luban    2204107 31.7  0.1 255899232 1630536 pts/6 Sl+ 19:49   3:11  |           |   \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 2
luban    2204102  0.0  0.0 7445520 459256 pts/6  Sl+   19:49   0:00  |           \_ python3 -m sglang.launch_server --model-path /tmp-data/models/llama-2-7b --port 30000 --mem-fraction-static 0.8 --tp 2

进程数对应的就是:

1
2
3
4
5
  主进程 (PID: 2201211) - FastAPI服务器 + Tokenizer Manager
  ├── Router进程 (PID: 2204099) - 请求调度和路由
  ├── Model RPC进程 1 (PID: 2204103) - 模型推理进程1 (TP rank 0)
  ├── Model RPC进程 2 (PID: 2204107) - 模型推理进程2 (TP rank 1)
  └── Detokenizer进程 (PID: 2204102) - 结果解码

在这里以tp=2进程进行详解,如果是tp=1就是router和model推理进程合并了

  1. 主进程 (PID: 2201211)
    • 双重角色: FastAPI HTTP服务器 + Tokenizer Manager
    • 作用:
      • 启动HTTP服务器,监听端口30000
      • 处理OpenAI兼容的API请求 (/v1/completions, /generate)
      • 负责文本分词和图像预处理
      • 与其他进程通过ZeroMQ通信
  2. Router进程 (PID: 2204099)
    • 作用: 核心调度器
      • 管理请求队列和批处理
      • 实现不同的调度策略 (LPM, weight, random, FCFS)
      • 协调模型推理进程
      • 管理KV缓存和内存池
      • 与tokenizer/detokenizer通过ZeroMQ通信
  3. Model RPC进程 (PID: 2204103, 2204107)
    • Tensor Parallelism实现:
      • 进程1 (rank 0): 处理模型的tp分块
      • 进程2 (rank 1): 处理模型的tp分块
      • 优先通过NCCL进行GPU间通信
      • 每个进程有独立的RPyC服务端口
  4. Detokenizer进程 (PID: 2204102)
    • 作用: 将token ID转换回文本
      • 解码生成的token
      • 处理停止词和特殊token
      • 支持流式输出
      • 通过ZeroMQ与router通信

端口分配

ZeroMQ在以下模块间进行通信:

1
2
3
4
5
6
7
8
  # 端口分配 (4 + tp_size = 6个端口)
  PortArgs(
      tokenizer_port=can_use_ports[0],      # ~30001
      router_port=can_use_ports[1],          # ~30002
      detokenizer_port=can_use_ports[2],    # ~30003
      nccl_port=can_use_ports[3],           # ~30004
      model_rpc_ports=can_use_ports[4:6],   # ~30005, ~30006 # 如果tp==1,这个也会分配但是没有用上
  )

通信流向:

  • Tokenizer → Router: PUSH → PULL (分词后的token)
  • Router ↔︎ Model RPC: RPyC远程调用 (模型推理)(tp=1时router和model rpc合并了,就不用这个了)
  • Router → Detokenizer: PUSH → PULL (生成的token)
  • Detokenizer → Tokenizer: PUSH → PULL (最终文本结果)