feat: 添加环境安装指南、验证与基准测试文档

This commit is contained in:
2026-02-11 00:13:26 +08:00
parent ae10ce68f0
commit c00c47a5b2
3 changed files with 635 additions and 0 deletions

207
ARCHITECTURE.md Normal file
View File

@@ -0,0 +1,207 @@
# vllm-npu-plugin 功能说明
## 一、项目背景
本项目将华为昇腾 NPU 的推理优化适配到 vLLM v0.11.0,采用**插件化架构**,无需修改 vLLM 主仓库代码。
### 演进路径
```
vllm_0.2.7_ascend(旧方案) → vllm-npu-plugin当前方案
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
旧方案:直接 fork vLLM 0.2.7
全局替换 cuda → npu
侵入式修改核心代码
新方案:基于 vLLM V1 的 Hardware Pluggable 接口,
独立 pip 包,通过 entry_points 注册,
与 vLLM 主线解耦
```
---
## 二、旧方案vllm_0.2.7_ascend)做了什么
vllm_0.2.7_ascend 是对 vLLM v0.2.7 的侵入式 fork核心改动包括
### 2.1 设备层替换
| 原始CUDA | 替换后NPU |
|-------------|--------------|
| `torch.cuda.*` | `torch.npu.*` |
| `device="cuda"` | `device="npu"` |
| NCCL 通信后端 | HCCL 通信后端 |
| `torch.cuda.CUDAGraph` | `torch_npu.npu.Graph` |
### 2.2 算子替换
所有 vLLM 的 CUDA C++ kernel 被替换为 `torch_npu` 提供的 NPU 原生算子:
| 功能 | CUDA kernel | NPU 替换 |
|------|------------|---------|
| **RMSNorm** | `torch.ops._C.rms_norm` | `torch_npu.npu_rms_norm()` |
| **Fused Add+RMSNorm** | `torch.ops._C.fused_add_rms_norm` | `torch_npu.npu_add_rms_norm()` |
| **Rotary Embedding** | `torch.ops._C.rotary_embedding` | `torch_npu._npu_rotary_embedding()` |
| **SwiGLU 激活** | CUDA silu_and_mul | `torch_npu.npu_swiglu()` |
| **PagedAttention** | CUDA paged_attention kernel | `torch_npu._npu_paged_attention_splitfuse()` |
| **KV Cache 写入** | CUDA reshape_and_cache | `torch_npu._npu_reshape_and_cache()` |
### 2.3 自定义 Attention 后端
新增 `AscendAttentionBackend`,替代 FlashAttention/xFormers
- 使用 `torch_npu._npu_paged_attention_splitfuse()` 做 prefill + decode
- 自行构造 attention maskprefill 下三角decode 全1
- 管理 block table、sequence length 等元数据
### 2.4 旧方案的问题
- **无法升级**:所有改动散布在 vLLM 核心代码中,无法跟随上游更新
- **代码质量**:残留大量调试 print、注释掉的代码、未完成的 TODO
- **功能有限**仅单机推理Ray 分布式被注释掉
- **架构过时**:基于 vLLM V0 引擎
---
## 三、新方案vllm-npu-plugin做了什么
新方案基于社区开源的 `vllm-ascend` 插件架构,迁移到 vLLM v0.11.0 的 V1 引擎。
### 3.1 插件化架构
```
vllm (v0.11.0) vllm-npu-plugin
┌─────────────────────┐ ┌─────────────────────────┐
│ Platform Interface │◄──────────│ NPUPlatform │
│ (pluggable) │ register │ ├── set_device() │
│ │ │ ├── mem_get_info() │
│ ModelRegistry │◄──────────│ ├── check_config() │
│ (pluggable) │ register │ └── ... │
│ │ │ │
│ KVConnectorFactory │◄──────────│ Ascend 优化模型 │
│ (pluggable) │ register │ ├── Qwen2VL │
│ │ │ ├── DeepseekV3 │
│ │ │ └── ... │
└─────────────────────┘ │ │
│ NPUModelRunner │
│ NPUWorker │
│ AscendAttentionBackend │
│ Custom Ops │
│ Quantization │
│ Patch System │
└─────────────────────────┘
```
通过 `setup.py` 的 entry_points 注册:
```python
entry_points={
"vllm.platform_plugins": ["npu = vllm_npu:register"],
"vllm.general_plugins": [
"npu_enhanced_model = vllm_npu:register_model",
"npu_kv_connector = vllm_npu:register_connector",
],
}
```
### 3.2 主要功能模块
#### Attention 后端3 种)
| 后端 | 适用场景 |
|------|---------|
| **AscendAttentionBackend** | 通用注意力Qwen、LLaMA 等标准模型) |
| **AscendMLABackend** | DeepSeek 系列的 Multi-Latent Attention |
| **AscendSFABackend** | 稀疏 Flash AttentionDeepSeek V3.2 等) |
#### 自定义算子
- **AscendSiluAndMul** / **AscendQuickGELU** — 激活函数
- **AscendRotaryEmbedding** — 旋转位置编码
- **RMSNorm / LayerNorm** — 归一化层
- **AscendUnquantizedLinearMethod** — 线性层
- **FusedMoE** — MoE 专家混合层(含 MC2 通信优化)
#### Worker 与 Model Runner
- **NPUWorker** — NPU 设备管理、HCCL 通信初始化
- **NPUModelRunner** — 模型推理执行器,支持 chunked prefill
- ATB 扩展注册 + warmup 机制
- ACL Graph 捕获(等价于 CUDA Graph 的 NPU 实现)
#### 量化支持
| 方案 | 说明 |
|------|------|
| **W8A8** | INT8 权重 + INT8 激活,静态量化 |
| **W8A8_Dynamic** | 动态 per-channel/per-tensor 量化 |
| **W4A8_Dynamic** | INT4 权重 + INT8 激活 |
| **W4A4_FlatQuant** | Kronecker 量化 |
#### 分布式
- HCCL 通信后端(替代 NCCL
- Tensor Parallel / Expert Parallel
- EPLB 动态专家负载均衡
- PD 分离Prefill-Decode Disaggregation
#### 高级特性
- **Torchair 图编译** — NPU 图模式编译优化,缓存编译结果
- **MultiStream 重叠** — Attention 和 FFN 计算/通信流水线并行
- **推测解码** — NGram / Eagle / DeepSeek MTP
- **LoRA** — NPU 上的 Punica LoRA 实现
- **Sleep Mode** — 设备内存动态释放
#### Patch 系统
通过运行时 monkey-patch 修复 vLLM 主线与 NPU 的兼容问题:
- 每个 patch 标注了对应的上游 PR 和计划移除时间
- 分为平台级 patch注册时应用和 Worker 级 patch初始化时应用
### 3.3 支持的模型
已注册优化版本的模型:
| 模型 | 类型 |
|------|------|
| **Qwen2.5-7B-Instruct** | 文本 LLM已验证 ✅) |
| **Qwen2VL / Qwen2.5_VL** | 视觉语言模型 |
| **Qwen3VL / Qwen3VLMoe** | MoE 视觉语言模型 |
| **DeepseekV3.2** | 大规模 MoE 模型 |
| **PanguProMoE** | 华为盘古 MoE |
未注册优化版本的标准模型(如 LLaMA、Baichuan 等)也可以运行,只是走通用代码路径。
---
## 四、新旧方案对比
| 维度 | 旧方案0.2.7 fork | 新方案npu-plugin |
|------|---------------------|---------------------|
| **架构** | 侵入式 fork | 独立插件entry_points |
| **vLLM 版本** | 锁定 0.2.7 | 跟随 0.11.0V1 引擎) |
| **可升级性** | ❌ 无法跟随上游 | ✅ 独立升级 |
| **Attention** | 单一 AscendBackend | 3 种后端(通用/MLA/SFA |
| **算子** | 手动替换 ~6 个 | 完整算子库 + ATB 扩展 |
| **量化** | 无 | W8A8/W4A8/W4A4 |
| **分布式** | 单机Ray 被注释) | TP/EP/EPLB/PD分离 |
| **图优化** | 基础 NPU Graph | Torchair 图编译 + ACL Graph |
| **推测解码** | 无 | NGram/Eagle/MTP |
| **MoE 支持** | 无 | MC2 通信 + 动态负载均衡 |
| **多模态** | 无 | VL、Omni 模型支持 |
---
## 五、代码修改记录
在将 `vllm-ascend` 代码适配为 `vllm-npu-plugin` 的过程中,做了以下关键修改:
1. **全局命名空间替换**`vllm_ascend``vllm_npu`93 个文件)
2. **`utils.py`**
- `is_310p()` — 延迟初始化,避免 fork 时 NPU 冲突
- `sleep_mode_enabled()` — 异常安全的 fallback
- `vllm_version_is()` — 兼容开发版本号
3. **`models/layers/mla.py`**:用 try/except 替代版本号检查,兼容 dev 版本
4. **`worker/worker_v1.py`**:将 `init_ascend_soc_version()``__init__` 移到 `init_device()`,解决多进程 NPU 初始化冲突
5. **`setup.py`**:配置 entry_points 注册插件