Transformers库分析

一、Transformers库源码分析

https://github.com/huggingface/transformers/tree/main/src/transformers/models/qwen3_vl

这个代码文件 (modeling_deepseek_v3.py) 是 DeepSeek-V3 大语言模型的核心神经网络实现。它的核心作用是为 DeepSeek-V3 模型提供一个可加载、可运行且可定制的 PyTorch 模块

为了更直观地理解其核心架构与功能,下图展示了该代码定义的主要组件及其协作关系:

flowchart TD
    A[输入 Input<br>(Token IDs)] --> B[Embedding<br>词嵌入层]
    B --> C[Transformer Blocks<br>× N层]
    
    subgraph C[单个Transformer块]
        C1[Attention<br>自注意力机制]
        C2[Feed Forward<br>前馈神经网络]
        C1 --> C2
    end

    C --> D[输出 Output<br>(Logits)]
    
    B -- 传递位置信息 --> C1
    C1 -- 残差连接 --> C1
    C2 -- 残差连接 --> C2

具体来说,它的作用体现在以下几个关键方面:


1. 定义模型架构 (Model Architecture)

这是代码最核心的作用。它用 PyTorch 的 nn.Module 定义了 DeepSeek-V3 模型的完整神经网络结构。这包括:

  • 嵌入层:将输入的词汇ID转换为高维向量。
  • Transformer 层堆叠:模型的核心,由数十甚至上百层相同的解码器块组成。每一层都包含:
    • 自注意力机制:让模型能够关注到输入序列中所有位置的信息。
    • 前馈神经网络:对注意力机制的输出进行非线性变换。
  • 输出层:将最终的隐藏状态转换为词汇表上的概率分布,用于预测下一个词。

2. 实现前向传播 (Forward Pass)

代码中的 forward 方法详细规定了输入数据(如 token IDs)如何一步步通过整个网络,最终得到输出(预测的下一个 token 的概率)。这个过程包括了:

  • 计算注意力权重
  • 应用残差连接和层归一化
  • 应用激活函数

3. 支持不同使用场景

该文件通常不会只定义一个类,而是会提供多个类以适应不同的任务,例如:

  • DeepSeekV3Model仅输出模型的隐藏状态,适用于需要获取文本表示的特征,而不是直接生成文本的场景。
  • DeepSeekV3ForCausalLM:在基础模型之上增加了一个语言模型头,用于因果语言建模。这是用于文本生成的主要类,也是像 ChatGPT 这样进行对话和续写任务的核心。
  • 可能还包括 DeepSeekV3ForSequenceClassification 等,用于适配分类等下游任务。

4. 加载预训练权重

该代码的结构与 DeepSeek 官方发布的预训练模型权重完全对齐。Hugging Face 的 from_pretrained() 方法可以精确地将下载的权重加载到这个模型中,让你能直接运行一个已经具备强大能力的模型,而无需从零开始训练。


5. 提供自定义和微调的接口

由于代码是完全开源的,开发者可以:

  • 查看其实现细节:理解模型的所有技术细节。
  • 修改架构:例如尝试不同的注意力机制、归一化方式等,用于研究目的。
  • 进行微调:在特定数据集上对预训练模型进行微调,以适应特定领域或任务。

总结

总而言之,modeling_deepseek_v3.py 的作用是:

将 DeepSeek-V3 模型的数学架构和预训练参数“翻译”成 PyTorch 能够理解和执行的代码,从而让研究者和开发者能够轻松地加载、运行、研究、定制和微调这个先进的大语言模型。

它就像是 DeepSeek-V3 这个“大脑”的蓝图和说明书,没有这份代码,发布的模型权重就只是一堆无法使用的数字。

二、除了使用 Hugging Face transformers 库,还有多种加载和使用模型的方式。

以下是几种主流且重要的替代方案,我将它们分为几类以便你理解:

1. 原生态加载(使用模型官方代码库)

