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模型正在适配中暂时会强制关闭异步调度。

View File

@@ -0,0 +1,9 @@
# 基础知识
- xLLM使用一卡一进程模式多卡之间使用rpc进行函数调用模型计算过程中的数据通信使用device集合通信库。
- HCCL/LCCL是高性能集合通信提供单机多卡以及多机多卡间的数据并行、模型并行集合通信方案。

View File

@@ -0,0 +1,17 @@
# ChunkedPrefill调度器
## 功能介绍
xLLM支持chunked prefill调度策略。Chunked prefill是一种优化大语言模型推理的技术将长prompt分割成多个较小的chunk进行分批处理而不是一次性处理整个prompt。
这种方法可以有效降低显存峰值使用量提高Device利用率并且能够更好地与decode阶段的请求进行调度和混合处理。
## 使用方式
上述策略已在xLLM实现并向外暴露gflag参数控制功能的开关。
- 开启chunked prefill并设置chunked_size如果不手动设置chunked size则默认等于max_tokens_per_batch。
```bash
--enable_chunked_prefill=true
--max_tokens_per_chunk_for_prefill=20480 # optional
```
## 性能效果
开启chunked_prefill之后在Qwen3-8B模型上限制TPOT 50msTTFT时延 **下降46%**

View File

@@ -0,0 +1,7 @@
# Continuous调度器
## 功能介绍
xLLM实现了支持continuous batching的调度策略continuous_batch是一种动态批处理策略它不等待批次填满而是在有请求时就开始处理同时持续接收新请求并将其加入正在执行的批次中从而在保持高吞吐量的同时显著降低延迟。
## 使用方式
xLLM提供了continuous batching调度策略。目前`enable_chunked_prefill`默认值为true开箱即用时默认调度器是chunked prefill调度器。

View File

@@ -0,0 +1,74 @@
# PD分离
## 背景
LLM在线推理服务通常需要满足TTFT和TPOT两项性能指标而传统的Contiguous Batching调度策略将Prefill和Decode请求混合在一起调度导致P和D会互相抢占计算资源影响性能指标无法最大程度的利用计算资源。为解决上述矛盾将Prefill和Decode两阶段拆分到独立的计算资源并行执行从而同时降低TTFT和TPOT并提升吞吐量。
## 功能介绍
xLLM PD分离功能主要通过以下三个模块实现
- **etcd**: 存储实例信息等元数据
- **xLLM Service**: 调度请求和管理所有计算实例
- **xLLM**: 请求计算实例
整体架构图如下:
![xLLM PD分离架构图](../../assets/pd_architecture.jpg)
## 功能使用示例
### 使用准备
#### 安装相关依赖
- **xLLM**: 参见[安装编译](../getting_started/quick_start.md)
- **xLLM Service**: 参见[PD分离部署](../getting_started/disagg_pd.md)
### 启动PD分离服务
1. 启动etcd
```
./etcd
```
2. 启动xLLM Service
```bash
ENABLE_DECODE_RESPONSE_TO_SERVICE=true ./xllm_master_serving --etcd_addr="127.0.0.1:12389" --http_server_port 28888 --rpc_server_port 28889 --tokenizer_path=/path/to/tokenizer_config_dir/
```
3. 启动xLLM
4. 以Qwen2-7B为例
- 启动Prefill实例
```bash
/path/to/xllm --model=Qwen2-7B-Instruct \
--port=8010 \
--devices="npu:0" \
--master_node_addr="127.0.0.1:18888" \
--enable_prefix_cache=false \
--enable_chunked_prefill=false \
--enable_disagg_pd=true \
--instance_role=PREFILL \
--etcd_addr=127.0.0.1:12389 \
--transfer_listen_port=26000 \
--disagg_pd_port=7777 \
--node_rank=0 \
--nnodes=1
```
- 启动Decode实例
```bash
/path/to/xllm --model=Qwen2-7B-Instruct \
--port=8020 \
--devices="npu:1" \
--master_node_addr="127.0.0.1:18898" \
--enable_prefix_cache=false \
--enable_chunked_prefill=false \
--enable_disagg_pd=true \
--instance_role=DECODE \
--etcd_addr=127.0.0.1:12389 \
--transfer_listen_port=26100 \
--disagg_pd_port=7787 \
--node_rank=0 \
--nnodes=1
```
需要注意:
- PD分离需要读取`/etc/hccn.conf`文件,确保将物理机上的该文件映射到了容器中
- `etcd_addr`需与`xllm_service`的`etcd_addr`相同
!!! warning "注意事项"
PD分离目前不支持开启prefix cache及chunked prefill功能需要通过以下参数关闭
``` shell
--enable_prefix_cache=false
--enable_chunked_prefill=false
```

