预计阅读 5 分钟

项目结构导览:sglang/ 1000+ 文件地图

谁该读这一篇? 第一次打开 SGLang 仓库,被 1000+ 个文件淹没的工程师。 前置阅读: 02-architecture.md 至少把三进程拓扑记住。 耗时: 25 分钟(之后当字典查而不是顺序读) 学完能: 1. 第一眼就能定位到任意功能对应的目录; 2. 知道哪些目录是"主路径"(开发 80% 时间在那里),哪些是"特定场景目录"; 3. 给团队介绍 SGLang 内部时,能在白板画出顶层结构; 4. 后续每一章源码精读你能预先知道"这章的代码在哪个目录"。


1. 顶层目录

打开 sglang/,你会看到:

sglang/
├── python/               ← Python 代码主体(90% 在这)
│   └── sglang/
│       ├── srt/          ← SGLang Runtime,后端
│       ├── lang/         ← 前端 DSL
│       ├── launch_server.py
│       ├── bench_*.py    ← 基准测试入口
│       └── ...
├── sgl-kernel/           ← C++/CUDA 高性能算子
├── rust/                 ← Rust 实现(router、tokenizer 加速等)
├── sgl-model-gateway/    ← 模型网关(多副本前置)
├── benchmark/            ← 基准脚本(不是 bench_*.py,是更宏观的 case)
├── examples/             ← 例子代码(学习时直接抄)
├── docker/               ← Dockerfile + 镜像构建脚本
├── docs/, docs_new/      ← 文档(docs_new 是当前在写)
├── test/                 ← 单元 / 集成测试
├── proto/                ← gRPC protobuf 定义
├── scripts/              ← 杂项脚本(CI、release、helpers)
├── 3rdparty/             ← 第三方依赖快照(一般不动)
├── assets/               ← README 用的图
└── experimental/         ← 试验性代码(不保证稳定)

最重要的是 python/sglang/srt/ — Scheduler、RadixCache、Worker 全在那。


2. python/sglang/ 一级目录

python/sglang/
├── srt/                    ← 后端:本书 80% 内容
├── lang/                   ← 前端 DSL:第 6 章主战场
├── launch_server.py        ← 命令行入口(python -m sglang.launch_server)
├── bench_serving.py        ← 在线吞吐基准
├── bench_offline_throughput.py
├── bench_one_batch.py      ← 单 batch 性能微基准
├── bench_one_batch_server.py
├── auto_benchmark.py       ← 自动化基准(穷搜参数)
├── check_env.py            ← 环境检查(装完跑一下,看 CUDA 等是否就绪)
├── compile_deep_gemm.py    ← DeepGEMM 预编译(DeepSeek 优化路径)
├── eval/                   ← 评测脚本
├── benchmark/              ← 更复杂的基准 case
├── cli/                    ← `sglang serve` 等命令行子命令
├── multimodal_gen/         ← 多模态生成相关
├── jit_kernel/             ← JIT 编译的小算子
├── test/                   ← 测试
├── profiler.py             ← 性能 profiler 工具
├── global_config.py        ← 全局配置(一般不动)
├── utils.py                ← 杂用工具
├── version.py              ← 版本号
└── __init__.py

3. srt/:SGLang Runtime 的全景

这是核心,按模块分门别类(30+ 子目录):

