一、模块概述

models目录是vLLM Ascend的模型注册中心,负责将NPU优化的模型注册到vLLM,使其可被加载和执行。

核心职责

  • 定义模型注册入口函数 register_model()
  • 将模型名称映射到具体的模型类
  • 支持多种模型架构(DeepSeek、Kimi、MiniMax、Qwen等)
  • 支持投机解码的草稿模型

一、模块上下游关系

models模块是vLLM Ascend插件的核心模块之一,它负责将NPU优化的模型注册到vLLM的模型注册表中。理解这个模块的关键在于明白它在什么时候被调用,以及它与其他模块如何协作。

1.1 调用时机

models模块的注册函数会在vLLM引擎启动时被自动调用。整个流程是这样的:首先vLLM启动并扫描已安装的插件,然后调用插件的register_model函数,最后将所有NPU优化的模型注册到全局的ModelRegistry中。这样当用户请求推理时,vLLM就能找到对应的NPU优化模型。

图1:models模块在什么时候被调用
sequenceDiagram
    participant User as 用户
    box rgb(255,243,205) 上游vLLM
    participant Engine as vLLM Engine
    participant Registry as ModelRegistry
    end
    box rgb(212,237,218) 本项目vllm-ascend
    participant Plugin as Ascend插件
    end
    
    Engine->>Plugin: 启动时调用register_model
    Plugin->>Registry: 注册模型
    Note over Registry: 所有模型已注册
    
    User->>Engine: 请求推理
    Engine->>Registry: 查找模型类
    Registry-->>Engine: 返回类路径
    Engine->>Engine: 动态导入并实例化
    Engine-->>User: 返回推理结果
                
关键源码位置
# 1. vLLM启动时调用插件注册(vllm/plugins/)
# 扫描已安装的插件,调用register函数

# 2. vllm-ascend插件注册(vllm_ascend/platform.py)
class NPUPlatform(Platform):
    def register():
        return NPUPlatform

# 3. 模型注册(vllm_ascend/models/__init__.py)
def register_model():
    ModelRegistry.register_model(
        "KimiLinearForCausalLM",
        "vllm_ascend.models.kimi_k3:AscendKimiLinearForCausalLM",
    )

# 4. vLLM查找模型(vllm/v1/engine/llm_engine.py)
model_cls_path = ModelRegistry.get_model_class(model_name)

1.2 与其他模块的关系

models模块与多个模块存在依赖关系。它依赖ops模块提供的自定义算子(如RMSNorm、激活函数等),依赖attention模块提供的注意力后端(如MLA、SFA等),还依赖quantization模块提供的量化支持。同时,models模块为worker模块提供模型类,worker模块负责实际执行推理。

图2:models模块的上下游关系
graph TD
    A[models模块] -->|提供模型类| B[worker模块]
    A -->|使用算子| C[ops模块]
    A -->|使用注意力| D[attention模块]
    A -->|使用量化| E[quantization模块]
    
    F[platform模块] -->|注册插件| A
    G[vLLM Engine] -->|调用注册| A
    
    B -->|执行推理| H[NPU设备]
    C -->|加速计算| H
    D -->|注意力计算| H
    
    style A fill:#667eea,color:#fff
    style B fill:#764ba2,color:#fff
    style C fill:#f093fb,color:#fff
    style D fill:#4facfe,color:#fff
    style E fill:#43e97b,color:#fff
                

1.3 数据流向

数据在模型加载和执行过程中的流向是:首先从HuggingFace的模型配置中获取model_type,然后在ModelRegistry中查找对应的类路径,接着动态导入模块并获取模型类,之后实例化模型并加载预训练权重,最后将模型对象传递给Worker模块执行推理。

图3:模型加载和执行的数据流向
graph LR
    A[HuggingFace配置] -->|model_type| B[ModelRegistry]
    B -->|类路径| C[动态导入]
    C -->|模型类| D[实例化模型]
    D -->|加载权重| E[预训练权重]
    D -->|模型对象| F[Worker]
    F -->|前向传播| G[NPU执行]
    G -->|输出| H[推理结果]
                