View File

@@ -0,0 +1,35 @@
# MoE负载均衡EPLB
## 背景介绍
MoE模型依赖动态路由分配tokens给专家但实际部署中因数据分布不均导致专家负载失衡部分过载、部分闲置。专家冗余调整如新增/删除副本需要消耗额外显存并可能因权重迁移影响推理延迟如何高效、平滑地完成是一大挑战。为此采用专家冗余策略复制热点专家结合分层和全局动态负载均衡实现了动态的MOE负载均衡。
## 功能介绍
xLLM MoE负载均衡EPLB功能主要通过以下三个模块实现
- eplb manager: 负责专家负载并收集并管理专家分布更新更新,采用逐层更新机制,根据专家负载变化情况判断是否更新该层。
- eplb excutor: 实际专家分布更新执行器。
- eplb policy: 新专家负载表生成策略。
整体架构图如下:
![xLLM eplb](../../assets/eplb_architecture.png)
## 使用方式
只需在启动 xLLM 时加上下面的 gflag 参数即可:
替换为实际的Device个数 ep_size要与device个数保持一致
- xLLM中提供了gflags参数`enable_eplb`默认false如需开启动态专家负载均衡在xLLM的服务启动脚本中设置为true即可。
- `expert_parallel_degree``ep_size`为moe相关参数`expert_parallel_degree`需要设置为`2``ep_size`要与实际NPU/GPU卡个数保持一致。参考 [moe_params](./moe_params.md)
- `eplb_update_interval`为专家分布更新时间间隔单位为妙默认值为1000.
- 专家分布更新采用根据专家负载的逐层更新机制,当某一层专家的前后两次的负载相似度小于`eplb_update_interval`时选择更新该层默认值为1取之范围为(0,1)。
```bash
--enable_eplb=true
--expert_parallel_degree=2
--ep_size=16
--eplb_update_interval=2000
--eplb_update_threshold=0.9
```
## 未来工作
* 采用更加细粒度的专家更新机制。
* 与调度层结合通过请求batch的重组实现更好的负载均衡。

View File

@@ -0,0 +1,34 @@
# 全局多级KV Cache
## 背景
大型语言模型LLM解码阶段因自回归生成需频繁访问历史KV缓存导致显存带宽成为瓶颈。随着模型规模与上下文窗口扩大如128K Token消耗超40GB显存单卡显存压力剧增。现有方案如vLLM在长上下文场景下存在明显局限预填充耗时激增、解码阶段显存带宽争抢严重为满足SLOTTFT<2s, TBT<100ms常需过量预留资源致使GPU利用率不足40%且难以利用跨服务器资源为此我们提出分布式全局多级KV缓存管理系统采用存算一体架构以突破单机资源限制
## 功能介绍
xLLM 全局KV Cache功能主要通过以下三个模块实现
- etcd: 集群服务注册负载信息同步及全局缓存状态管理
- xLLM Service: 调度请求和管理所有计算实例
- xLLM: 请求计算实例
整体架构图如下
![xLLM 全局多级KV Cache](../../assets/globalkvcache_architecture.png)
## 功能使用示例
### 使用准备
#### 安装相关依赖
- **xLLM**: 参见[快速开始](../getting_started/quick_start.md)
- **xLLM Service**: 参见[PD分离部署](../getting_started/disagg_pd.md)
### 使用方式
1. etcd启动配置
```bash
./etcd --listen-peer-urls=http://0.0.0.0:10999 --listen-client-urls=http://0.0.0.0:10998
```
2. xLLM Service启动配置
```bash
./xllm_master_serving --etcd_addr="127.0.0.1:10998" --http_server_port 28888 --rpc_server_port 28889 --tokenizer_path=/path/to/tokenizer_config_dir/
```
3. xLLM启动添加上下面的 gflag 参数即可
```bash
--enable_service_routing=true
--enable_cache_upload=true
# PD分离暂时不支持全局KVCache管理
--enable_disagg_pd=false
```

View File

