跳转至
推理系统手册 求职

作品指南:设计文档、里程碑与开源贡献

作品集、简历与学习计划一章列出了项目方向;这一章把其中最有区分度的三个作品——PD 感知的推理网关、GPU 算子、推理性能可视化工具——拆成可执行的计划:先写什么样的设计文档、分几个里程碑、每个里程碑用什么数字验收。最后是开源贡献的入门路线:几个主要项目的代码怎么读、怎样挑第一个 issue、PR 怎么写才容易被合入。

先写设计文档

动手之前花半天写一页设计文档,面试时它就是你讲项目的提纲。建议的结构:

部分 写什么 例子(网关)
背景与目标 解决什么问题,给出可量化的目标 "多实例部署下,缓存感知路由让 TTFT P99 比轮询低 50%"
非目标 明确不做什么,控制范围 不做鉴权、不做多模型路由
设计 架构图、关键数据结构、接口、请求的完整路径 近似前缀树、实例健康状态机、PD 配对流程
取舍 至少两个"可以这样也可以那样"的决定和理由 路由器内存里维护近似索引 vs 订阅实例的 KV 事件
验证计划 正确性怎么测、性能怎么测、对照组是什么 轮询、最少连接两个基线;三档负载
里程碑 每一步的交付物和验收数字 见下文
风险 最可能失败的地方和备选方案 真实引擎的 PD 接口变化 → 先对接一个固定版本

写完之后请人读一遍,对方能不看代码复述出设计,就说明写清楚了。

作品 B:PD 感知的推理网关(Rust)

目标:一个放在多个推理实例(SGLang 或 vLLM)前面的网关,支持 OpenAI 兼容接口、缓存感知路由、PD 分离的实例配对,以及生产环境需要的健康检查、重试和指标。相关章节:前缀缓存、PD 分离、分离式架构的全局调度。

里程碑 交付 验收
M1:代理 OpenAI 兼容的 /v1/chat/completions,SSE 流式转发,请求日志 流式输出与直连实例逐字节一致;网关自身增加的延迟 P99 < 1 ms
M2:路由 轮询、最少连接、缓存感知(每个实例一棵近似前缀树)三种策略;负载差距超过阈值时退化为最少连接 在多轮对话负载下,缓存命中率和 TTFT 相对轮询的改善有数字;给出阈值的敏感性曲线
M3:PD 与可靠性 prefill / decode 实例配对(对接 SGLang 的 PD 模式);健康检查、熔断、重试、优雅下线 故障注入:杀掉一个实例后请求自动切走,失败率和恢复时间有数字
M4:可观测与压测 Prometheus 指标(每个实例的队列、命中率、TTFT / TPOT 分位数);压测脚本与报告 三档负载 × 三种策略的对比表;README 能让陌生人 10 分钟跑起来

加分:按"预计 TTFT"统一代价并在过载时提前拒绝(全局调度一章的模拟可以直接当设计依据);把思路或代码贡献给 SGLang 的 Rust 网关。

作品 C:GPU 算子

目标:一个能说明你"下得到硬件"的算子,二选一:MLA 的 decode kernel(参考 FlashMLA 的思路,先 Triton 后 CUDA),或者分块缩放的 FP8 GEMM(参考 DeepGEMM)。相关章节:MLA 推理、FP8 与分组 GEMM,CUDA 手册的 Hopper 异步编程与 CUDA 作品集。

里程碑 交付 验收
M1:正确 朴素实现 + 与 PyTorch 参考实现对拍的测试(多种形状、边界情况) 最大误差在约定范围内(FP8 GEMM 用相对误差,MLA 用 bf16 的容差)
M2:快 分块、共享内存、Tensor Core(WGMMA / mma)、流水线 带宽受限的配置给出"占峰值带宽的比例",计算受限的给出"占峰值 TFLOPS 的比例"
M3:解释 Nsight Compute 报告:剩下的差距在哪(访存、流水线气泡、bank conflict、占用率) 至少一次"根据 ncu 的结论做出修改并测得提升"的记录
M4:集成 作为自定义算子接入 PyTorch(或直接替换 mini-sglang 里的对应 kernel) 端到端的 decode 延迟或 prefill 吞吐有变化的数字

面试时最有说服力的不是"达到了多少 TFLOPS",而是"我知道剩下的 30% 差在哪里,以及为什么没有继续优化"。

作品 D:推理性能可视化工具(可选)

目标:把 PyTorch profiler 的 trace 和推理引擎的日志变成一条可交互的时间线:每一步的 batch 组成、KV 占用、CPU 与 GPU 的空闲、每个请求 TTFT 的分解。相关章节:Profiling 推理引擎。

里程碑 交付 验收
M1:解析 读取 Chrome trace 格式的 profiler 输出和引擎日志,对齐时间轴 能在 SGLang 和 vLLM 的输出上都跑通
M2:视图 时间线、每步的 batch 与 KV 占用、请求级的 TTFT 分解 在线 demo
M3:诊断 自动发现常见问题:CPU 调度占比过高、CUDA Graph 未命中、prefill 打断 decode、通信没有重叠 用它定位一个真实问题,并写成案例文章

开源贡献入门

读代码的入口。 先读本手册的vLLM 源码导读和 SGLang 源码导读,再从下面的位置进入各个项目:

项目 从哪里读起 适合的第一类贡献
SGLang python/sglang/srt/managers/(调度器与 TokenizerManager)、srt/model_executor/、srt/layers/;Rust 网关在独立的子项目里 新模型支持、文档与示例、可复现的 bug、网关的小功能
vLLM vllm/v1/core/(调度与 KV 管理)、vllm/v1/worker/、vllm/model_executor/、csrc/ 测试补全、文档、模型支持、性能回归的定位
FlashInfer include/flashinfer/(CUDA 头文件形式的 kernel)、python/flashinfer/ kernel 的测试与基准、新形状的支持
Mooncake mooncake-transfer-engine/、mooncake-store/ 传输引擎的测试、与推理框架的集成

挑 issue。 从标记为 good first issue / help wanted 的开始;更好的是自己在使用中发现的问题——你已经能复现它,这是被合入的最大优势。先在 issue 里留言说明你打算怎么做,避免和别人重复。

写 PR。 标题说清楚改了什么;描述里写动机、复现步骤、修改的思路、测试方法,性能相关的修改一定附上前后对比的数据和测量方法;PR 越小越容易被合入,大的改动拆成几个。提交前按项目要求跑格式检查(通常是 pre-commit)和相关测试;有的项目要求提交签名(例如 vLLM 要求每个提交带 Signed-off-by)。评审意见要及时回复,不同意时讲理由和数据。

节奏。 冲刺计划里的目标是 3~5 个 PR,其中至少 1~2 个是非文档的实质修改。路径:文档与测试 → 复现并修一个 bug → 一个小功能。每个合入的 PR 都能在面试里讲成一个完整的故事:发现问题、定位、修复、验证。

怎么讲清楚

介绍作品时用"问题 → 方案 → 数字 → 取舍"的顺序,每个作品准备一个"失败的尝试":试过什么、为什么不行、学到了什么。面试官追问细节时,设计文档里的"取舍"一节就是你的答案来源。

小结

  • 先写一页设计文档:目标、非目标、设计、取舍、验证计划、里程碑、风险。
  • 作品 B(网关)、C(GPU 算子)、D(可视化工具)各分四个左右的里程碑,每个里程碑都有可量化的验收。
  • 开源贡献从读代码的入口、自己能复现的问题开始;PR 小而完整,附复现步骤、测试和前后对比的数据。

发现错误或有更好的写法?在 GitHub 上编辑此页提交问题