1.4 完整生命周期

模型的完整生命周期从开发者编写模型代码开始,经过注册、加载、执行等多个阶段。注册阶段将模型添加到ModelRegistry中;加载阶段根据用户指定的模型名称查找并实例化模型;执行阶段接收推理请求并进行前向传播;最后模型可以被多次复用执行推理。

图4:模型的完整生命周期
sequenceDiagram
    participant Dev as 开发者
    participant User as 用户
    box rgb(255,243,205) 上游vLLM
    participant Reg as ModelRegistry
    participant Worker as Worker
    end
    participant NPU as NPU设备
    
    Dev->>Reg: 编写并注册模型
    Note over Reg: 模型已注册
    
    User->>Worker: 请求推理
    Worker->>Reg: 查找模型类
    Reg-->>Worker: 返回类路径
    Worker->>Worker: 动态导入并加载权重
    
    loop 多次推理
        User->>Worker: 发送推理请求
        Worker->>NPU: 前向传播
        NPU-->>Worker: 输出结果
        Worker-->>User: 返回推理结果
    end
                
关键源码位置
# 1. 模型注册(vllm_ascend/models/__init__.py)
def register_model():
    ModelRegistry.register_model("模型名称", "模块路径:类名")

# 2. ModelRegistry存储(vllm/models/registry.py)
class ModelRegistry:
    _models = {}  # 存储模型名称到类路径的映射
    
    @staticmethod
    def get_model_class(model_name):
        return _models.get(model_name)

# 3. Worker查找并加载模型(vllm/v1/worker/gpu_worker.py)
class Worker:
    def load_model(self, model_name):
        model_cls_path = ModelRegistry.get_model_class(model_name)
        # 动态导入并实例化
        model = import_and_instantiate(model_cls_path)
        return model

# 4. NPU上前向传播(vllm_ascend/worker/model_runner_v1.py)
class NPUModelRunner:
    def execute(self, input_ids):
        return self.model(input_ids)

1.5 时序图详解

下面的时序图详细展示了从vLLM启动到完成一次推理请求的完整过程。可以看到,models模块在启动阶段完成注册,在推理阶段提供模型类给Worker使用。

图5:完整调用时序图
sequenceDiagram
    participant U as 用户
    box rgb(255,243,205) 上游vLLM
    participant E as vLLM Engine
    participant R as ModelRegistry
    participant W as Worker
    end
    box rgb(212,237,218) 本项目vllm-ascend
    participant P as Ascend插件
    participant M as 模型类
    end
    participant N as NPU
    
    E->>P: 初始化插件
    P->>R: 调用register_model()
    
    U->>E: 发送推理请求
    E->>W: 创建Worker
    W->>R: 查找模型
    R-->>W: 返回类路径
    W->>M: 动态导入并实例化
    M->>M: 加载权重
    W->>N: 执行推理
    N-->>W: 返回结果
    W-->>U: 返回推理结果
                
完整调用链源码位置
# 1. vLLM Engine初始化(vllm/v1/engine/llm_engine.py)
class LLMEngine:
    def __init__(self, vllm_config):
        # 初始化插件,调用register_model
        self.executor = Executor(vllm_config)

# 2. 插件注册(vllm_ascend/platform.py)
class NPUPlatform(Platform):
    @staticmethod
    def register():
        return NPUPlatform

# 3. 模型注册(vllm_ascend/models/__init__.py)
def register_model():
    ModelRegistry.register_model("模型名", "模块:类")

# 4. Worker加载模型(vllm/v1/worker/gpu_worker.py)
class Worker:
    def init_device(self):
        model_cls = ModelRegistry.get_model_class(model_name)
        self.model = model_cls(config)