@@ -0,0 +1,77 @@
# Graph Mode
## 概述
xLLM 支持 Graph Mode通过预捕获计算图并在后续执行中重放减少 CPU 开销并提高推理性能。Graph Mode 在不同硬件平台上均有对应实现。
## 功能介绍
为了优化 Host 侧调度性能,图模式通过在 CPU 一次提交大任务后,设备内部流式执行小 kernel显著降低启动时间和设备气泡。
在 xLLM 引擎中Graph Mode 实现了以下特性:
### 动态维度参数化
- 将除 num_tokens 以外的关键动态维度作为整图输入参数,包括 batch_size、kv_seq_lens、q_seq_lens、block_table_size 等,从而提高灵活性。在进行图的内存分配和内核配置时,利用这些动态参数计算实际所需值。在图启动阶段,将上述实际参数传入,以确保 kernel 能够使用正确的 stride 访问数据。
### Piecewise Graph
- 当部分算子不支持 graph 导致整图无法捕获break graph对 break 之后的各段piece分别捕获 graph。这样在无法整图捕获的情况下仍能尽可能获得 graph mode 的收益,常用于 prefill、chunked_prefill 等场景。
### 多 shape 复用的显存池
- 为了避免不同 shape 的 graph capture 分别占用独立显存,我们让不同 capture 使用不同虚拟地址空间,并共享同一组底层物理内存;同时,输入 tensor 通过持久化 buffer 与 slice 方式复用。
## 使用方式
上述功能已在 xLLM 引擎内部实现,通常通过 gflags 参数控制。
最小配置只需要开启 `enable_graph`,用于打开 decode 阶段的 Graph Mode
```shell
--enable_graph=true
```
常见的配套开关包括:
- `enable_graph`:开启 decode 阶段的 Graph Mode 基础能力
- `enable_prefill_piecewise_graph`:开启 prefill 阶段的 Piecewise Graph
- `enable_graph_mode_decode_no_padding`decode 阶段按实际 `num_tokens` 建图,而不是按 padding 后的 shape 建图
- `max_tokens_for_graph_mode`:限制 Graph Mode 覆盖的最大 token 数;`0` 表示不限制
如果希望同时开启 decode Graph 和 prefill Piecewise Graph示例如下
```shell
--enable_graph=true \
--enable_prefill_piecewise_graph=true \
--max_tokens_for_graph_mode=2048
```
如果需要在 decode 阶段启用无 padding 建图,可额外开启:
```shell
--enable_graph=true \
--enable_graph_mode_decode_no_padding=true
```
更完整的参数说明可参考 [CLI 参数说明](../cli_reference.md)。
## 性能效果
- 开启 Graph Mode 后,在 Qwen3-0.6B 和 Qwen3-1.7B 等模型上decode 阶段吞吐 **提升约 8%10%**
## 模型支持
下表列出目前各模型在 ACLGraph、CudaGraph、MLUGraph 上的支持情况。
| 模型 | ACLGraph | CudaGraph | MLUGraph |
|------|----------|-----------|----------|
| Qwen3/Qwen3-MoE | ✅ | ✅ | ✅ |
| DeepseekV3.2 | ✅ | | ✅ |
| GLM4.5/4.6/4.7 | ✅ | | |
| Qwen2.5-VL | | | ✅ |
| Qwen3-VL/Qwen3-VL-MoE | ✅ | | |
| GLM4V | ✅ | | |
| GLM4V-MoE | ✅ | | |
## 相关文档
- 更详细的 Graph Mode 设计与实现说明(含 ACL Graph / CUDA Graph 基本原理、动态维度参数化、Piecewise Graph 与多 shape 复用内存方案)见:[Graph Mode 设计文档](../design/graph_mode_design.md)

View File

@@ -0,0 +1,41 @@
# GroupGEMM算子优化
# 背景
混合专家(Mixture of Experts, MoE)架构已成为扩展大规模语言模型的重要范式其核心思想是将输入token动态路由至不同的专家子网络进行处理。在推理过程中GroupGEMM算子是MoE架构的关键计算单元负责高效执行多个专家矩阵乘法的并行计算且在整个推理耗时中占据主导地位。
## 功能介绍
结合当前GroupGEMM的性能瓶颈为I/O受限提出了一种优化方案通过索引重排替代数据拷贝取消了对token向量的多次复制改为维护专家分配的索引表。通过该行号索引直接将token映射到相应的专家计算单元并将token的分配调度与矩阵乘法融合为一个单一的kernel。
## 用户接口
### 算子直调API
```c++
aclnnStatus aclnnIndexGroupMatmulGetWorkspaceSize(
const aclTensorList *x,
const aclTensorList *weight,
const aclTensorList *scale,
const aclTensorList *perTokenScale,
const aclTensor *groupList,
const aclTensorList *out,
uint64_t *workspaceSize,
aclOpExecutor **executor);
aclnnStatus aclnnIndexGroupMatmul(
void *workspace,
uint64_t workspaceSize,
aclOpExecutor *executor,
aclrtStream stream);
```
- `x`: 输入的张量列表,包含待处理的数据。
- `weight`: 权重张量,包含模型的参数。
- `scale`: 缩放因子,用于调整输入张量的值。
- `perTokenScale`:每个token的缩放因子用于动态调整。
- `groupList`: 专家组列表,指示哪些专家参与计算。
- `out`: 输出张量列表,存储计算结果。
## 性能效果
![groupmatmul](../../assets/groupmatmul_performance.png)
* 优化后的GroupMatmul算子在计算时间上表现出明显的优势尤其是在k为128m为64情况下如图所示优化后算子计算延时 **减少50%**

