Rust in Everything

并行与分离

主线位置:「一个请求的一生」里的前向这一段被拆到多张卡上(并行),以及调度到前向这几段被拆到两个实例上(预填充与解码分离)。两个引擎的这部分都是 Python 编排、NCCL 或传输库搬数据;PD 部署前面的路由器是 Rust。
版本:vLLM v0.32.0、SGLang v0.5.22

单卡放得下一个 8B 模型时,并行和分离都不是必需的。这一部分讲它们在两个引擎里怎么组织进程、在哪里通信、要搬多少数据,用的是源码和按公开配置算的估算;效果全部待实测(C3-7)。

  1. 张量、流水线与数据并行:配置项和默认值;vLLM 一个 EngineCore 调度器驱动每卡一个 worker 进程,SGLang 每卡一个调度器进程、rank 0 收请求再广播;数据并行两边的分发方式,SGLang 的 DP attention 在 v0.5.22 改用 --attn-dp-size;列切、行切与每层两次 all-reduce,一次前向 65 次;按 Llama-3.1-8B 公开配置估算每 token 520 KiB 的 all-reduce 数据。
  2. 预填充与解码分离:为什么分;vLLM 的 KV connector 接口、实现和 --kv-transfer-config,NIXL 下先预填充、再带着 kv_transfer_params 解码的串行流程;SGLang 的 bootstrap server 与 bootstrap_room 配对、传输后端;SGLang model gateway 和 vllm-project/router 怎么把一个请求发给两边。
flowchart TB
  one["一个模型"] --> tp["张量并行<br/>每层切到 t 张卡<br/>每层 2 次 all-reduce"]
  one --> pp["流水线并行<br/>按层分段<br/>段间传 hidden"]
  one --> dp["数据并行<br/>多份副本<br/>各自调度"]
  one --> pd["预填充与解码分离<br/>两类实例<br/>KV 跨实例搬"]
  pd --> router["路由层(Rust)<br/>双发或串行两段"]

💬 关联讨论

发起讨论
加载中...