# 5. NPU执行推理(vllm_ascend/worker/model_runner_v1.py)
class NPUModelRunner:
    def execute(self, input_ids):
        return self.model(input_ids)

二、文件结构

models/
├── __init__.py              # 模型注册入口(核心文件)
├── deepseek_v4/            # DeepSeek V4模型目录
│   ├── model.py           # 主模型实现
│   ├── mtp.py             # 多token预测模型
│   └── dspark.py          # DSpark草稿模型
├── deepseek_mtp.py         # DeepSeek MTP实现
├── minimax_m3/             # MiniMax M3模型目录
├── kimi_k3.py              # Kimi K3主模型
├── kimi_k3_mtp.py          # Kimi K3 MTP模型
├── kimi_k3_dspark.py       # Kimi K3 DSpark草稿模型
├── qwen3_dspark.py         # Qwen3 DSpark草稿模型
├── qwen3_dflash2.py        # Qwen3 DFlash2草稿模型
├── llama_eagle3.py         # LLaMA Eagle3草稿模型
├── llama_eagle3_vwn.py     # LLaMA Eagle3 VWN变体
└── layer/                  # 共享层实现

三、注册机制详解

3.1 注册流程

图6:模型注册完整流程
graph TD
    A[vLLM启动] --> B[调用插件register_model]
    B --> C[遍历所有模型]
    C --> D[调用ModelRegistry.register_model]
    D --> E[存储模型名称和类路径映射]
    E --> F[用户请求模型时]
    F --> G[根据名称查找类路径]
    G --> H[动态导入模型类]
    H --> I[实例化模型]
                

3.2 register_model() 函数

vllm_ascend/models/__init__.py
from vllm import ModelRegistry

# 这是模型注册的入口函数
# vLLM启动时会自动调用此函数
def register_model():
    # 注册Kimi K3因果语言模型
    # 参数1: 模型名称(用于HuggingFace配置匹配)
    # 参数2: 模型类的完整路径(用于动态导入)
    ModelRegistry.register_model(
        "KimiLinearForCausalLM",  # 模型名称
        "vllm_ascend.models.kimi_k3:AscendKimiLinearForCausalLM",  # 类路径
    )

关键点

模型名称:必须与HuggingFace模型配置中的 model_type 或架构名称匹配。
类路径:格式为 模块路径:类名,vLLM会动态导入这个类。

四、模型注册详解

4.1 Kimi K3 系列

vllm_ascend/models/__init__.py - Kimi K3注册
# KimiLinearForCausalLM - 主模型
# 用于文本生成任务
ModelRegistry.register_model(
    "KimiLinearForCausalLM",
    "vllm_ascend.models.kimi_k3:AscendKimiLinearForCausalLM",
)

# KimiK3ForCausalLM - 兼容性别名
# 用于旧版本checkpoint的兼容
ModelRegistry.register_model(
    "KimiK3ForCausalLM",
    "vllm_ascend.models.kimi_k3:AscendKimiLinearForCausalLM",
)

# KimiK3ForConditionalGeneration - 条件生成模型
# 用于多模态任务(如图文理解)
ModelRegistry.register_model(
    "KimiK3ForConditionalGeneration",
    "vllm_ascend.models.kimi_k3:AscendKimiK3ForConditionalGeneration",
)

4.2 DeepSeek V4 系列

vllm_ascend/models/__init__.py - DeepSeek V4注册
# DeepseekV4ForCausalLM - DeepSeek V4主模型
# 支持MLA多头潜在注意力
ModelRegistry.register_model(
    "DeepseekV4ForCausalLM",
    "vllm_ascend.models.deepseek_v4.model:AscendDeepseekV4ForCausalLM",
)

# DeepSeekV4MTPModel - 多token预测模型
# 用于投机解码的草稿模型
ModelRegistry.register_model(
    "DeepSeekV4MTPModel",
    "vllm_ascend.models.deepseek_v4.mtp:DeepSeekV4MTP",
)