View File

@@ -0,0 +1,17 @@
# EP并行
## 背景介绍
在部署DeepSeek-R1 671B参数规模模型时传统分布式部署面临、显存利用率低、通信开销大、硬件成本高昂等核心瓶颈因此需要引入ep并行。
+ 在同等资源下单张卡上的Expert越少可用于KV Cache的显存越多可Cache的token个数越多。
+ 因MLA的特性同等资源下TP Size越小冗余的KV Cache就越少可Cache的token个数越多。
+ 采用大规模ep并行部署可以将同一个expert的token计算集中到同一设备上提高硬件利用率
## 参数设置
+ dp_size设置Attention部分的dp规模大小默认值为1可设置为2的指数倍当dp_size不等于卡数时dp组内为tp并行.
+ ep_size设置MoE部分的ep规模大小默认值为1可设置为2的指数倍当ep_size不等于卡数时dp组内为tp并行.
+ expert_parallel_degree ep并行相关参数不开启ep时默认设置为0开启ep时默认为1此时为ep level1当ep_size等于卡数时可以设置为2开启ep level2.
支持 MLA 的模型会自动开启 MLA不再需要手动配置。
## 方案设计
+ 当开启ep时默认为ep level1此时attn与moe部分计算完成后通过All Gather全卡通讯将数据发送到下一阶段以64卡attn部分dp32tp2 moe部分ep32tp2为例执行流程如下
![Alt text](../../assets/moe_eplevel1.jpg)
+ 当ep_size设置为卡数时可以开启ep level2此时attn部分与moe部分之间通讯变为ALL2ALL只向需要的卡发送数据降低通讯量与通讯开销以64卡部署为例执行流程如下
![Alt text](../../assets/moe_eplevel2.jpg)

View File