srt/
├── managers/               ★ 进程主体:Scheduler / TokenizerManager / Detokenizer
├── model_executor/         ★ GPU 前向:ModelRunner / CUDA Graph
├── mem_cache/              ★ KV cache:RadixCache / memory pool / allocator
├── layers/                 ★ 模型层(attention / moe / linear / quantization)
├── models/                 ★ 模型实现(llama / qwen / deepseek / mixtral ...)
├── sampling/               ★ 采样器
├── distributed/            ★ TP / PP / NCCL 集合通信
├── disaggregation/         ★ Prefill/Decode 分离
├── lora/                   ★ LoRA 多适配器
├── constrained/            ★ 受约束解码(压缩 FSM)
├── speculative/            ★ 投机解码(EAGLE / Medusa)
├── function_call/          ★ Function calling 解析
├── multimodal/             ★ 多模态编码器、processor
├── entrypoints/            ★ HTTP / gRPC / Engine 接口
├── tokenizer/              ★ tokenizer 工具
├── compilation/            ★ torch.compile / inductor 相关
├── checkpoint_engine/      ★ 模型权重加载与同步(推理时也用得到)
├── connector/              ★ 与外部 KV store / RDMA 对接
├── eplb/                   ★ Expert 负载均衡(MoE)
├── configs/                ★ 各种 dataclass 配置
├── server_args.py          ★ 启动参数大全(顶级 dataclass)
├── environ.py              ★ 环境变量定义(SGLANG_*)
├── parser/                 ← 输出 parser
├── multiplex/              ← 多请求复用
├── batch_overlap/          ← Overlap 调度配套
├── batch_invariant_ops/    ← 数值确定性优化
├── observability/          ← metrics / logging / tracing
├── session/                ← 会话 API
├── arg_groups/             ← argparse 工具
├── compilation/            ← torch.compile 后端
├── elastic_ep/             ← 弹性专家并行
├── grpc/                   ← gRPC 服务
├── ray/                    ← Ray 集成
├── plugins/                ← 插件注册
├── platforms/              ← 平台抽象(NVIDIA / AMD / Intel)
├── hardware_backend/       ← 硬件后端
├── weight_sync/            ← RL 训练时权重同步
├── debug_utils/            ← 调试辅助
├── state_capturer/         ← 状态捕获
├── utils/                  ← 工具
├── model_loader/           ← 模型加载逻辑
├── dllm/                   ← Diffusion LLM 支持
├── batch_invariant_ops/    ← 数值不变性算子
└── constants.py            ← 常量

带 ★ 的是"主路径",开发 80% 时间集中在这。


4. managers/:进程主体(精读重点)

managers/
├── scheduler.py                 ★★★ 3900+ 行,调度主循环
├── tokenizer_manager.py         ★★★ TM 进程主体(2800+ 行)
├── detokenizer_manager.py       ★★★ Detokenizer 进程主体
├── schedule_batch.py            ★★ ScheduleBatch(一步的 batch 描述)
├── schedule_policy.py           ★★ cache-aware policy 实现
├── io_struct.py                 ★★★ 全部消息体 dataclass
├── tp_worker.py                 ★ Tensor parallel worker(rank > 0)
├── data_parallel_controller.py  ★ DP 控制器
├── multimodal_processor.py      ← 多模态请求处理
├── disagg_service.py            ← P/D 分离辅助
├── mm_utils.py                  ← 多模态工具
├── embed_types.py               ← embedding 任务专用
├── cache_controller.py          ← KV cache 异步管理(HiCache 等)
├── scheduler_components/        ← scheduler 拆分出来的组件
├── scheduler_input_blocker.py   ← 暂停入口(背压用)
├── tokenizer_manager_score_mixin.py  ← TM 的 score 任务 mixin
├── tokenizer_control_mixin.py   ← TM 的控制 API mixin
├── multi_tokenizer_mixin.py     ← 多 TM 副本场景
├── prefill_delayer.py           ← prefill 节流
├── overlap_utils.py             ← overlap 调度辅助
├── hisparse_coordinator.py      ← HiSparse 协调器
├── async_dynamic_batch_tokenizer.py  ← 异步动态 batch tokenize
├── template_manager.py / template_detection.py  ← chat template
├── communicator.py              ← 进程间通信封装
├── scheduler_pp_mixin.py        ← PP 支持
├── scheduler_recv_skipper.py    ← 收消息时的跳过策略
├── utils.py
└── configure_logging.py

最常去的 4 个文件scheduler.py / tokenizer_manager.py / detokenizer_manager.py / io_struct.py


5. mem_cache/:内存与前缀缓存

mem_cache/
├── radix_cache.py               ★★★ 主流前缀缓存实现
├── hiradix_cache.py             ★★ HiCache(CPU 镜像 + 异步 prefetch)
├── memory_pool.py               ★★★ KV cache 物理存储
├── allocator.py                 ★★ slot 分配
├── base_prefix_cache.py         ← 抽象基类
├── chunk_cache.py               ← chunked prefill cache 模式
├── evict_policy.py              ← 淘汰策略接口
├── cache_init_params.py         ← 初始化参数
├── common.py
├── events.py                    ← cache 事件
├── cpp_radix_tree/              ← C++ 加速版本
├── deepseek_v4_*.py             ← DeepSeek 专用压缩内存池
├── hicache_storage.py           ← HiCache 持久化
├── mamba_radix_cache.py         ← Mamba 专用
├── hi_mamba_radix_cache.py      ← Mamba + HiCache
├── hisparse_memory_pool.py      ← HiSparse 长上下文专用
├── hybrid_cache/                ← 混合缓存
├── flush_cache.py               ← cache flush 工具
├── kv_cache_builder.py          ← 初始化时构建
└── base_swa_memory_pool.py      ← SWA(sliding window)专用