# DSparkDraftModel - DSpark草稿模型
# 用于分布式投机解码
ModelRegistry.register_model(
    "DSparkDraftModel",
    "vllm_ascend.models.deepseek_v4.dspark:DSparkDeepseekV4ForCausalLM",
)

4.3 MiniMax M3 系列

vllm_ascend/models/__init__.py - MiniMax M3注册
# MiniMaxM3SparseForCausalLM - 稀疏模型
# 使用MoE混合专家架构
ModelRegistry.register_model(
    "MiniMaxM3SparseForCausalLM",
    "vllm_ascend.models.minimax_m3:MiniMaxM3SparseForCausalLM",
)

# MiniMaxM3SparseForConditionalGeneration - 条件生成
# 用于多模态任务
ModelRegistry.register_model(
    "MiniMaxM3SparseForConditionalGeneration",
    "vllm_ascend.models.minimax_m3:MiniMaxM3SparseForConditionalGeneration",
)

4.4 投机解码模型

vllm_ascend/models/__init__.py - 投机解码模型注册
# DeepSeekMTPModel - DeepSeek多token预测
# 用于Eagle3投机解码
ModelRegistry.register_model(
    "DeepSeekMTPModel",
    "vllm_ascend.models.deepseek_mtp:AscendDeepSeekMTP",
)

# Qwen3DSparkModel - Qwen3 DSpark模型
# 用于Qwen3的分布式投机解码
ModelRegistry.register_model(
    "Qwen3DSparkModel",
    "vllm_ascend.models.qwen3_dspark:AscendQwen3DSparkForCausalLM",
)

# DFlash2DraftModel - DFlash2草稿模型
# 用于Qwen3的Flash投机解码
ModelRegistry.register_model(
    "DFlash2DraftModel",
    "vllm_ascend.models.qwen3_dflash2:DFlash2Qwen3ForCausalLM",
)

# Eagle3LlamaForCausalLM - LLaMA Eagle3
# 用于LLaMA模型的Eagle3投机解码
ModelRegistry.register_model(
    "Eagle3LlamaForCausalLM",
    "vllm_ascend.models.llama_eagle3:AscendEagle3LlamaForCausalLM",
)

五、模型分类

models模块中注册的模型按用途可以分为三大类:主模型(CausalLM)、条件生成模型(ConditionalGeneration)和投机解码模型(MTP/DSpark/Draft)。主模型用于标准的文本生成任务;条件生成模型用于多模态任务,如图文理解;投机解码模型用于加速推理,通过草稿模型预测多个token,然后由主模型验证。

图7:第一层 - 按用途分类
graph TD
    A[已注册模型] --> B[主模型]
    A --> C[条件生成模型]
    A --> D[投机解码模型]
    
    B -->|标准生成| B1[文本生成]
    C -->|多模态| C1[图文理解]
    D -->|加速推理| D1[草稿预测+验证]
                
图8:第二层 - 按模型系列分类
graph TD
    B[主模型] --> B1[Kimi系列]
    B --> B2[DeepSeek系列]
    B --> B3[MiniMax系列]
    
    C[条件生成模型] --> C1[Kimi系列]
    C --> C2[MiniMax系列]
    
    D[投机解码模型] --> D1[Kimi系列]
    D --> D2[DeepSeek系列]
    D --> D3[Qwen系列]
    D --> D4[LLaMA系列]
                

图9:第三层 - 具体模型函数

主模型(CausalLM)

模型名称 类路径 说明
KimiLinearForCausalLM kimi_k3:AscendKimiLinearForCausalLM Kimi K3主模型
KimiK3ForCausalLM kimi_k3:AscendKimiLinearForCausalLM Kimi K3兼容别名
DeepseekV4ForCausalLM deepseek_v4.model:AscendDeepseekV4ForCausalLM DeepSeek V4主模型
MiniMaxM3SparseForCausalLM minimax_m3:MiniMaxM3SparseForCausalLM MiniMax M3稀疏模型