这是最直接的方式,直接使用模型发布方提供的原始代码和权重。

  • 描述:Qwen、LLaMA、ChatGLM 等大部分主流模型都会在发布时提供自己独立的代码库。这些库通常包含了最原汁原味的实现,有时会包含一些 transformers 库尚未集成的最新特性或优化。
  • 优点:可能最先支持新功能,与论文实现最接近。
  • 缺点:需要单独安装依赖,不同模型的用法可能差异很大,迁移成本高。
  • 示例(以 Qwen2.5-VL 为例)
    1. 克隆官方仓库:
    git clone https://github.com/QwenLM/Qwen2.5-VL.git
    cd Qwen2.5-VL
    
    1. 按照仓库的 README.md 安装依赖(通常是 pip install -r requirements.txt)。
    2. 使用官方提供的示例脚本进行加载和推理:
    # 示例代码,具体请参考官方文档
    from qwen_vl_utils import Qwen2VL_VLChat
    model = Qwen2VL_VLChat('Qwen/Qwen2.5-VL-7B-Instruct', device='cuda')
    messages = [
        {
            'role': 'user',
            'content': [
                {'type': 'image', 'image': 'path/to/your/image.jpg'},
                {'type': 'text', 'text': '描述一下这张图片。'}
            ]
        }
    ]
    response = model.chat(messages)
    print(response)
    

2. 高性能推理/部署框架

这类框架专注于将模型优化并部署到生产环境,特别追求低延迟、高吞吐量。

a) vLLM
  • 描述:一个非常流行的高吞吐量推理引擎,核心特点是使用 PagedAttention 技术,极大地优化了内存使用和推理速度,尤其适合批量处理(batched inference)。
  • 优点:推理速度极快,尤其适合多用户并发访问的场景;与 transformers 的 API 兼容性好。
  • 缺点:主要专注于文本生成,对多模态(如图像)的支持可能不如 transformers 全面或需要特定版本。
  • 示例
    from vllm import LLM, SamplingParams
    
    # 加载模型 - 底层仍然使用 Hugging Face 的模型格式
    llm = LLM(model="Qwen/Qwen2.5-VL-7B-Instruct")
    
    prompts = [
        "<|im_start|>user\n<|im_end|>\n<|im_start|>assistant\n",
        "你好,请介绍一下你自己。"
    ]
    sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=128)
    
    outputs = llm.generate(prompts, sampling_params)
    for output in outputs:
        print(f"Prompt: {output.prompt}, Generated text: {output.outputs[0].text}")
    
b) ONNX Runtime
  • 描述:将模型转换为 ONNX 格式,然后使用 ONNX Runtime 进行推理。ONNX 是一个开放的模型标准,可以在不同的硬件和平台上获得高性能推理。
  • 优点:跨平台(Windows, Linux, Mac, ARM等),性能稳定,通常比原生 PyTorch 有加速;非常适合端侧部署(如手机、边缘设备)。
  • 缺点:需要将模型从 PyTorch/TensorFlow 转换为 ONNX 格式,转换过程可能遇到兼容性问题。
  • 示例:通常需要先使用 transformersoptimum(Hugging Face 的优化库)来导出模型。
    pip install optimum[onnxruntime]
    optimum-cli export onnx --model Qwen/Qwen2.5-7B-Instruct qwen2.5-7b-instruct-onnx/
    
    然后使用 ONNX Runtime 加载和推理。

3. 大模型服务框架

这类框架专注于提供标准化的 API 服务,将模型封装成类似 OpenAI API 的接口。

a) OpenAI-Compatible API(使用 FastChat, Ollama, LiteLLM 等)
  • 描述:通过框架启动一个本地 API 服务器,模型被加载到后台。然后你可以使用任何 HTTP 客户端或 OpenAI 官方 Python 库的格式来调用它。
  • 优点:标准化,与现有工具链(如 LangChain, LlamaIndex)无缝集成;方便做模型路由和代理。
  • 缺点:增加了网络开销,可能不适合对延迟极其敏感的本地应用。
  • 示例(以 Ollama 为例)
    1. 在 Ollama 中拉取并运行模型(Ollama 已内置了很多模型):
      ollama pull qwen2.5:7b
      ollama serve
      
    2. 使用 Python 调用:
      from openai import OpenAI
      
      client = OpenAI(
          base_url='http://localhost:11434/v1',
          api_key='ollama', # 占位符,ollama 不需要真正的 key
      )
      
      response = client.chat.completions.create(
          model="qwen2.5:7b",
          messages=[{"role": "user", "content": "为什么天空是蓝色的?"}]
      )
      print(response.choices[0].message.content)
      

总结与选择建议

方式适用场景核心优势
Hugging Face transformers快速实验、原型开发、研究人员易用性、灵活性、社区支持
原生态加载需要体验模型最新特性、深入研究模型机制最接近官方实现
vLLM生产环境、高并发 API 服务极高的推理吞吐量和效率
ONNX Runtime跨平台部署、边缘计算、资源受限环境跨平台一致性、稳定性能
API 服务框架构建应用、需要标准化接口、做模型管理标准化、易于集成

