一、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 为例):
- 克隆官方仓库:
git clone https://github.com/QwenLM/Qwen2.5-VL.git cd Qwen2.5-VL- 按照仓库的
README.md安装依赖(通常是pip install -r requirements.txt)。 - 使用官方提供的示例脚本进行加载和推理:
# 示例代码,具体请参考官方文档 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 格式,转换过程可能遇到兼容性问题。
- 示例:通常需要先使用
transformers和optimum(Hugging Face 的优化库)来导出模型。
然后使用 ONNX Runtime 加载和推理。pip install optimum[onnxruntime] optimum-cli export onnx --model Qwen/Qwen2.5-7B-Instruct qwen2.5-7b-instruct-onnx/
3. 大模型服务框架
这类框架专注于提供标准化的 API 服务,将模型封装成类似 OpenAI API 的接口。
a) OpenAI-Compatible API(使用 FastChat, Ollama, LiteLLM 等)
- 描述:通过框架启动一个本地 API 服务器,模型被加载到后台。然后你可以使用任何 HTTP 客户端或 OpenAI 官方 Python 库的格式来调用它。
- 优点:标准化,与现有工具链(如 LangChain, LlamaIndex)无缝集成;方便做模型路由和代理。
- 缺点:增加了网络开销,可能不适合对延迟极其敏感的本地应用。
- 示例(以 Ollama 为例):
- 在 Ollama 中拉取并运行模型(Ollama 已内置了很多模型):
ollama pull qwen2.5:7b ollama serve - 使用 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)
- 在 Ollama 中拉取并运行模型(Ollama 已内置了很多模型):
总结与选择建议
| 方式 | 适用场景 | 核心优势 |
|---|---|---|
Hugging Face transformers | 快速实验、原型开发、研究人员 | 易用性、灵活性、社区支持 |
| 原生态加载 | 需要体验模型最新特性、深入研究模型机制 | 最接近官方实现 |
| vLLM | 生产环境、高并发 API 服务 | 极高的推理吞吐量和效率 |
| ONNX Runtime | 跨平台部署、边缘计算、资源受限环境 | 跨平台一致性、稳定性能 |
| API 服务框架 | 构建应用、需要标准化接口、做模型管理 | 标准化、易于集成 |
简单来说:
- 如果你是初学者或正在进行研究实验,继续使用
transformers库是最好的选择。 - 如果你需要搭建一个可供多人同时访问的聊天服务或 API,vLLM 是毫无疑问的首选。
- 如果你需要将模型部署到手机、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 在后台会调用transformers的AutoModel.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加载模型)。 - 但他们不会直接用这辆车去比赛。他们会:
- 拆掉原厂的发动机控制系统和变速箱(替换掉
transformers的生成逻辑)。 - 装上自己研发的高性能ECU、变速箱和悬挂系统(实现 PagedAttention 和自定义调度器)。
- 由顶级的赛车手和策略团队来驾驶和指挥(高效的调度和批处理)。
- 拆掉原厂的发动机控制系统和变速箱(替换掉
- 最终,这辆车在赛道上(生产环境)的表现(吞吐量、并发能力)远超原厂车型。
- 他们从制造商那里买来市售的汽车(使用
总结
| 特性 | Hugging Face Transformers | vLLM |
|---|---|---|
| 核心目标 | 易用性、灵活性、模型支持广度 | 极致的高吞吐量推理性能 |
| 模型加载 | 直接加载 | 依赖 Transformers 来加载 |
| 推理逻辑 | 使用自己的 generate() 方法 | 使用自研的 PagedAttention 和调度器 |
| 最佳场景 | 实验、研究、单次推理、原型开发 | 生产环境、高并发 API 服务 |
所以,vLLM 和 Transformers 不是竞争关系,而是互补和增强关系。vLLM 站在 transformers 这个巨人的肩膀上,专注于解决其在大规模部署时遇到的性能瓶颈问题。你既享受了 transformers 庞大的模型生态系统,又获得了 vLLM 带来的巨大性能提升。
1532

被折叠的 条评论
为什么被折叠?