条件生成模型(ConditionalGeneration)

模型名称 类路径 说明
KimiK3ForConditionalGeneration kimi_k3:AscendKimiK3ForConditionalGeneration Kimi K3多模态
MiniMaxM3SparseForConditionalGeneration minimax_m3:MiniMaxM3SparseForConditionalGeneration MiniMax M3多模态

投机解码模型(MTP/DSpark/Draft)

模型名称 类路径 说明
KimiK3MTPModel kimi_k3_mtp:AscendKimiK3MTP Kimi K3 MTP
K3DSparkModel kimi_k3_dspark:AscendK3DSparkForCausalLM Kimi K3 DSpark
DeepSeekV4MTPModel deepseek_v4.mtp:DeepSeekV4MTP DeepSeek V4 MTP
DSparkDraftModel deepseek_v4.dspark:DSparkDeepseekV4ForCausalLM DeepSeek V4 DSpark
DeepSeekMTPModel deepseek_mtp:AscendDeepSeekMTP DeepSeek MTP
DeepseekV32MTPModel deepseek_mtp:AscendDeepSeekMTP DeepSeek V32 MTP
GlmMoeDsaForCausalLM deepseek_mtp:AscendGlmMoeDsaForCausalLM GLM MoE DSA
Qwen3DSparkModel qwen3_dspark:AscendQwen3DSparkForCausalLM Qwen3 DSpark
DFlash2DraftModel qwen3_dflash2:DFlash2Qwen3ForCausalLM Qwen3 DFlash2
Eagle3LlamaForCausalLM llama_eagle3:AscendEagle3LlamaForCausalLM LLaMA Eagle3
LlamaForCausalLMVwnEagle3 llama_eagle3_vwn:Eagle3VwnLlamaForCausalLM LLaMA Eagle3 VWN

六、模型加载流程

模型加载是models模块的核心功能之一。当用户指定一个模型名称时,vLLM会按照以下流程加载模型:首先在ModelRegistry中查找模型名称对应的类路径,然后使用Python的importlib动态导入模块,接着获取模型类并实例化,最后加载预训练权重完成模型初始化。

图10:模型加载完整流程
graph LR
    A[用户请求模型] --> B[查找注册表]
            B --> C{找到模型?}
            C -->|是| D[获取类路径]
            C -->|否| E[报错: 模型不支持]
            D --> F[动态导入模块]
            F --> G[获取模型类]
            G --> H[实例化模型]
            H --> I[加载权重]
            I --> J[模型就绪]
                
图11:模型加载时序图
sequenceDiagram
    participant U as 用户
    box rgb(255,243,205) 上游vLLM
    participant E as vLLM Engine
    participant R as ModelRegistry
    end
    box rgb(212,237,218) 本项目vllm-ascend
    participant M as 模型模块
    end
    participant W as 权重文件
    
    U->>E: 指定模型名称
    E->>R: 查找模型
    R-->>E: 返回类路径
    E->>M: 动态导入
    M-->>E: 返回模型类
    E->>M: 实例化模型
    E->>W: 加载预训练权重
    W-->>E: 返回权重
    E-->>U: 模型就绪
                
模型加载关键源码
# 1. ModelRegistry查找(vllm/models/registry.py)
class ModelRegistry:
    @staticmethod
    def get_model_class(model_name):
        # 返回类路径字符串,如 "vllm_ascend.models.kimi_k3:AscendKimiLinearForCausalLM"
        return _models[model_name]

# 2. 动态导入(vllm/v1/worker/gpu_worker.py)
import importlib
module_path, class_name = model_cls_path.split(":")
module = importlib.import_module(module_path)
model_cls = getattr(module, class_name)

# 3. 实例化模型(vllm_ascend/models/kimi_k3.py)
class AscendKimiLinearForCausalLM(torch.nn.Module):
    def __init__(self, config):
        super().__init__()
        self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size)
        self.layers = nn.ModuleList([...])
        self.norm = RMSNorm(config.hidden_size)