简单来说:

  • 如果你是初学者或正在进行研究实验继续使用 transformers 库是最好的选择
  • 如果你需要搭建一个可供多人同时访问的聊天服务或 APIvLLM 是毫无疑问的首选
  • 如果你需要将模型部署到手机、IoT 设备或其他非标准平台,应该研究 ONNX Runtime
  • 如果你只是想快速体验模型,或者你的应用框架(如 LangChain)偏好 OpenAI 格式,那么使用 Ollama 之类的工具会非常方便。

vLLM 在底层使用(并重度依赖)了 Hugging Face Transformers 库。

vLLM 并不是一个从零开始重写所有模型结构的框架,而是一个高性能的推理和服务引擎。它可以被看作是构建在 transformers 库之上的一个强大的“加速器和调度器”。

下面是它们之间关系的详细分解:

1. vLLM 如何使用 Transformers?

vLLM 利用 transformers 库来完成最基础、最核心的一件工作:加载模型权重和解析模型结构

  • 模型加载:当你执行 LLM(model="Qwen/Qwen2.5-VL-7B-Instruct") 时,vLLM 在后台会调用 transformersAutoModel.from_pretrained()AutoTokenizer.from_pretrained() 方法来从 Hugging Face Hub 或本地路径加载模型权重和分词器。这意味着它完全兼容 transformers 所支持的成千上万个模型。
  • 架构理解:vLLM 依赖于 transformers 中定义的各种模型类(如 QWen2ForCausalLM)来理解模型的层数、注意力头数、隐藏层维度等关键架构参数。

2. vLLM 的核心创新在哪里?

虽然 vLLM 使用 transformers 来加载模型,但它并没有直接使用 transformers 的推理生成逻辑(即 model.generate() 方法)。取而代之的是,vLLM 实现了自己的一套极其高效的推理机制,主要创新点包括:

  • PagedAttention:这是 vLLM 的王牌技术。它借鉴了操作系统内存管理中的“分页”思想,来解决 LLM 推理中 KV Cache 内存管理的关键瓶颈。传统方法(包括原生 transformers)在处理多个并发请求时,由于序列长度可变,会导致内存碎片化和大量浪费。PagedAttention 将 KV Cache 分成一块块的“页”,可以非连续地存储和管理,使得内存利用率大幅提升,从而能够同时处理非常多的请求(高吞吐量)。
  • 自定义的调度器:vLLM 有一个高效的调度器,负责管理来自不同用户的多个请求,将它们批处理在一起,然后利用 PagedAttention 高效地执行前向计算。
  • 优化的内核:vLLM 实现了一些高度优化的 CUDA 内核(特别是用于 PagedAttention 的内核),以最大化 GPU 的利用效率。

一个简单的比喻

你可以这样理解它们的关系:

  • Transformers 库就像一个汽车制造商(如丰田、大众)

    • 它负责设计和生产汽车的各个部件(发动机、底盘、车身),并把它们组装成一辆完整的、可以驾驶的汽车(AutoModel)。
    • 这辆车本身就能开,但可能不是为赛车或极端路况设计的。
  • vLLM 就像一个顶级的赛车改装团队和赛车队

    • 他们从制造商那里买来市售的汽车(使用 transformers 加载模型)。
    • 但他们不会直接用这辆车去比赛。他们会:
      1. 拆掉原厂的发动机控制系统和变速箱(替换掉 transformers 的生成逻辑)。
      2. 装上自己研发的高性能ECU、变速箱和悬挂系统实现 PagedAttention 和自定义调度器)。
      3. 由顶级的赛车手和策略团队来驾驶和指挥(高效的调度和批处理)。
    • 最终,这辆车在赛道上(生产环境)的表现(吞吐量、并发能力)远超原厂车型。

总结

特性Hugging Face TransformersvLLM
核心目标易用性、灵活性、模型支持广度极致的高吞吐量推理性能
模型加载直接加载依赖 Transformers 来加载
推理逻辑使用自己的 generate() 方法使用自研的 PagedAttention 和调度器
最佳场景实验、研究、单次推理、原型开发生产环境、高并发 API 服务

所以,vLLM 和 Transformers 不是竞争关系,而是互补和增强关系。vLLM 站在 transformers 这个巨人的肩膀上,专注于解决其在大规模部署时遇到的性能瓶颈问题。你既享受了 transformers 庞大的模型生态系统,又获得了 vLLM 带来的巨大性能提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值