vllm-ascend

vllm-ascend 与 vllm 的关系

一句话总结:vllm-ascend 是 vllm 的硬件插件(out-of-tree platform plugin),通过 Python entry_points 机制注入,覆盖 GPU 相关的算子/调度/通信层,复用 vllm 的 API 服务、模型定义、请求管理等上层逻辑。


各模块的职责分工

模块 归属 说明
API Server vllm OpenAI 兼容的 HTTP 服务,vllm serve 启动,vllm-ascend 不做任何修改
请求管理/Tokenization vllm 请求接收、分词、结构化输出等
Scheduler 调度 vllm(默认) vllm 的 v1/core/sched/scheduler.py,平台无关的请求调度、KV cache 管理
Scheduler 扩展 vllm-ascend(可选) SchedulerDynamicBatch(动态batch调整SLO)、RecomputeScheduler(PD分离场景重计算),均继承自 vllm Scheduler
Worker vllm-ascend NPUWorker 继承 WorkerBase,覆盖设备初始化(torch.npu)、内存管理(CaMemAllocator)、模型加载等
ModelRunner vllm-ascend NPUModelRunner 继承 GPUModelRunner,覆盖执行逻辑、添加 ACL Graph、EPLB 等
算子/Kernels vllm-ascend attention backend、sampler、rotary embedding、MoE、layernorm、linear 等全部替换为 NPU 实现
分布式通信 vllm-ascend HCCL 替代 NCCL,自定义 communicator
图编译 vllm-ascend ACL Graph 替代 CUDA Graph,自定义编译后端和 fusion pass
模型定义 vllm 模型结构定义(LLaMA、Qwen 等)来自 vllm,vllm-ascend 通过 patch 机制修改部分 forward 方法
LoRA vllm-ascend PunicaWrapperNPU 替代 GPU 版本

三大集成机制

1. Entry Point 注册(主要机制)

setup.py 声明了入口点:

1
2
"vllm.platform_plugins": ["ascend = vllm_ascend:register"]
"vllm.general_plugins": ["ascend_kv_connector = ...", "ascend_model_loader = ...", ...]

vllm 启动时通过 importlib.metadata.entry_points() 自动发现,调用 register() 返回 "vllm_ascend.platform.NPUPlatform",实例化为 current_platform。之后所有设备相关行为都通过 NPUPlatform 的方法覆盖路由到 vllm-ascend 的实现。

2. 配置字符串覆盖

NPUPlatform.check_and_update_config() 设置关键类路径:

  • parallel_config.worker_cls = "vllm_ascend.worker.worker.NPUWorker"
  • scheduler_config.scheduler_cls = "vllm_ascend.core.scheduler_dynamic_batch.SchedulerDynamicBatch"(可选)
  • Attention backend、communicator、graph wrapper 等同理

vllm 通过 resolve_obj_by_qualname() 动态导入这些类。

3. Monkey-Patch(补充机制)

对于 vllm 没有提供插桩接口的地方(特定模型的 forward、triton ops、分布式 ops 等),vllm-ascend 通过 patch/ 目录的猴子补丁修改:

  • patch/platform/:启动时全局应用(29个文件)
  • patch/worker/:每个 worker 初始化时应用(25+个文件)

启动流程

1
2
3
4
5
6
7
8
9
10
用户: vllm serve <model>
  → vllm CLI (entrypoints/cli/main.py)
    → 加载 general_plugins (注册 KV connector、model loader 等)
    → 访问 current_platform → 触发平台发现 → 实例化 NPUPlatform
    → 构建 VllmConfig → NPUPlatform.check_and_update_config()
      → 设置 worker_cls、attn_backend、scheduler_cls 等
    → Executor 创建 WorkerWrapperBase
      → 动态导入 NPUWorker → 初始化 torch.npu 设备
        → 创建 NPUModelRunner → 执行模型推理
    → 启动 uvicorn HTTP 服务 (OpenAI API)

如何学习这两个代码库

第一步:理解 vllm 的核心流程(建议按以下顺序)

  1. API 层vllm/entrypoints/openai/api_server.py — 看请求怎么进来的
  2. Engine 层vllm/v1/engine/AsyncLLM 如何协调 scheduler 和 executor
  3. Schedulervllm/v1/core/sched/scheduler.py — 请求排队、prefill/decode 调度、KV cache 管理
  4. Executorvllm/v1/executor/ — 如何创建和管理 worker 进程
  5. Workervllm/v1/worker/gpu_worker.py + gpu_model_runner.py — 模型加载和执行
  6. Platform 抽象vllm/platforms/interface.py — 理解 Platform 基类的所有方法

第二步:理解 vllm-ascend 的注入点

  1. vllm_ascend/__init__.pyregister() 函数,入口
  2. vllm_ascend/platform.py — 最重要的文件,NPUPlatform 的每个方法都是一个注入点,看它改了什么配置
  3. vllm_ascend/worker/worker.pyNPUWorker,对比 GPUWorker 看差异
  4. vllm_ascend/worker/model_runner_v1.pyNPUModelRunner,对比 GPUModelRunner
  5. vllm_ascend/ops/ — 算子替换,这是性能关键
  6. vllm_ascend/patch/ — 最后看,理解哪些地方不得不 monkey-patch

第三步:对比阅读法

对于每个模块,先读 vllm 的 GPU 版本,再读 vllm-ascend 的 NPU 版本,关注:

  • 哪些方法是直接覆盖的(override)
  • 哪些是通过配置字符串替换的
  • 哪些是通过 monkey-patch 修改的
  • 这三种方式中,配置字符串 > 方法覆盖 > monkey-patch,优先级递减

关键文件速查

你想了解的 vllm 文件 vllm-ascend 文件
平台注册 platforms/__init__.py __init__.py + platform.py
Worker v1/worker/gpu_worker.py worker/worker.py
ModelRunner v1/worker/gpu_model_runner.py worker/model_runner_v1.py
Attention attention/backends/ attention/attention_v1.py
算子 model_executor/layers/ ops/
图编译 compiler/ compilation/acl_graph.py
调度 v1/core/sched/ core/scheduler_dynamic_batch.py