# 4. 加载权重(vllm_ascend/models/kimi_k3.py)
def load_weights(self, weights_path):
    state_dict = torch.load(weights_path)
    self.load_state_dict(state_dict)

加载步骤详解

  • 步骤1:用户指定模型名称(如 "KimiLinearForCausalLM")
  • 步骤2:在ModelRegistry中查找对应的类路径
  • 步骤3:使用Python的importlib动态导入模块
  • 步骤4:从模块中获取模型类
  • 步骤5:实例化模型并加载预训练权重
  • 步骤6:模型可用于推理

七、模型类结构

每个模型类都继承自torch.nn.Module,包含初始化函数和前向传播函数。初始化函数负责定义模型的各个层(如嵌入层、注意力层、FFN层等),前向传播函数负责定义数据在这些层之间的流动方式。不同模型的结构可能有所不同,但基本框架是相似的。

图12:模型类继承关系
graph TD
    A[torch.nn.Module] --> B[基座模型类]
    B --> C[AscendKimiLinearForCausalLM]
    B --> D[AscendDeepseekV4ForCausalLM]
    B --> E[AscendMiniMaxM3SparseForCausalLM]
    B --> F[AscendQwen3DSparkForCausalLM]
                
图13:模型类内部结构
graph LR
    A[模型类] --> B[__init__ 初始化]
    A --> C[forward 前向传播]
    
    B --> B1[嵌入层 Embedding]
    B --> B2[注意力层 Attention]
    B --> B3[FFN层 FeedForward]
    B --> B4[归一化层 RMSNorm]
    
    C --> C1[输入嵌入]
    C --> C2[循环处理每层]
    C --> C3[输出归一化]
                
图14:不同模型的功能对比
graph LR
    A[模型功能] --> B[注意力机制]
    A --> C[稀疏计算]
    A --> D[投机解码]
    
    B --> B1[MLA 多头潜在注意力]
    B --> B2[标准MHA]
    
    C --> C1[MoE 混合专家]
    C --> C2[动态稀疏]
    
    D --> D1[MTP 多token预测]
    D --> D2[DSpark]
    D --> D3[Draft]
                
模型类基本结构(以Kimi K3为例)
class AscendKimiLinearForCausalLM(torch.nn.Module):
    """Kimi K3因果语言模型的NPU优化实现"""
    
    def __init__(self, config):
        super().__init__()
        # 初始化模型层
        self.embed_tokens = nn.Embedding(...)
        self.layers = nn.ModuleList([...])
        self.norm = RMSNorm(...)
        
    def forward(self, input_ids, positions, ...):
        # 前向传播
        hidden_states = self.embed_tokens(input_ids)
        for layer in self.layers:
            hidden_states = layer(hidden_states, ...)
        return hidden_states

八、完整源码

models/__init__.py文件是models模块的入口文件,它定义了register_model函数,该函数负责将所有NPU优化的模型注册到vLLM的ModelRegistry中。每个注册调用包含两个参数:模型名称和类路径(格式为"模块路径:类名")。

图15:源码模块结构
graph LR
    A[models/__init__.py] --> B[register_model函数]
    
    B --> C[Kimi系列注册]
    B --> D[DeepSeek系列注册]
    B --> E[MiniMax系列注册]
    B --> F[Qwen系列注册]
    B --> G[LLaMA系列注册]
    
    C --> C1[KimiLinearForCausalLM]
    C --> C2[KimiK3ForCausalLM]
    C --> C3[KimiK3ForConditionalGeneration]
    C --> C4[KimiK3MTPModel]
    C --> C5[K3DSparkModel]
    
    D --> D1[DeepseekV4ForCausalLM]
    D --> D2[DeepSeekV4MTPModel]
    D --> D3[DSparkDraftModel]
    D --> D4[DeepSeekMTPModel]
    D --> D5[DeepseekV32MTPModel]
    D --> D6[GlmMoeDsaForCausalLM]
    
    E --> E1[MiniMaxM3SparseForCausalLM]
    E --> E2[MiniMaxM3SparseForConditionalGeneration]
    
    F --> F1[Qwen3DSparkModel]
    F --> F2[DFlash2DraftModel]
    
    G --> G1[Eagle3LlamaForCausalLM]
    G --> G2[LlamaForCausalLMVwnEagle3]
                