最常去的 3 个文件radix_cache.py / memory_pool.py / allocator.py


6. layers/:模型层

layers/
├── attention/                  ★ 各 attention 后端(FlashInfer / Triton / Torch)
│   ├── flashinfer_backend.py
│   ├── triton_backend.py
│   ├── torch_backend.py
│   └── ...
├── moe/                        ★ MoE 实现(含 EP)
├── quantization/               ★ 量化算法
├── linear.py                   ← TP 切分的 Linear
├── embeddings.py
├── rotary_embedding.py
├── layernorm.py
├── activation.py
├── logits_processor.py
├── sampler.py
└── ...

7. models/:模型实现

models/
├── llama.py             ← Llama 系列
├── qwen2.py / qwen3.py  ← Qwen 系列
├── deepseek_v2.py / deepseek_v3.py
├── mixtral.py
├── gemma2.py / gemma3.py
├── phi3.py
├── llava.py / llava_onevision.py / qwen_vl.py / minicpm_v.py  ← VLM
└── ...(数十个模型)

每个文件一个模型架构。要加新模型就在这里写。


8. 一张"想找 X 就去 Y"的查询表

想找 去哪里
服务怎么启动的 launch_server.pysrt/entrypoints/http_server.py
一次请求怎么进 GPU 的 srt/managers/tokenizer_manager.pyscheduler.pymodel_executor/model_runner.py
调度主循环 srt/managers/scheduler.py:event_loop_normal(1372)
Cache-aware 排序 srt/managers/schedule_policy.py
前缀缓存数据结构 srt/mem_cache/radix_cache.py
KV 物理存储 srt/mem_cache/memory_pool.py + allocator.py
Attention kernel 选择 srt/layers/attention/*_backend.py
加新模型 srt/models/<name>.py + srt/configs/<name>.py
加新量化方法 srt/layers/quantization/
投机解码 srt/speculative/
受约束解码 srt/constrained/
Function calling 解析 srt/function_call/
多模态预处理 srt/multimodal/ + srt/managers/multimodal_processor.py
LoRA srt/lora/
启动参数有哪些 srt/server_args.py
环境变量有哪些 srt/environ.py
Tensor parallel 集合通信 srt/distributed/
P/D 分离 srt/disaggregation/
Router sglang/rust/sgl-router/
监控指标 srt/observability/
CUDA Graph srt/model_executor/cuda_graph_runner.py
前端 DSL 解释器 python/sglang/lang/interpreter.py
DSL API python/sglang/lang/api.py
单元测试 python/sglang/test/test/
Docker 镜像 docker/Dockerfile.*
基准测试 python/sglang/bench_serving.pybenchmark/

9. sgl-kernel/:C++ / CUDA 算子库

sgl-kernel/
├── csrc/                ← C++ / CUDA 源码
├── python/sgl_kernel/   ← Python 绑定
├── CMakeLists.txt
├── Makefile
├── build.sh             ← 构建脚本(独立编译)
└── benchmark/           ← 算子级基准

什么时候动它:

  • 你要加新 CUDA kernel(fused 算子、新 attention 变体)。
  • 性能 profiling 显示 Python 层的算子瓶颈。

普通使用不需要碰这里——pip install sglang 已经预编译好。


10. rust/:Rust 实现

rust/
├── sgl_router/          ← 路由器主体
├── sgl_tokenizer/       ← Tokenizer 加速(绑定 huggingface tokenizers)
└── ...

Rust 不是给应用层用的,是为了把"高频路径的 CPU 工作"从 Python 里剥出来。


11. examples/:直接抄的好地方

examples/
├── runtime/             ← 后端 API 示例
├── frontend_language/   ← DSL 示例(最值得学)
├── multi_modal/
├── lora/
├── ...

新手第一周直接 cd examples/frontend_language/ && python ... 跑一遍。


12. 一张"代码量"地图(粗略)

目录 Python 行数(约)
srt/managers/ 10k+
srt/models/ 20k+(数十个模型)
srt/layers/ 15k+
srt/mem_cache/ 3k+
srt/distributed/ 2k+
srt/disaggregation/ 3k+
srt/constrained/ 1.5k+
lang/ 3k+
sgl-kernel/csrc/ 10k+(C++/CUDA)

合计 60k+ 行 Python + 10k+ 行 C++/CUDA + Rust 若干。 你不需要全部读 —— 按业务/兴趣抽 1-2 个子系统精读即可。


13. 小结

  • 顶层划分:python/sglang/srt/(后端)+ lang/(前端)+ sgl-kernel/(CUDA)+ rust/(高性能 CPU 路径)。
  • srt/managers/srt/mem_cache/srt/model_executor/srt/layers/srt/models/ 是日常 80% 时间所在。
  • 找代码先查 §8 的"想找 X 就去 Y"表,比 grep 更快。
  • 第一周不要试图全读源码,先抓主流程。

14. 自检

  1. 我想看 cache-aware 调度的具体算法,去哪个文件?
答案 [`sglang/python/sglang/srt/managers/schedule_policy.py`](../sglang/python/sglang/srt/managers/schedule_policy.py)。 关键类:`SchedulePolicy`(141)、`PrefillAdder`(405);关键方法:`calc_priority`(162,按命中长度算权重)、`add_one_req`(813,把请求塞进当前 batch)。 策略枚举:`CacheAwarePolicy`(125)有 LPM/DFS_WEIGHT/PRIORITY 三种。
  1. 我想给 SGLang 加一个 Phi-4 的模型实现,新文件放哪?需要改哪些注册地方?
答案 新建 [`srt/models/phi4.py`](../sglang/python/sglang/srt/models/)(仿照 `llama.py` / `qwen2.py`,实现 `class Phi4ForCausalLM(nn.Module)` 含 `forward` 和 `compute_logits`)。 注册位置:[`srt/model_loader/`](../sglang/python/sglang/srt/model_loader/) 下的 architecture registry(`ModelRegistry`),把 `"Phi4ForCausalLM"` 映射到新类。 如果 attention 形状特殊(如 MoE / MLA)还要在 [`srt/layers/attention/attention_registry.py`](../sglang/python/sglang/srt/layers/attention/attention_registry.py) 加分支。 最后在 [`srt/configs/`](../sglang/python/sglang/srt/configs/) 加 ModelConfig 子类(如果 HF config 字段需要映射)。
  1. 我想知道 SGLang 都支持哪些环境变量,去哪个文件?
答案 [`sglang/python/sglang/srt/environ.py`](../sglang/python/sglang/srt/environ.py)。 所有 `SGLANG_*` 环境变量定义在这里(每个一个 typed accessor),grep 这个文件能看全。 `--help` 看到的是命令行参数(在 [`server_args.py`](../sglang/python/sglang/srt/server_args.py)),而环境变量是更细粒度的调试 / 实验开关。
  1. 我想看 sglang serve 的命令行子命令,去哪个目录?
答案 [`sglang/python/sglang/cli/`](../sglang/python/sglang/cli/)。 `sglang serve` 是 `sglang` console_script 入口的子命令,内部最终也会调到 `launch_server.py` 的 `run_server`。 `cli/` 下面还有其它子命令(如 `sglang router`、`sglang bench`),结构按 Python click / argparse 子命令组织。
  1. 我想看 router 的源码,应该是 Python 还是 Rust?路径?
答案 **Rust**。路径:[`sglang/rust/sgl_router/`](../sglang/rust/) 或仓库根的 `sgl-router/`(取决于版本布局)。 选 Rust 的原因:router 要扛 50k+ QPS、做 Bloom filter 近似匹配 + 路由决策,Python 会成瓶颈。 Python 部分只有客户端 wrapper(`sglang serve router` 子命令调 Rust 二进制)。同样 `rust/sgl_tokenizer/` 是 Rust 加速的 tokenizer 绑定。

15. 下一步

上游源码起点:sglang/