@@ -0,0 +1,149 @@
# MTP投机推理
## 背景
MTP是一种创新的推理阶段加速技术专注于解决大语言模型生成过程中的效率瓶颈。MTP的本质是通过预训练阶段的特殊设计为推理阶段提供高效的草稿token预测能力从而显著提升模型的生成速度。其核心价值在于平衡推理效率与输出质量为大语言模型的长序列生成问题提供了一种高效的解决方案最终实现推理性能的优化。
## 功能介绍
MTP在推理加速方面具有以下核心功能
- **高效草稿生成**使用低成本的MTP结构快速生成草稿token这些草稿token作为主模型验证的基础大幅减少了传统自回归生成的计算开销。
- **批量验证机制**主模型能够同时批量验证多个MTP生成的草稿token而不必逐个生成和验证显著提升了推理速度。
- **高采样准确率**MTP解决了Eagle、Medusa等现有推理加速方法中的关键痛点——训练后生成的draft模块token采样率低的问题。由于MTP在预训练阶段就优化了草稿生成能力其生成的token具有更高的准确率减少了主模型的验证负担。
- **推理延迟降低**通过预先生成多个可能的后续tokenMTP有效降低了模型生成长文本时的累积延迟使用户体验更加流畅。
- **资源消耗优化**相比其他推理加速技术MTP在保持加速效果的同时对计算资源的额外需求更少适合在资源受限环境下部署。
MTP技术为大语言模型的推理阶段提供了一种全新的效率优化方案特别适合需要快速响应的实时应用场景代表了语言模型推理优化的重要发展方向。
!!! note "模型支持"
目前支持以下模型的MTP结构导出
- DeepSeek-V3 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v3_mtp)
- DeepSeek-V3.2 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v32_mtp)
- DeepSeek-R1 (输入 model_type: deepseek_v3, 导出 MTP model_type: deepseek_v3_mtp)
- GLM4 MoE (如 GLM-4.5-Air, 导出 MTP model_type: glm4_moe_mtp)
注意:
- DeepSeek V3 和 R1 的输入 model_type 都是 "deepseek_v3",导出的 MTP 模型 model_type 为 "deepseek_v3_mtp"
- DeepSeek V3.2 的输入 model_type 是 "deepseek_v3"(但可通过 index_head_dim 等字段自动识别),导出的 MTP 模型 model_type 为 "deepseek_v32_mtp"
## 使用示例
### 导出模型
脚本会自动检测模型类型,也可以手动指定。
#### DeepSeek-V3
```bash
python3 tools/export_mtp.py \
--input-dir /path/to/DeepSeek-V3 \
--output-dir /path/to/DeepSeek-V3-mtp
```
#### DeepSeek-V3.2
```bash
python3 tools/export_mtp.py \
--input-dir /path/to/DeepSeek-V3.2 \
--output-dir /path/to/DeepSeek-V3.2-mtp
```
#### DeepSeek-R1
```bash
python3 tools/export_mtp.py \
--input-dir /path/to/DeepSeek-R1 \
--output-dir /path/to/DeepSeek-R1-mtp
```
#### GLM4 MoE
```bash
python3 tools/export_mtp.py \
--input-dir /path/to/GLM-4.5-Air \
--output-dir /path/to/GLM-4.5-Air-mtp
```
#### 手动指定模型类型
如果自动检测失败,可以手动指定模型类型:
```bash
python3 tools/export_mtp.py \
--input-dir /path/to/model \
--output-dir /path/to/model-mtp \
--model-type deepseek_v3 # 可选: deepseek_v3 (用于V3/R1), deepseek_v32 (用于V3.2), glm4_moe
```
输入模型参考:
- [DeepSeek-V3](https://huggingface.co/deepseek-ai/DeepSeek-V3)
- [DeepSeek-V3.2](https://huggingface.co/deepseek-ai/DeepSeek-V3.2)
- [DeepSeek-R1](https://huggingface.co/deepseek-ai/DeepSeek-R1)
- [GLM-4.5-Air](https://huggingface.co/zai-org/GLM-4.5-Air)
### 启动脚本
使用MTP进行推理时需要同时指定主模型和草稿模型MTP模型
#### DeepSeek-V3/V3.2/R1 启动示例
```bash
MODEL_PATH="/models/DeepSeek-V3"
DRAFT_MODEL_PATH="/models/DeepSeek-V3-mtp"
MASTER_NODE_ADDR="127.0.0.1:42123"
START_PORT=13222
START_DEVICE=0
LOG_DIR="log"
NNODES=16
for (( i=0; i<$NNODES; i++ ))
do
PORT=$((START_PORT + i))
DEVICE=$((START_DEVICE + i))
LOG_FILE="$LOG_DIR/node_$i.log"
nohup ./xllm \
--model $MODEL_PATH \
--devices="npu:$DEVICE" \
--port $PORT \
--master_node_addr=$MASTER_NODE_ADDR \
--nnodes=$NNODES \
--draft_model $DRAFT_MODEL_PATH \
--draft_devices="npu:$DEVICE" \
--num_speculative_tokens 1 \
--max_memory_utilization=0.90 \
--max_tokens_per_batch=10000 \
--max_seqs_per_batch=256 \
--block_size=128 \
--ep_size=1 \
--dp_size=1 \
--enable_prefix_cache=false \
--enable_chunked_prefill=false \
--node_rank=$i > $LOG_FILE 2>&1 &
sleep 0.5
done
```
#### GLM4 MoE 启动示例
```bash
MODEL_PATH="/models/GLM-4.5-Air"
DRAFT_MODEL_PATH="/models/GLM-4.5-Air-mtp"
# ... 其他配置相同
```
# 性能数据
基于sharegpt数据集输入长度2500输出长度1500请求总数80。
| method | Concurrency | Mean TPOT(ms) | Mean TTFT(ms) | Output Tokens/s | Total Tokens/s |
|:---------:|:-----------:|:-------------:|:-------------:|:---------------:|:--------------:|
| baseline | 1 | 40.61 | 141.80 | 24.20 | 65.77 |
| mtp | 1 | 28.33 | 142.35 | 35.19 | 95.52 |
| baseline | 2 | 42.69 | 178.59 | 45.16 | 122.74 |
| mtp | 2 | 29.81 | 187.97 | 64.75 | 175.78 |
| baseline | 4 | 46.18 | 172.34 | 79.83 | 216.96 |
| mtp | 4 | 33.54 | 194.22 | 111.18 | 301.81 |
| baseline | 8 | 53.16 | 181.49 | 110.68 | 300.81 |
| mtp | 8 | 40.99 | 203.37 | 154.46 | 419.34 |
| baseline | 16 | 68.50 | 213.89 | 143.81 | 390.84 |
| mtp | 16 | 57.04 | 254.99 | 201.89 | 548.04 |
| baseline | 20 | 74.72 | 228.80 | 154.77 | 420.65 |
| mtp | 20 | 61.73 | 264.34 | 206.24 | 559.84 |
| baseline | 40 | 119.68 | 559.32 | 180.22 | 489.80 |
| mtp | 40 | 105.70 | 544.54 | 252.91 | 686.74 |
| baseline | 80 | 180.89 | 2996.21 | 192.09 | 522.06 |
| mtp | 80 | 152.19 | 2163.72 | 278.07 | 755.12 |

View File

@@ -0,0 +1,29 @@
# 多流并行
## 背景
大模型分布式推理场景中需要引入额外的通信操作将不同设备上的计算结果聚合在一起。以Deepseek这类大规模的MoE模型为例分布式规模通常较大通信开销也会随之变大。计算和通信都采用同一个stream的话在通信的同时device计算资源会出现浪费一直等待通信完成才能开始后面的计算。
## 功能介绍
xLLM在模型图层支持了多流并行功能将输入的batch拆分成2个micro batches一个流执行一个micro batch的计算操作另一个流执行另一个micro batch的通信操作计算和通信同时执行从而掩盖通信开销。
![异步调度](../../assets/multi_streams_architecture.jpg)
## 使用方式
xLLM中提供了gflags参数`enable_multi_stream_parallel`默认false如需开启在xLLM的服务启动脚本中设置为true即可示例如下
```shell
--enable_multi_stream_parallel=true
```
## 性能效果
prefill双流并行开启后基本可掩盖75以上的通信开销在DeepSeek-R1模型上只输出1个token的情况下
- TTFT下降 **7%**
- 吞吐 **提升7%**
!!! warning "注意"
双流并行目前只支持prefill阶段请求输入越长收益越大。
目前仅支持DeepSeek、Qwen3 dense非MoE模型。

View File

@@ -0,0 +1,19 @@
# 多模态支持
本文档主要介绍xLLM推理引擎中多模态的支持进展包括支持模型及模态类型以及离在线接口等。
## 支持模型
- Qwen2.5-VL: 包括7B/32B/72B。
- Qwen3-VL: 包括2B/4B/8B/32B。
- Qwen3-VL-MoE: 包括A3B/A22B。
- MiniCPM-V-2_6: 7B。
## 模态类型
- 图片: 支持单图、多图的输入,以及图片+Prompt组合、纯文本Promot等输入方式。
!!! warning "注意事项"
- 目前多模态后端不支持prefix cache以及chunk prefill正在支持中。
- 目前xLLM统一基于JinJa渲染ChatTemplate部署MiniCPM-V-2_6模型目录需提供ChatTemplate文件。
- 图片支持Base64输入以及图片Url。
- 目前多模态模型主要支持了图片模态,视频、音频等模态正在推进中。

View File

@@ -0,0 +1,57 @@
# 整体架构
## 背景
近年来随着百亿至万亿参数规模的大语言模型如GPT、Claude、DeepSeek、LLaMA等在自然语言处理和多模态交互领域取得突破性进展产业界对高效推理引擎与服务体系的构建提出了迫切需求。如何降低集群推理成本、提升推理效率已成为实现规模化商业落地的关键挑战。
尽管当前已涌现出一批面向大模型推理的优化引擎,但在实际部署过程中仍面临诸多技术瓶颈:
- 硬件适配性挑战:现有推理引擎对国产芯片等专用加速器的架构特性支持不足,难以充分发挥异构计算硬件的性能潜力,导致计算资源利用率低下;
- MoE架构优化难题专家并行机制中的令牌分发过程产生显著的All-to-All通信开销同时动态路由策略引发的专家负载不均衡问题严重制约了系统的可扩展性
- 长上下文管理瓶颈随着模型上下文窗口持续扩展KV缓存在内存碎片化处理、跨节点同步等方面的优化效率直接影响整体推理吞吐性能
- 混合部署效能局限现有推理集群在同时处理在线服务和离线任务时难以兼顾服务质量SLO保障与资源利用率优化。
- 动态PD适配不足当输入/输出序列长度出现剧烈波动时静态PD资源划分缺乏实时调整PD资源配置的能力既可能导致GPU资源闲置又存在SLO违约风险。
为此我们提出了xLLM——高效且易用的开源智能推理框架为模型在国产芯片上的推理提供企业级服务保障与高性能引擎计算能力。
## 功能介绍
xLLM提供智能计算能力我们实现了多种计算系统层和算法驱动层的联合推理加速
### 计算系统层
#### 多层流水线执行编排
在框架层异步化CPU调度使其与芯片推理计算形成流水线减少计算空泡在模型图层切分单个batch形成两个micro-batches之间的流水线重叠计算通信在算子内核层不同计算单元间流水重叠计算访存。
#### 动态shape的图执行优化
针对大语言模型处理动态输入如可变序列长度和批大小时面临的静态图适配问题xLLM通过参数化设计捕获输入维度实现动态适配并结合多图缓存方案减小编译开销使用受管控的显存池替代绝对地址保障安全复用最终在保持高灵活性的同时获得较高的执行效率。
#### 算子优化
xLLM实现了LLM中的关键算子在国产硬件芯片上的特定优化包括GroupMatmul、Chunked Prefill等。
#### xTensor显存管理
xTensor 显存管理框架采用 物理内存页池预分配 + 虚拟地址连续性映射 的方法通过动态按需映射物理页、复用可重用内存页Reusable及异步预映射优化调度结合 NPU 算子适配(如虚拟地址化 FlashMLA实现了高效动态内存管理取得了内存利用率提升以及延迟降低。
### 算法驱动层
#### PD分离
xLLM全面支持PD分离场景实现了高效的PD实例的管理以及PD实例之间的通信以及kv cache传输。
#### 全局调度
xLLM对请求和实例做全周期的资源调度智能管理。
##### 实例调度
我们实现了多种实例调度策略来选择如何将实例分配到更适合的实例。包括简单的Round Robin策略基于请求在各实例上的 prefix cache 命中率来选择的 prefix cache-aware 策略,基于实例上的显存空闲程度的 KV Cache-aware 策略。另外针对PD分离场景由于静态的PD比例往往无法很好应对流量以及请求输入输出长度突变的场景我们实现了一种自适应的PD动态调度器负责在线请求的全局实例分配与运行时PD动态调整。
##### 请求调度
我们实现了多种请求调度策略支持continuous batching包括chunked prefillprefill优先和decode优先等batch策略同时全面支持PD分离场景。
#### 全局kv cache管理
在全局层面采用ETCD作为元数据服务中间件实现集群服务注册、负载信息同步及全局缓存状态管理。每个计算实例维护本地多级缓存池。在调度策略方面系统采用基于 KV Cache 的动态决策机制:首先进行前缀匹配检测,计算各候选节点的 KV Cache 复用率,最终选择综合性能最优的节点进行处理,实现 KV Cache 的动态卸载与迁移。
#### 投机推理
xLLM内置优化后的投机推理算法一次生成多个tokens提升吞吐。xLLM通过投机模块下沉减少通信成本并使用调度和计算时序重叠优化、减少投机场景算子数据搬运等方式优化投机推理计算。
#### MOE负载均衡
xLLM针对MoE模型实现了基于历史专家负载统计的专家权重更新在推理时通过高效专家负责统计和双缓冲无感知的专家权重更新实现有效的动态负载均衡。
### 多模态支持
xLLM对包括Qwen2-VLMiniCPMV在内的多种多模态模型提供全面的支持。
### 相关设计文档
- [Graph Mode 设计文档](../design/graph_mode_design.md)
- [生成式推荐设计文档](../design/generative_recommendation_design.md)

View File

@@ -0,0 +1,36 @@
# PpMatmul 算子优化
## 背景
针对大模型推理中矩阵乘法占比高、耗时长的问题,优化了矩阵乘法算子的实现。
## 功能介绍
PpMatmul 算子使用 Tiling 切分策略,将矩阵乘法分解为多个小的矩阵乘法任务。然而当 tile 数量较小时任务无法被均匀分配到所有 npu 核心上,导致 tail effect 问题,影响计算效率。我们通过预取内存或重新划分任务的方式,优化 PpMatmul 算子的性能。
## 用户接口
### 算子直调 API
```cpp
aclnnStatus aclnnPpMatmulOptGetWorkspaceSize(
const aclTensor *a,
const aclTensor *b,
const aclTensor *out,
uint64_t *workspaceSize,
aclOpExecutor **executor);
aclnnStatus aclnnPpMatmulOpt(
void *workspace,
uint64_t workspaceSize,
aclOpExecutor *executor,
aclrtStream stream);
```
- `a`: 输入矩阵 A。
- `b`: 输入矩阵 B。
- `out`: 输出矩阵,存储计算结果。
## 性能效果
对于 tile 数量较小的情况(例如 M 较小,对应于 batch size 较小的情况TP=4算子较优化前有 **18%** 的性能提升。

View File

@@ -0,0 +1,20 @@
# Prefix Cache 优化
## 功能介绍
xLLM支持prefix_cache匹配。prefix_cache基于mermer_hash使用lru淘汰策略提供更极致的匹配效率同时提高prefix_cache命中率。
同时对prefix_cache进行了优化支持continuous_scheduler、chunked_scheduler和zero_evict_scheduler在prefill之后即更新
prefix_cache提高匹配时效性同时对于chunked_scheduler支持多阶段chunked_prefill匹配减少计算量并尽可能减少kv_cache占用。
## 使用方式
prefix_cache已在xLLM实现并向外暴露gflag参数控制功能的开关。
- 开启zero_evict策略并设置max_decode_token_per_sequence。
```
--enable_prefix_cache=true
```
## 性能效果
开启prefix_cache之后在Qwen3-8B模型上限制TPOT50msE2E时延 **下降10%**
!!! warning "注意"
暂不支持PD分离调度器

View File

@@ -0,0 +1,27 @@
# Topk&Topp算子优化
## 背景
在自然语言生成任务中topK和topP采样策略被广泛应用于控制生成文本的多样性和质量。然而在小模型中这两种策略的计算耗时相对较长。这主要是由于小模型的参数较少导致在处理概率分布时排序和筛选的效率降低从而影响了生成速度。因此优化小模型中topK和topP的实现可以提升其采样效率。
## 功能介绍
topKtopP算子的实现将排序、topK、softmax和topP等多个小算子融合为一个大算子从而提高了计算效率和性能。
## 用户接口
### 算子调用API
```c++
void top_k_top_p(torch::Tensor& logits,
const torch::Tensor& topK,
const torch::Tensor& topP);
```
- `logits`: 输入的logits张量包含模型的输出分数。
- `topK`: 用于选择的前K个概率的阈值张量。
- `topP`: 用于选择的累积概率的阈值张量。
## 性能效果
* 使用topKtopP融合算子后在qwen2-0.5B模型中TTOT **下降37%**,TTFT **提升10%**

View File

@@ -0,0 +1,48 @@
# xLLM Service
[:simple-github: xLLM Service](https://github.com/jd-opensource/xllm-service)
## 简介
**xLLM-service** 是一个基于 xLLM 推理引擎开发的服务层框架,为集群化部署提供高效率、高容错、高灵活性的大模型推理服务。
xLLM-service 旨在解决企业级服务场景中的关键挑战:
- 如何于在离线混合部署环境中保障在线服务的SLA提升离线任务的资源利用率。
- 如何适应实际业务中动态变化的请求负载,如输入/输出长度出现剧烈波动。
- 解决多模态模型请求的性能瓶颈。
- 保障集群计算实例的高可靠性。
#### 背景
当前百亿至万亿参数规模的大语言模型正快速部署于智能客服、实时推荐、内容生成等核心业务场景对国产计算硬件的高效支持已成为低成本推理部署的核心需求。现有推理引擎难以有效适配国产芯片等专用加速器的架构特性硬件计算单元利用率低、MoE 架构下的负载不均衡与通信开销瓶颈、kv 缓存管理困难等问题制约了请求的高效推理与系统的可扩展性。xLLM-service + xLLM推理引擎提升了全链路效率为大语言模型在实际业务中的规模化落地提供了关键技术支撑。
---
## 整体架构
xLLM-service 整体架构如图所示:
![1](../../assets/service_arch.png)
## 核心组件
### ETCD Cluster
用于元信息管理包括模型xllm实例请求等元信息的存储与管理。同时提供xllm节点注册与发现服务。
### Fault Tolerance
xLLM-service 提供容错管理,保障服务质量以及稳定性。
### Global Scheduler
实现全局感知调度,根据当前系统状态,将请求精准调度至最优实例执行,有效提升整体服务响应效率与资源利用率。
### Global KV Cache Manager
负责全局 KV Cache 管理,核心能力包括分布式 KV 缓存感知、Prefix 前缀匹配、KV Cache 动态迁移等,优化缓存资源使用效率。
### Instance Manager
聚焦实例全生命周期管理,所有 xllm 实例启动后需向本模块注册,模块基于预设策略,为实例提供调度适配、容错处理等支持。
### Event Plane
作为指标与事件中枢,接收各实例上报的 Metrics 数据,对统计指标进行统一收集与整理,为服务调度、容错、扩缩容等决策提供数据支撑。
### Planner
承担策略分析与决策职能,基于 Event Plane 上报的 Metrics 数据(含实例运行时指标、机器负载指标等),分析服务扩缩容需求、热点实例扩展必要性,输出资源调整与实例优化策略。

View File

@@ -0,0 +1,17 @@
# Zero Evict调度器
## 功能介绍
xLLM支持zero_evict调度策略。zero_evict调度策略是一种尽可能减少请求淘汰率的调度算法可以减少淘汰请求的prefill计算减少TPOT。
这种调度算法通过模拟轮次,检测请求是否调度可以被调度且不导致其它请求被淘汰。
## 使用方式
上述策略已在xLLM实现并向外暴露gflag参数控制功能的开关。
- 开启zero_evict策略并设置max_decode_token_per_sequence。
```
--use_zero_evict=true
--max_decode_token_per_sequence=256
```
## 性能效果
开启zero_evict之后在Qwen3-8B模型上限制E2E时延TPOT时延 **下降27%**