图16:类路径解析流程
graph LR
    A[类路径字符串] -->|分割| B[模块路径]
    A -->|分割| C[类名]
    
    B -->|动态导入| D[Python模块]
    D -->|获取类| E[模型类对象]
    
    E -->|注册| F[ModelRegistry]
                
vllm_ascend/models/__init__.py - 完整源码
from vllm import ModelRegistry


def register_model():
    # ==================== Kimi K3 系列 ====================
    # 主模型:用于文本生成
    ModelRegistry.register_model(
        "KimiLinearForCausalLM",
        "vllm_ascend.models.kimi_k3:AscendKimiLinearForCausalLM",
    )
    # 兼容性别名:用于旧版本checkpoint
    ModelRegistry.register_model(
        "KimiK3ForCausalLM",
        "vllm_ascend.models.kimi_k3:AscendKimiLinearForCausalLM",
    )
    # 条件生成模型:用于多模态任务
    ModelRegistry.register_model(
        "KimiK3ForConditionalGeneration",
        "vllm_ascend.models.kimi_k3:AscendKimiK3ForConditionalGeneration",
    )
    # MTP模型:用于投机解码
    ModelRegistry.register_model(
        "KimiK3MTPModel",
        "vllm_ascend.models.kimi_k3_mtp:AscendKimiK3MTP",
    )
    # DSpark草稿模型:用于分布式投机解码
    ModelRegistry.register_model(
        "K3DSparkModel",
        "vllm_ascend.models.kimi_k3_dspark:AscendK3DSparkForCausalLM",
    )

    # ==================== DeepSeek V4 系列 ====================
    # 主模型:支持MLA多头潜在注意力
    ModelRegistry.register_model(
        "DeepseekV4ForCausalLM",
        "vllm_ascend.models.deepseek_v4.model:AscendDeepseekV4ForCausalLM",
    )
    # MTP模型:用于投机解码
    ModelRegistry.register_model(
        "DeepSeekV4MTPModel",
        "vllm_ascend.models.deepseek_v4.mtp:DeepSeekV4MTP",
    )
    # DSpark草稿模型:用于分布式投机解码
    ModelRegistry.register_model(
        "DSparkDraftModel",
        "vllm_ascend.models.deepseek_v4.dspark:DSparkDeepseekV4ForCausalLM",
    )

    # ==================== MiniMax M3 系列 ====================
    # 稀疏模型:使用MoE混合专家架构
    ModelRegistry.register_model(
        "MiniMaxM3SparseForCausalLM",
        "vllm_ascend.models.minimax_m3:MiniMaxM3SparseForCausalLM",
    )
    # 条件生成模型:用于多模态任务
    ModelRegistry.register_model(
        "MiniMaxM3SparseForConditionalGeneration",
        "vllm_ascend.models.minimax_m3:MiniMaxM3SparseForConditionalGeneration",
    )

    # ==================== 投机解码模型 ====================
    # DeepSeek MTP:用于Eagle3投机解码
    ModelRegistry.register_model(
        "DeepSeekMTPModel",
        "vllm_ascend.models.deepseek_mtp:AscendDeepSeekMTP",
    )
    ModelRegistry.register_model(
        "DeepseekV32MTPModel",
        "vllm_ascend.models.deepseek_mtp:AscendDeepSeekMTP",
    )
    ModelRegistry.register_model(
        "GlmMoeDsaForCausalLM",
        "vllm_ascend.models.deepseek_mtp:AscendGlmMoeDsaForCausalLM",
    )
    # LLaMA Eagle3:用于LLaMA的投机解码
    ModelRegistry.register_model(
        "LlamaForCausalLMVwnEagle3",
        "vllm_ascend.models.llama_eagle3_vwn:Eagle3VwnLlamaForCausalLM",
    )
    ModelRegistry.register_model(
        "Eagle3LlamaForCausalLM",
        "vllm_ascend.models.llama_eagle3:AscendEagle3LlamaForCausalLM",
    )
    # Qwen3 DSpark:用于Qwen3的分布式投机解码
    ModelRegistry.register_model(
        "Qwen3DSparkModel",
        "vllm_ascend.models.qwen3_dspark:AscendQwen3DSparkForCausalLM",
    )
    # Qwen3 DFlash2:用于Qwen3的Flash投机解码
    ModelRegistry.register_model(
        "DFlash2DraftModel",
        "vllm_ascend.models.qwen3_dflash2:DFlash2Qwen3ForCausalLM",
    )

