ref(upstream): FULL TREE — Deep-Spark xllm (1470) + ds_vllm csrc/models (703)

Replaces cherry-picked upstream_ref with complete source trees.

xllm/ — Iluvatar official C++ inference engine (15MB, 1470 files)
  Complete: kernels → layers → models → runtime → scheduler → api
  Excluded: .git, binary images, third_party submodule checkouts

ds_vllm/ — Iluvatar official vllm fork (8MB, 703 files)
  Included: csrc/ (ALL CUDA kernels), fused_moe/, qwen3_5 model, _custom_ops
  Excluded: tests, benchmarks, docs, examples (not needed for reference)

Critical call chains now fully traceable:
  MoE: moe_topk_softmax_kernels.cuh → ixformer.h → fused_moe.cpp → layer
  GDN: qwen3_gated_delta_net_base.cpp → qwen3_5_gated_delta_net.cpp
  Attention: ixformer.h → xllm_paged_attention → attention.cpp
This commit is contained in:
EX Engine
2026-08-10 02:53:54 +00:00
parent 9e4fb3712f
commit 002f9879b2
2179 changed files with 494021 additions and 79 deletions

View File

@@ -0,0 +1,33 @@
# 异步调度
## 背景
大模型推理过程可划分为3个阶段包括CPU执行调度准备模型输入阶段device计算阶段CPU处理输出阶段。
由于解码操作的序列性step-i+1 的输入需要依赖 step-i 的输出结果,
上述3个阶段需要按顺序串行执行导致在CPU执行阶段1和3的时候device侧空闲等待出现空泡资源利用不充分。
## 功能介绍
xLLM在框架层支持了异步调度功能在device执行 step-i 计算的同时提前让CPU执行 step-i+1 的调度操作device在完成 step-i 计算后可立即开始 step-i+1 的计算,从而消除空泡。
具体地CPU在发起 step-i 计算调用后不等待device计算完成为 step-i 的请求构造fake token使用fake token执行 step-i+1 的调度操作分配KV Cache等device在启动 step-i+1 的计算时,用 step-i 计算出来的true token替换fake token保证计算的正确性。CPU在另外的线程中同步处理 step-i 的结果返回给client。
整体架构如图实现中CPU侧执行阶段1和阶段3的操作分别采用了不同的线程池rpc等函数调用采用C++ future和promise非阻塞调用实现全异步runtime。![异步调度](../../assets/async_schedule_architecture.jpg)
## 使用方式
xLLM中提供了gflags参数`enable_schedule_overlap`默认false如需开启在xLLM的服务启动脚本中设置为true即可示例如下
```shell
--enable_schedule_overlap=true
```
## 性能效果
- 异步调度开启后两个step之间的device空闲时在200us左右基本类似一个kernel launch的时间。
- 在DeepSeek-R1-Distill-Qwen-1.5B模型上限制TPOT 50ms吞吐 **提升17%**
!!! warning "注意"
- 异步调度功能会在服务端额外计算一个step当使用场景中输出token数量较少或是类似embedding模型只一次性输出的场景会影响服务端吞吐所以强制关闭异步调度。
- VLM模型正在适配中暂时会强制关闭异步调度。