九、最佳实践

在使用models模块时,有一些最佳实践需要遵循。首先,注册模型时要确保模型名称的唯一性,避免重复注册;其次,类路径要使用绝对路径,确保动态导入的正确性;最后,要为每个模型添加清晰的注释,说明模型的用途和特点。

图17:模型注册最佳实践流程
graph LR
    A[开始注册新模型] --> B[定义模型名称]
    B --> C[确定类路径]
    C --> D[添加注释说明]
    D --> E[调用register_model]
    E --> F{注册成功?}
    F -->|是| G[完成注册]
    F -->|否| H[检查名称唯一性]
    H --> I[检查类路径正确性]
    I --> E
                
图18:模型选择决策流程
graph TD
    A[用户需求] --> B{任务类型?}
    
    B -->|文本生成| C[选择主模型]
    B -->|多模态| D[选择条件生成模型]
    B -->|加速推理| E[选择投机解码模型]
    
    C --> C1{模型系列?}
    C1 -->|Kimi| C2[KimiLinearForCausalLM]
    C1 -->|DeepSeek| C3[DeepseekV4ForCausalLM]
    C1 -->|MiniMax| C4[MiniMaxM3SparseForCausalLM]
    
    D --> D1{模型系列?}
    D1 -->|Kimi| D2[KimiK3ForConditionalGeneration]
    D1 -->|MiniMax| D3[MiniMaxM3SparseForConditionalGeneration]
    
    E --> E1{加速方案?}
    E1 -->|MTP| E2[DeepSeekV4MTPModel]
    E1 -->|DSpark| E3[DSparkDraftModel]
    E1 -->|Eagle3| E4[Eagle3LlamaForCausalLM]
                
图19:调试和排错流程
graph LR
    A[模型加载失败] --> B[检查模型名称]
    B --> C{名称正确?}
    C -->|否| D[修改模型名称]
    C -->|是| E[检查类路径]
    
    E --> F{类路径正确?}
    F -->|否| G[修正类路径]
    F -->|是| H[检查模块导入]
    
    H --> I{导入成功?}
    I -->|否| J[检查依赖安装]
    I -->|是| K[检查模型类定义]
    
    K --> L{类定义正确?}
    L -->|否| M[修正模型类]
    L -->|是| N[检查权重文件]
                

注册新模型步骤

  1. 在models目录下创建模型实现文件
  2. 在__init__.py的register_model函数中添加注册调用
  3. 确保模型名称全局唯一
  4. 使用完整的类路径(模块路径:类名)
  5. 添加注释说明模型用途
  6. 测试模型加载和推理

常见问题及解决方案

  • 问题1:模型名称重复 - 解决:检查并修改模型名称
  • 问题2:类路径错误 - 解决:检查模块路径和类名是否正确
  • 问题3:模块导入失败 - 解决:检查依赖是否安装,路径是否正确
  • 问题4:模型类不存在 - 解决:检查模型类是否正确定义和导出
首页